如果其是包含日期的單元格,被格式化作爲默認日期格式(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
中確切的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中一樣顯示它們。
@AxelRitcher感謝這個有用的信息。我正在尋找它,但沒有得到任何解釋。 – Sonal
@AxelRitcher您的解決方案奏效。謝謝。但還有一個問題。有什麼方法可以從excel中獲得現有的格式或閱讀日期嗎? – Sonal
「是否有任何方法獲得現有的格式或閱讀日期,因爲它是從excel?「不,如果日期格式爲'numFmtId =」14「',並且我們不知道Excel正在運行的Windows系統的」區域和語言「設置 –