Excel 单元格样式问题
Excel Cell Style issue
我正在使用以下代码从 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);
}
如果包含日期的单元格被格式化为默认日期格式 (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
中。没有为此numFmtId
保存特殊formatCode
。
那么在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
.[=36 中的确切 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
解决此问题。
我正在使用以下代码从 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);
}
如果包含日期的单元格被格式化为默认日期格式 (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
中。没有为此numFmtId
保存特殊formatCode
。
那么在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
.[=36 中的确切 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
解决此问题。