在poi中,我們可以通過workbook, sheet, row, cell 物件分別對應excel檔案、工作表、行、單元格。
在poi的使用中,我遇到了幾個非常詭異、捉摸不透的問題,現在記錄下來。
1、關於sheet、row、cell的下標
一般情況下,我們讀取乙個excel**是這樣的:
workbook workbook = workbookfactory.create(file);sheet sheet = workbook.getsheetat(0);
row row = sheet.getrow(0);
cell cell = row.getcell(0);
在poi的api中,sheet(工作表)、row(行)、cell(單元格)都是從0開始的。
2、關於getphysical*()、getlast*num()方法
sheet.getphysicalnumberofrows(); //獲取此工作表中有效定義的行
row.getphysicalnumberofcells(); //獲取此行中有效的單元格數
sheet.getlastrownum(); //獲取最後一行非null行的行下標
row.getlastcellnum(); //獲取最後乙個非null單元格的列下標,並加上1(所以雖然列是從0開始的,但是這裡得到的值是下標+1,需要注意)
getphysical*()方法是指獲取有效定義的行數或列數,算的是乙個數目。這裡的有效定義是指只要你曾經對此行或此單元格進行過操作,無論是格式上的操作還是資料上的操作,那麼這以行或列就是有效的。
我修改a2單元格的單元格格式為文字,那麼a2單元格對於poi來說就是已定義的單元格,無論之後對a2做什麼操作都不會改變這個事實。又如我對a2單元格賦值,此時a2單元格就是已定義的單元格,即使我之後清除a2單元格的值,但a2還是已定義的單元格。
所以getphysical*()方法可能會得到的行或單元格可能沒有資料。
而getlast*num()方法是獲取最後乙個非null的行(單元格)下標,算的是下標。它前面有可能行或單元格有可能是null的,也就是不存在的。如:
null 1 null 2 3 null null 那麼getlastcellnum 獲取到的值就是5(列從1算起)
例如:下圖表是乙個4*4的excel**資料
1 "" 3 4
null null null 3
null null null null
3 null 3 null
那麼sheet.getphysicalnumberofrows() = 3,因為雖然有4行,但是第3行全部是null,因此這一行是未定義的,所以只有3行。
sheet.getlastrownum() = 3,最後以列非null行的行下標是第4行,即下標為3的行。
row.getphysicalnumberofcells() 第1行,有效單元格數是4。第2行中,只有第4個單元格是有效的,因此有效單元格數是1。第3行有效單元格是0,第4行有效單元格數是2。
row.getlastcellnum() 第1行中,值為4(下標為3,加1後值為4)。第2行,值為4。第3行,值為-1。第4行,值為3。(第3行沒有任何有效的單元格,所以返回-1)
poi對excel操作筆記
poi是apache提供的乙個讀寫excel文件的開源元件,在操作excel時常要合併單元格,合併單元格的方法是 sheet.addmergedregion new cellrangeaddress 1,1,0,2 自適應列寬度 sheet.autosizecolumn 1 sheet.autosi...
poi生成excel開發難點總結
1.設定不顯示excel網格線 sheet.setdisplaygridlines false 其中sheet是sheet物件 2.設定excel單元格中的內容換行 cellstyle.setwraptext true 其中cellstyle是workbook建立的cellstyle物件,然後將ce...
使用POI操作Excel
apache的jakata專案poi http poi.apache.org 用來操作excel,並能滿足大部分需要.poi下面有幾個子專案,其中hssf xssf專案 http poi.apache.org spreadsheet index.html 用來實現excel讀寫的.public st...