2013-02-06 97 views
4

我正在创建一个java程序来读取excel表单并创建逗号分隔文件。当我运行我的示例excel文件,空白列,第一行完美工作,但其余的行跳过空白单元格。 我已阅读有关将空白单元插入行所需的代码更改,但我的问题是为什么第一行工作?apache poi cellIterator跳过空白单元格但不在第一行


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
草莓>>>>美国>>>>>>>>>>>>>>>>>>>>>>新泽西州>>>>>>> >>>>>>>ç>>>>>>>>>> 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/> 

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

我使用Apache POI-3.9-20121203.jar

+0

想通了这一个。这是格式化...第一行是标题是大胆的...大胆适用于空列...因此,这些列被假定为空白值,而不是空...谢谢 – user2047551

+0

考虑编辑问题文本。 – soufrk

回答

13

你应该通过Iterating Over Rows and Cells documentation在Apache POI网站上阅读。

CellIterator将只返回文件中定义的单元格,这主要是指具有值或格式的单元格。 excel文件格式很稀疏,并且不会打扰存储没有值和格式的单元格。

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

您需要通读documentation并切换到索引查找。这也可以让你完全控制你的代码中处理vs未使用单元格的空白程度。

+3

这是一个非常糟糕的API设计。为什么? 首先,迭代器对单元的迭代不同于按索引迭代 - 这真是令人惊讶。第二,当我打开电子表格时,它不提供我看到的结构。 – Peter

+0

彼得,我同意。 – charlottesville

相关问题