POI 操作Excel疑難點筆記

2022-01-10 16:02:45 字數 1714 閱讀 7673

在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...