Son*_*nal 0 java excel apache-poi xssf
我使用下面的代码从XLSX文件中获取日期值.对于某些xlsx文件,这是完全正常的.但它没有提供xlsx文件中的确切日期格式.此问题适用于某些文件.
例如; 我有这样的约会,21/01/2016 (dd/mm/yyyy)
但在阅读之后,它给出了日期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);
}
Run Code Online (Sandbox Code Playgroud)
如果包含日期的单元格被格式化为默认日期格式(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",需要知道确切的Windows系统设置Region and Language.
因此,如果不知道系统的语言环境设置,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);
}
Run Code Online (Sandbox Code Playgroud)
要明确:这一切都只有numFmtId="14" cell.getCellStyle().getDataFormat() == 14.所有其他日期格式都有明确的数据格式字符串cell.getCellStyle().getDataFormatString(),因此POI可以像在Excel中一样显示它们.
请参阅POI DataFormatter返回2位数年份而不是4位数年份的日期单元格,以了解如何使用DataFormatter此方法解决此问题.