我使用下面的代码从XLSX文件中获取日期值。这对于某些xlsx文件来说非常好。但它没有提供xlsx文件中的确切日期格式。此问题适用于某些文件。
例如;我有这样的日期pstomo_eq
但在阅读之后,它会将日期设为21/01/2016 (dd/mm/yyyy)
还有其他方法可以获得cellstyle吗?
是xlsx文件的问题吗?
01/21/16(mm/dd/yy)
答案 0 :(得分:6)
如果包含日期的单元格被格式化为默认日期格式(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"
显示日期,需要知道Region and Language
中确切的Windows系统设置。
因此,如果不知道系统的区域设置,apache POI也不知道应该如何显示,因为该文件不包含此信息。所以它将假设en-us
区域设置。这导致约会m/d/yy
。
您可以检查是否使用了格式ID 14,如果是,请定义您自己的默认日期格式。
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
。所有其他日期格式都有明确的数据格式字符串cell.getCellStyle().getDataFormatString()
,因此POI可以像在Excel中一样显示它们。
有关如何使用DataFormatter
解决此问题的问题,请参阅POI DataFormatter returns 2 digits year instead of 4 digits year for date cells。