2016-01-20 70 views
0

我正在使用下面的代碼從XLSX文件中獲取日期值。這對某些xlsx文件絕對正常。但它沒有給出在xlsx文件中的確切日期格式。這個問題是針對某個文件的。Excell Cell Style問題

例如;我有這樣的日期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); 

} 

回答

4

如果其是包含日期的單元格,被格式化作爲默認日期格式(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設置中設置:

enter image description here

在英語大不列顛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中一樣顯示它們。

+0

@AxelRitcher感謝這個有用的信息。我正在尋找它,但沒有得到任何解釋。 – Sonal

+0

@AxelRitcher您的解決方案奏效。謝謝。但還有一個問題。有什麼方法可以從excel中獲得現有的格式或閱讀日期嗎? – Sonal

+0

「是否有任何方法獲得現有的格式或閱讀日期,因爲它是從excel?「不,如果日期格式爲'numFmtId =」14「',並且我們不知道Excel正在運行的Windows系統的」區域和語言「設置 –