问题
I am using below code to get date value from XLSX file. This is working absolutely fine for some xlsx file. But It is not giving exact date format which is in xlsx file. This issue is for some file.
eg; I have date like this 21/01/2016 (dd/mm/yyyy)
but after reading, it gives date as 01/21/16(mm/dd/yy)
Is there any other way to get cellstyle?
Is it issue of xlsx file??
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);
}
回答1:
If the cell, which is containing the date, is formatted as the default date format (Short Date
), then only the format id 0xE (14) is stored in the file. See https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/BuiltinFormats.html. The *.xlsx
file contains only
<xf numFmtId="14" ... applyNumberFormat="1"/>
in styles.xml
. There is no special formatCode
saved for this numFmtId
.
So how this will be displayed in Excel
depends on the locale settings of the system.
For example with my German Windows system the numFmtId="14"
will be displayed as TT.MM.JJJJ
as is set in Region and Language
settings:
In English Great Britain Windows systems this will be DD/MM/YYYY
per default.
But if you change the setting for Short Date
in the system settings, to JJJJ-MM-TT
for example, then this format will also displayed in Excel with the numFmtId="14"
.
So to know how exactly Excel will display the date with the numFmtId="14"
, one needs to know the exact Windows system settings in Region and Language
.
So also apache POI can't know how this should be displayed without knowing the locale settings of the system, since the file contains no infomation about this. So it will assume en-us
locale. This leads to m/d/yy
for date.
You could check if the format id 14 is used and if so define your own default date format.
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);
}
To be clear: This all is only with numFmtId="14"
cell.getCellStyle().getDataFormat() == 14
. All other date formats will have explicit data format strings cell.getCellStyle().getDataFormatString()
and so POI can display them exactly like in Excel.
See POI DataFormatter returns 2 digits year instead of 4 digits year for date cells for how to use DataFormatter
to work around this issue.
来源:https://stackoverflow.com/questions/34900605/excel-cell-style-issue