web-dev-qa-db-ja.com

apache poi cellIteratorは空白のセルをスキップしますが、最初の行にはスキップしません

Javaプログラムを作成して、Excelシートを読み取り、コンマ区切りファイルを作成します。空白の列を含むサンプルExcelファイルを実行すると、最初の行は完全に機能しますが、残りの行は完全に機能します。行は空白のセルをスキップします。空白のセルを行に挿入するために必要なコードの変更について読みましたが、私の質問は、最初の行が機能する理由です。


public ArrayList OpenAndReadExcel(){
    FileInputStream file = null;
    HSSFWorkbook workBook = null;
    ArrayList <String> rows = new ArrayList();

    //open the file

    try {
         file = new FileInputStream(new File("Fruity.xls"));
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        System.out.println("Could not open Input File");
        e.printStackTrace();
    }

    //  open the input stream as a workbook

        try {
             workBook = new HSSFWorkbook(file);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("Can't Open HSSF workbook");
            e.printStackTrace();
        }

        // get the sheet
        HSSFSheet sheet = workBook.getSheetAt(0);

        // add an iterator for every row and column
        Iterator<Row> rowIter = sheet.rowIterator();

        while (rowIter.hasNext())
        {

            String rowHolder = "";
            HSSFRow row = (HSSFRow) rowIter.next();
            Iterator<Cell> cellIter = row.cellIterator();
            Boolean first =true;
            while ( cellIter.hasNext())
            {
                if (!first)
                    rowHolder = rowHolder + ",";

                HSSFCell cell = (HSSFCell) cellIter.next();

                rowHolder = rowHolder + cell.toString() ;
                first = false;
            }

            rows.add(rowHolder);

        }

    return rows;

}
public void WriteOutput(ArrayList<String> rows) {

    // TODO Auto-generated method stub
    PrintStream outFile ;
    try {


        outFile = new PrintStream("fruity.txt");
        for(String row : rows)
        {   
            outFile.println(row);
        }
        outFile.close();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}
-----
。xlsファイルへの入力(ここにExcelテーブルを挿入する方法がわかりません)

名前>>>>>>>>>>原産国>>>>>>>>>原産国>>>>>>>グレード>>>>>>月数
アップル>>>>>>>>米国>>>>>>>>>>>>>>>>>>>>>>ワシントン>>>>>>>>>>>> >> A >>>>>>>>> 6
オレンジ>>>>>>米国>>>>>>>>>>>>>>>>>>>>>>フロリダ>>>>>>>>>>>>>> >>> A >>>>>>>>> 9
パイナップル>>>>>米国>>>>>>>>>>>>>>>>>>>>>>ハワイ>>>>>>>>>>>>>>> >>> B >>>>>>>>> 10
イチゴ>>>>米国>>>>>>>>>>>>>>>>>>>>>>ニュージャージー>>>>>>>>>>>>>> C >>>>>>>>>> 3

私の出力テキストファイル
名前、原産国、原産国、、、グレード、月数
Apple、USA、Washington、A、6.0
オレンジ、アメリカ、フロリダ、A、9.0
パイナップル、アメリカ、ハワイ、B、10.0
イチゴ、アメリカ、ニュージャージー、C、3.0


Notice the two extra commas before the Grade column... This is because I have two blank columns there.<br/>

これらの余分なコンマは、出力の残りの部分にありません。

ApachePoiを使用しています-3.9-20121203.jar

12
user2047551

Apache POI Webサイトの 行とセルの反復に関するドキュメント を一読する必要があります。

CellIteratorは、ファイルで定義されているセルのみを返します。これは主に、値またはフォーマットのいずれかを持つセルを意味します。 Excelのファイル形式はまばらで、値も書式も持たないセルを保存する必要はありません。

あなたの場合、最初の行にフォーマットを適用する必要があります。これにより、それらが表示されます。

documentation を読み、インデックスによるルックアップに切り替える必要があります。これにより、コードで空白セルと未使用セルの処理方法を完全に制御することもできます。

17
Gagravarr