Excell细胞样式问题

我使用下面的代码从XLSX文件中获取date值。 这对于一些xlsx文件来说工作得非常好。 但它没有给出确切的date格式,这是在xlsx文件。 这个问题是针对某个文件的。

例如; 我有这样的date21/01/2016 (dd/mm/yyyy)但是在阅读之后,它给出date为01/21/16(mm/dd/yy)

有没有其他的方式来获得cellstyle?

是xlsx文件的问题?

 String dateFmt = cell.getCellStyle().getDataFormatString(); if (DateUtil.isCellDateFormatted(cell)) { double val = cell.getNumericCellValue(); Date date = DateUtil.getJavaDate(val); String dateFmt = cell.getCellStyle().getDataFormatString(); System.out.println("dateFmt "+dateFmt); value = new CellDateFormatter(dateFmt).format(date); System.out.println("Date "+value); } 

如果包含date的单元格被格式化为默认date格式( Short Date ),则只有格式id 0xE(14)存储在文件中。 请参阅https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/BuiltinFormats.html*.xlsx文件仅包含

<xf numFmtId="14" ... applyNumberFormat="1"/>

styles.xml 。 没有formatCode保存特殊的numFmtId

那么如何在Excel显示这取决于系统的区域设置。

例如对于我的德语Windows系统, numFmtId="14"将显示为TT.MM.JJJJ如在“ Region and Language设置中所设置的那样:

在这里输入图像说明

在英国英国的Windows系统中,默认情况下是DD/MM/YYYY

但是,如果在系统设置中将Short Date的设置更改为JJJJ-MM-TT ,则此格式也将在Excel中显示,其中numFmtId="14"

因此,要知道Excel如何显示带有numFmtId="14"的date,需要知道Region and Language确切的Windows系统设置。

所以也apache的POI无法知道如何不知道系统的区域设置显示,因为该文件不包含有关这个信息。 所以它会假定en-us语言环境。 这导致datem/d/yy

您可以检查是否使用格式ID 14,如果是这样定义您自己的默认date格式。

  if (DateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); System.out.println(date); String dateFmt = ""; if (cell.getCellStyle().getDataFormat() == 14) { //default short date without explicit formatting dateFmt = "dd/mm/yyyy"; //default date format for this } else { //other data formats with explicit formatting dateFmt = cell.getCellStyle().getDataFormatString(); } System.out.println("dateFmt " + dateFmt); String value = new CellDateFormatter(dateFmt).format(date); System.out.println("Date " + value); } 

要清楚:这一切只与numFmtId="14" cell.getCellStyle().getDataFormat() == 14 。 所有其他date格式将具有明确的数据格式stringcell.getCellStyle().getDataFormatString() ,所以POI可以像在Excel中一样显示它们。