2012-01-19 44 views
3

由於xlsx文件可能包含百萬行,因此我決定使用poi事件模型,例如here(ExampleEventUserModel),但發現某些問題解析日期格式單元格。解析大型xlsx文件,日期格式大小寫

比如我在小區A15的excel日期2011年1月10日,但XML有:

<c r="A15" s="11"><v>40817</v></c> 

這不是日期格式,甚至沒有以毫秒爲例子。

如何解析事件模型的日期?

此致敬禮。

回答

4

Excel將日期存儲爲固定起點的浮點數(天和小數部分)。值40817是天數,從起點至1 2011年10月

POI的HSSFCellgetDateCellValue()方法返回一個Java Date,並會做你想做的。

+0

另外,如何獲得這個單元格是日期格式,它沒有「t」屬性,或s =「11」意味着它是日期? –

+2

's ='屬性是一個樣式引用。請參閱http://stackoverflow.com/questions/3154646 –

3

關於如何確定單元格是否包含日期值的後續問題,答案是沒有任何簡單的方法。

單元格<c>元素具有類型屬性t,但它不用於此Excel序列日期類型。因此,區分包含日期編碼爲40817的單元格和值爲40817的單元格的唯一方法是應用於編號(通過s單元屬性引用)的格式。

爲了確定這種格式,您將不得不查找相關styles.xml中引用樣式xfnumFmtId屬性,並嘗試確定該格式是否爲日期格式。而爲了做到這一點,你將不得不應用一些啓發式。

總而言之,如果您希望將日期與其他數字數據區分開來,並且對我來說這是一個SpreadsheetML格式的疏漏,那麼這是一個巨大的痛苦。

P.S. OOXML標準確定了t類型屬性的d日期值,但該值僅用於實際上不由Excel生成的ISO 8601日期。 (更新:此日期格式現在在嚴格模式下在Excel 2013中使用)。