POI獲取excel的使用建議

問題來源

一開始,爲了跟別人的舊系統實現遠程對接,藉助excel來作爲中介,來導入到新的庫裏。而主力就是大名鼎鼎的POI,優秀的讀EXCEL組件。

主要建議

  • 若引用jar包後仍出錯,請注意Xmlbeans是否有加載,沒有請下載,這是因爲POI內部會將表解析成xml格式,必須用到這個包。
  • 注意HSSF和XSSF的區別:HSSF用於xls(即舊版),XSSF用於xlsx(即新版)。
  • 合理利用各類get方法:在明確類型的值中使用get系列方法,很快捷方便,但若不明確是數值還是字符,會容易出現類型轉換出錯的情況,這種情況較建議使用toString(),或自定義。

  • 留意單元格里有公式的情況:


出現這種情況,使用普通的toString()或類似方法會得到,I7,這是因爲公式元素位於值元素之上,普通的cell讀取會讀取第一層。層結構如圖。

很明顯,讀取J6單元格時,cell讀取第一個子元素,若存在公式會遮擋值,不利於我們的需求(當然你主要是拿公式則另說)。這時候合理的方法應該是:
yourXSSFRow.getCell(index).getCTCell().getV()
getCTCell()就是獲取最基本的xml,通過xml來找到這個值,很明顯,值的標籤是<v>,所以後面跟了個getV()。
注意:不要什麼時候都用getV(),若是非數字型,它會給你匹配成數字。因爲xml裏字符的表示不一定準確。如下圖,A-E其實都是字符串,但xml卻讀成數字,所以要注意。

  • 空值的判斷:主要使用到CELL的類型常量(其他類型的判斷也可以如法炮製)
yourRow.getCell(index)!=null && yourRow.getCell(index).getCellType!=CELL.CELL_TYPE_BLANK
  • 刪除行方法:用ShiftRows而不用其他方法,因爲只有ShiftRows是直接替換,而其他還是會保留空白行。(即是將你要保留的行範圍上升替換)
特別注意:用得過多會有bug,注意在try中運行
sheet.shiftRows(最後刪行+1,lastRowNum,-刪除的跨度);//注意第一個參數不要大於第二個參數,否則會有超限錯誤



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章