質問

空のスプレッドシートを持っていますが、Apache POI(バージョン3.10)でアクセスしているとき、それはそれが1024列と20の物理カラムを持っていると言います。
私は本当にすべてのセルを削除し、いくつかのフォーマットのみが残っていますが、コンテンツはありません。
また、LibreOffice Calc(バージョン4.1.3.2)でいくつかの列を削除した場合、のみが増えている!何が起こっているのですか?
実数の列(または行のセル)を取得するための信頼できる方法はありますか?

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());
    }
}
.

役に立ちましたか?

解決

もう少し調査後、私が何が起こっているのかを考え出したと思います。

最初のPOIからのいくつかの用語:スプレッドシートの全く存在しないセルがいくつかあります - それらは欠落、または未定義 /定義されていない。その後、定義されているが値がないいくつかのセルがあります - それらは空白セルと呼ばれます。両方の種類のセルがスプレッドシートプログラムで空のように見え、視覚的には区別できません。

マイスプレッドシートには、LibreOfficeが行の最後(おそらくバグ)に追加されたいくつかの空白のセルがあります。列を削除すると、LibreOfficeは後続のセル(空白を含む)を左にシフトし、最後に空白のセルを追加します(最大1024)。

と今キー部分:getLastCellNum()getPhysicalNumberOfCells()もブランクセルを無視しません。 getLastCellNum()は最後の定義されたセルを与え、getPhysicalNumberOfCells()はブランクセルを含む定義済みのセルの数を与えます。空白のセルをスキップする方法はありません。 getPhysicalNumberOfCells()用のJavadocはやや誤解を招くことです - "列0,4,5のみが値が3"になるが、実際には空白のセルもカウントされています。

だから私が見つけた唯一の解決策はセルをループし、それらが空白のかどうかを確認することです。

サイド注:getLastRowNum()getFirstCellNum()は0ベースですが、getLastCellNum()は1ベースのWTF?

です。

他のヒント

あなたはあなたが行に適用されるいくつかの種類のフォーマットを持っている可能性があります。私はExcelで作成された空のXLSXファイルを持っていて、Method getRowは空の行に対してnullを生成します。

@ADITSU https://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/row.html 、getLastCellNum()この行に含まれる最後のセルのインデックスを1つに取得します。

LibreOffice Strugleの

+1!それはバグです、そして私の意見では非常にランダムです。私はランダムにNULLを取得し、空の行(Bellow)と空の列(右側)を削除するのであれば、よく役立ちます。 ...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top