2014-02-27 75 views
0

我有一個空的電子表格,但是當我使用Apache POI(版本3.10)訪問它時,它說它有1024列和20個物理列。
我真的刪除了所有單元格,只剩下一些格式,但沒有內容。
如果我用LibreOffice Calc(版本4.1.3.2)刪除一些列,列數只有增加!這是怎麼回事?
有沒有一種可靠的方法來獲得實際的列數(或一行中的單元格)?Apache POI在空電子表格中看到列?

import java.net.URL; 
import org.apache.poi.ss.usermodel.*; 

public class Test { 
    public static void main(final String... args) throws Exception { 
     final URL url = new URL("http://aditsu.net/empty.xlsx"); 
     final Workbook w = WorkbookFactory.create(url.openStream()); 
     final Row r = w.getSheetAt(0).getRow(0); 
     System.out.println(r.getLastCellNum()); 
     System.out.println(r.getPhysicalNumberOfCells()); 
    } 
} 
+0

你怎麼沒有使用XSSF包?嘗試使用它來讀取xlsx。 – anonymous

+0

據我所知,具有格式化的單元格被初始化,並且具有該樣式的列也是相同的。 – crzbt

+2

@anonymous WorkbookFactory是訪問電子表格的首選方式。它根據需要在內部使用XSSF或HSSF。 – aditsu

回答

2

經過一番更多的調查,我想我找出了發生了什麼。

首先,一些術語從POI:有一些細胞實際上並不存在於所有的電子表格 - 那些被稱爲缺少,或未定義 /沒有定義。然後有一些細胞被定義,但沒有價值 - 這些細胞被稱爲空白細胞。這兩種單元格在電子表格程序中都顯示爲空,並且無法在視覺上進行區分。

我的電子表格有一些LibreOffice在行尾添加的空白單元格(可能是一個bug)。當我刪除列時,LibreOffice似乎將後續單元格(包括空白單元格)向左移動,並在末尾添加更多空白單元格(最多1024個)。

現在關鍵部分:getLastCellNum()getPhysicalNumberOfCells()都不會忽略空白單元格。 getLastCellNum()給出最後的定義的單元格,並且getPhysicalNumberOfCells()給出定義單元格的的數目,兩者都包括空白單元格。似乎沒有任何方法可以跳過空白單元格。對於getPhysicalNumberOfCells()的javadoc有些誤導 - 「如果只有列0,4,5有值,那麼會有3」,但它實際上也是對空白單元格進行計數,這些空單元格並沒有真正的值。

所以我找到的唯一解決方案是循環遍歷單元格並檢查它們是否爲空。

附註:getLastRowNum()getFirstCellNum()是基於0的,但是getLastCellNum()是基於1的,wtf?

1

很可能你有一些適用於你的格式化行。我有一個用excel創建的空xlsx文件,方法getRow爲空行生成空值。

+0

您可以檢查我的文件。是的,我可能有一些格式化,那麼是什麼?應該仍然有辦法獲得正確的列數。 – aditsu

+0

對不起,我沒有注意到它的在線 – zibi

+0

看來,在你的第0行中,只有幾個具有某種狀態的單元格,那些是1004-1023,不知道它是什麼。 – zibi

相關問題