2013-02-06 98 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

相關問題