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 таблица здесь )

Имя >>>>>>>>>> страна происхождения >>>>>>>>> государство происхождения >>>>>>> сорт>>>>>> нет месяцев
Яблоко >>>>>>>> США >>>>>>>>>>>>>>>>>>>>>> Вашингтон >>>>>>>>>>>>>> а >>>>>>>>> 6
оранжевый >>>>>> США >>>>>>>>>>>>>>>>>>>>>> Флорида >>>>>>>>>>>>>>>>> а >>>>>>>>> 9
ананас> > > > > США >>>>>>>>>>>>>>>>>>>>>> Гавайи >>>>>>>>>>>>>>>>>> B >>>>>>>>> 10
клубника> > > > США >>>>>>>>>>>>>>>>>>>>>> Нью-Джерси>>>>>>>>>>>>>> C >>>>>>>>>> 3

мой выходной текстовый файл
Имя, страна происхождения, государство происхождения,,, класс, нет месяцев
Apple, США, Вашингтон, A, 6.0
orange, США, Флорида, A, 9.0
ананас, США, Гавайи, B, 10.0
strawberry, США, Нью-Джерси, C, 3.0


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

эти дополнительные запятые отсутствуют в остальной части вывода.

Я использую Apache Poi-3.9-20121203.Джар

1 ответов


вы должны прочитать через итерация по строкам и ячейкам документации на веб-сайте Apache POI.

CellIterator будет возвращать только ячейки, определенные в файле, что в основном означает ячейки со значениями или форматированием. Формат файла excel разрежен и не беспокоит хранение ячеек, которые не имеют ни значений, ни форматирования.

для вашего случая вы должны иметь форматирование, примененное к первой строке, что заставляет их появляться.

вам нужно прочитать через документация и переключиться на поиск по индексу. Это также позволит вам полностью контролировать, как пустые и никогда не используемые ячейки обрабатываются в вашем коде.