apache poi cellIterator跳过空白单元格但不在第一行

use*_*551 11 apache-poi

我正在创建一个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();
    }
}
Run Code Online (Sandbox Code Playgroud)

}
-----
我在.xls文件中输入(抱歉不知道如何在这里插入excel表)

名称>>>>>>>>>>原产地>>>>>>>>>状态原产地>>>>>>>等级>>>>>>没有月份
Apple >>>>>>>>美国>>>>>>>>>>>>>>>>>>>>>> >华盛顿>>>>>>>>>>>>>> A >>>>>>>>> 6
橙色>>>>>>美国>>>>>>>>>>>>>>> >>>>>>>佛罗里达州>>>>>>>>>>>>>>>>> A >>>>>>>>> 9
菠萝>>>>>美国>>>>>>> >>>>>>>>>>>>>>>夏威夷>>>>>>>>>>>>>>>>>> B >>>>>>>>> 10
草莓>>>>美国>>>>>>>>>>>>>>>>>>>>>>新泽西州>>>>>>>>>>>>>> C >>>>>>>>>> 3

我的输出文本文件
名称,原产国,原产地,,,年级,月份没有
苹果,美国,华盛顿,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/>
Run Code Online (Sandbox Code Playgroud)

输出的其余部分中缺少这些额外的逗号.

我正在使用Apache Poi-3.9-20121203.jar

Gag*_*arr 17

您应该阅读Apache POI网站上的Iterating Over Rows and Cells文档.

CellIterator将仅返回已在文件中定义的单元格,这主要是指具有值或格式的单元格.excel文件格式稀疏,并且不打算存储既没有值也没有格式化的单元格.

对于您的情况,您必须将格式应用于第一行,这会导致它们显示.

您需要阅读文档并按索引切换到查找.这也将允许您完全控制代码中处理空白与未使用单元格的方式.

  • 这是一个非常糟糕的API设计.为什么?首先,迭代器对单元格的迭代与索引迭代不同 - 这实在令人惊讶.其次,它没有提供我打开电子表格时看到的结构. (5认同)