首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache :如何基于Java dataFormat设置单元格的dataFormat

Apache :如何基于Java dataFormat设置单元格的dataFormat
EN

Stack Overflow用户
提问于 2019-09-03 16:59:38
回答 1查看 2.7K关注 0票数 2

我需要使用主机操作系统上指定的格式将日期和时间数据导出到Excel。

我发现在Java中获得这种格式的唯一方法是使用DateTimeFormatter。然后,我需要使用Apache设置Excel单元的数据格式。我该怎么做?

要在setDataFormat中获得CellStyle方法的数据格式,我必须有一个格式字符串(或者一个简短的表示构建类型的字符串),但是我不能从DateTimeFormatter中获取一个字符串模式。有什么办法让这个转变吗?

代码语言:javascript
复制
final SXSSFWorkbook workbook;
final CellStyle style;
final DataFormat formatFactory;

style = workbook.createCellStyle();
DateTimeFormatter format = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT); //Format depends on local settings on client machine

style.setDataFormat(formatFactory.getFormat(format)); //Doesn't work
EN

回答 1

Stack Overflow用户

发布于 2019-09-03 18:06:59

可以使用java.text.DateFormat实现这一要求,如下所示:

代码语言:javascript
复制
DateFormat format = DateFormat.getDateTimeInstance(
                     DateFormat.SHORT, DateFormat.SHORT,
                     Locale.getDefault());
String pattern = ((SimpleDateFormat)format).toPattern();
System.out.println(pattern);

或者像这样使用java.time.format.DateTimeFormatterBuilder

代码语言:javascript
复制
String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
                  FormatStyle.SHORT, FormatStyle.SHORT, 
                  Chronology.ofLocale(Locale.getDefault()),
                  Locale.getDefault());
System.out.println(pattern);

在这两种情况下,都需要转换模式以便在Excel中使用DateFormatConverter,如下所示:

代码语言:javascript
复制
pattern = DateFormatConverter.convert(Locale.getDefault(), pattern);
System.out.println(pattern);

完整的例子:

代码语言:javascript
复制
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.DateFormatConverter;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.util.Date;
import java.util.Locale;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.FormatStyle;
import java.time.chrono.Chronology;

class CreateExcelCellDateFormat {

 public static void main(String[] args) throws Exception {

  //Locale.setDefault(new Locale("en", "US"));

  System.out.println(Locale.getDefault());

  String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
   FormatStyle.SHORT, FormatStyle.SHORT, 
   Chronology.ofLocale(Locale.getDefault()), Locale.getDefault());
  System.out.println(pattern);

/*
  DateFormat format = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.getDefault());
  String pattern = ((SimpleDateFormat)format).toPattern();
  System.out.println(pattern);
*/

  pattern = DateFormatConverter.convert(Locale.getDefault(), pattern);
  System.out.println(pattern);

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   CellStyle style = workbook.createCellStyle();
   style.setDataFormat(workbook.createDataFormat().getFormat(pattern));

   Sheet sheet = workbook.createSheet();
   Cell cell = sheet.createRow(0).createCell(0);
   cell.setCellStyle(style);
   cell.setCellValue(new Date());

   sheet.setColumnWidth(0, 25 * 256);

   workbook.write(fileout);
  }

 }
}

但是,如果真正的要求是创建一个Excel工作簿,该工作簿显示依赖于Excel应用程序运行的用户区域设置的日期时间值,那么这一切都是不必要的。然后使用BuiltinFormats 0xe,短日期使用"m/d/yy“,对于短日期使用"m/d/yy :mm”。

示例:

代码语言:javascript
复制
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

class CreateExcelCellDateFormatUserLocale {

 public static void main(String[] args) throws Exception {

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   CellStyle style = workbook.createCellStyle();
   //style.setDataFormat((short)14); //0xe, "m/d/yy"
   style.setDataFormat((short)22); //0x16, "m/d/yy h:mm"

   Sheet sheet = workbook.createSheet();
   Cell cell = sheet.createRow(0).createCell(0);
   cell.setCellStyle(style);
   cell.setCellValue(new java.util.Date());

   sheet.setColumnWidth(0, 25 * 256);

   workbook.write(fileout);
  }

 }
}

该代码生成一个Excel文件,该文件显示与Excel完全依赖于Excel 应用程序运行的区域设置的日期时间。在德国,它显示了dd.MM.yyyy hh:mm。对于我们,它显示MM/dd/yy :MM/PM。在英国,它显示dd/MM/yyyy :mm。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57775978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档