POI-HSSF的一些疑難問題及解決方式

poplarbbs發表於2009-08-31
[b] * 圖片位置無法獲取[/b]

The only linkage I can find is that there is an EscherProperty called "BLIP__BLIPTODISPLAY", which is inside the EscherOptRecord of each image.
參考:
http://www.nabble.com/Copy-images-from-Workbook-to-Workbook-td23032425.html#a24303124
http://www.nabble.com/Get-image-binary-data-in-Excel-worksheet-with-known-filename-cell-location-td24413607.html

[b] * 圖片 binary data index 錯亂問題[/b]

這是由於 Excel 中將圖片刪除,其後的序列不會向前推進。於是就有了一個序列的空缺,此處還是有 BSE 的,只是 Blip 為 null。而 HSSFWorkbook 中的 getAllPictures() 中為了維護 BSE 的可用性,將 Blip 為 null 的資訊過濾掉了。於是造成了 index 的混亂。
參考:
http://www.nabble.com/Get-image-binary-data-in-Excel-worksheet-with-known-filename-cell-location-td24413607.html

[b] * 圖片 binary data 大量冗餘[/b]

此處我改寫了 PictrueData 中的 equals 方法,用以對比 blip 的 byte 陣列。不過貌似不是必需的。

[b] * 為什麼圖片還是對不上[/b]

由於Collection的序號是從0開始,獲取到的index需要-1才能對應到正確的圖片。

[b] * 為什麼是 blip 卻沒有 ancher[/b]

有可能圖片屬於某個 Graph Group 或者其他什麼鬼東西,所以自己沒有 ancher 只有 offset 。我實在 EscherContainerRecord 和 ShapeInfomation 中都增加 parent ,從 上層查詢 ancher。
[b]
* WARNING: 78 bytes remaining but no space left
[/b]
這是由於 EscherAggregate.createAggregate 時從 records 裡面取出的內容比 xls 中標記的長度要短。此處通常是因為在生成 chart 之後插入圖片,此時丟失了這部分圖片的資訊。大多數情況下刪除 chart 可以重新提取到這部分資訊。
[b]
* Chart 插入後的結構是怎樣的[/b]

可以參考本文,這是理想中的結構,可以跳過 Chart 進行解析。但很多時候並不是這樣。
http://mail-archives.apache.org/mod_mbox/poi-user/200401.mbox/%3CNFBBJLHLDKIEPKFLMKJDEEICCHAA.zalewski@optonline.net%3E

[b] * 中文日期為什麼會被處理為數字[/b]

設定了中文日期格式的不會,手動輸入識別的會被識別成數字。因為其 DataFormat 識別碼在英文 Excel中沒有,分別是0x1f 和 0x39 ,而字串分別是 0x1f 和 null 。需要特殊處理。

相關文章