Apache POIdate区域设置问题

不使用Apache POI(例如,您手动生成xml来创build电子表格),您可以使用设置一个css类

mso-number-format: "General Date" 

要么

 mso-number-format: "Short Date" 

使用Apache POI这似乎是不可能的,你被locking在使用一个单一的定义date格式,它总是依赖于物理服务器的地区或硬编码的一些值,而不是像上面的客户端操作系统区域设置。

这里是我的代码现在,用户打在美国的服务器,但住在另一个国家希望看到date在他们的语言环境,所以这是不好的

  protected CellStyle getDateCellStyle(SXSSFWorkbook wb) { CellStyle style = wb.createCellStyle(); style .setDataFormat(wb.getCreationHelper().createDataFormat().getFormat("MM/dd/yyyy")); return style; } 

本质上我想用“短date”或“一般date”replace“MM / dd / yyyy”,但这些选项不起作用。 有人有主意吗? 我不能根据服务器所在的位置来获取语言环境,因为另一个国家可能会触及它(所以我不能像其他答案中提到的那样在Java src中获取语言环境)。

有人以前处理过?

在Excel中有一些内置的数据格式没有明确的数据格式string。 其中之一是数字格式ID为14的“date”。

如何在Excel中显示此格式取决于Excel语言版本和Windows系统的区域设置。 一个en_US Excel将显示m/d/yy 。 en_GB Excel将显示dd/mm/yyyy 。 一个de_DE Excel将显示dd.mm.yyyy

所以,如果这是需要,那么使用

 style.setDataFormat((short)14); 

还有更多内置的数字格式。 请参阅https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/BuiltinFormats.html 。 但是并不是所有的语言版本都适用于所有的Excel版本。 但是,默认的货币格式(5,6,7,8)也将主要工作。

例:

 import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; class BuiltInFormats { public static void main(String[] args) { try { Workbook wb = new XSSFWorkbook(); CellStyle builtInShortDate = wb.createCellStyle(); builtInShortDate.setDataFormat((short)14); CellStyle builtInCurrency = wb.createCellStyle(); builtInCurrency.setDataFormat((short)8); Sheet sheet = wb.createSheet(); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue(new java.util.Date()); cell.setCellStyle(builtInShortDate); row = sheet.createRow(1); cell = row.createCell(0); cell.setCellValue(1234.56); cell.setCellStyle(builtInCurrency); FileOutputStream os = new FileOutputStream("BuiltInFormats.xlsx"); wb.write(os); os.close(); } catch (IOException ioex) { } } } 

您可以从请求中获取用户(broswer's)的区域设置,而不是从服务器获取。

当你有用户区域时,你可以使用DateFormatConverter转换成Excel格式:

 final DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale) final String pattern = DateFormatConverter.convert(locale, dateFormat); final short excelFormat = createHelper.createDataFormat().getFormat(pattern); 

编辑:通常的方式来处理客户端区域设置是(AFAIK):

  • 使用JavaScript检测浏览器语言环境(例如,请参阅本文 ),然后转换为等效的“java” Locale (又名难题
  • 公开某种方式让用户select它的语言环境(小的可点击的标志,首选项屏幕等,例如,看这个 ),并使用它来设置用户“java” Locale 。 (首选的方式,如果你需要国际化)

尝试设置区域设置

 MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this); formatListener = new FormatTrackingHSSFListener(listener, Locale.UK);