空のスプレッドシートで列を見るApache Poi?
-
23-12-2019 - |
質問
空のスプレッドシートを持っていますが、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)と空の列(右側)を削除するのであれば、よく役立ちます。 ...