2012-12-14 441 views
8

我正在嘗試使用POI來讀取大型xlsx文件的第一次測試,但要使用小文件進行簡單測試,我無法顯示單元格的值。使用POI讀取xlsx文件(SXSSFWorkbook)

有人可以告訴我什麼是我的錯誤。所有的建議都受到歡迎。謝謝。

Test.java:

import java.io.File; 
import java.io.FileInputStream; 

import org.apache.poi.openxml4j.opc.OPCPackage; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.xssf.streaming.SXSSFWorkbook; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class Test { 

    public static void main(String[] args) throws Throwable { 
     File file = new File("/tmp/test.xlsx"); 
     OPCPackage pkg = OPCPackage.open(new FileInputStream(file.getAbsolutePath())); 
     XSSFWorkbook xssfwb = new XSSFWorkbook(pkg); 

     SXSSFWorkbook wb = new SXSSFWorkbook(xssfwb, 100); 
     Sheet sh = wb.getSheet("Hola"); 

     System.out.println("Name: "+sh.getSheetName()); // Line 19 
     System.out.println("Val: "+sh.getRow(1).getCell(1).getStringCellValue()); // Line 20 
    } 
} 

結果:

Name: Hola 
Exception in thread "main" java.lang.NullPointerException 
    at Test.main(Test.java:20) 

test.xlsx:

enter image description here

回答

21

請查閱:similar question SXSSFWorkBook爲只寫,不支持閱讀。

有關的.xlsx文件低內存讀,你應該看看XSSF and SAX EventModel documentation:Gagravarr

如果內存不會是你可以使用一個XSSFSheet而不是例如一個問題

File file = new File("D:/temp/test.xlsx"); 
    FileInputStream fis = new FileInputStream(file); 
    XSSFWorkbook wb = new XSSFWorkbook(fis); 

    XSSFSheet sh = wb.getSheet("Hola"); 
    System.out.println(sh.getLastRowNum()); 
    System.out.println("Name: "+sh.getSheetName()); 
    Row row = sh.getRow(1); 

    System.out.println(row.getRowNum()); 

    System.out.println("Val: "+sh.getRow(1).getCell(1).getStringCellValue()); 
+0

謝謝,但我需要SXSSFWorkbook是用來處理大文件,而不會拋出內存錯誤。 – alditis

+1

請參考:[同樣的問題](http://stackoverflow.com/questions/12513981/reading-data-from-xlsx-sxssfsheet-with-apache-poi-java)SXSSFWorkBook是隻寫,它不支持閱讀 – IDKFA

+0

通過使用SXSSFWorkbook,我們可以避免拋出內存異常。並且我們可以編寫超過llakh記錄,但它只允許.xlsx格式。 – swamy

-1

我太OOM面臨的同一個問題在解析XLSX文件...鬥爭後兩天,我終於找到了下面的代碼,那真是完美的;

此代碼基於sjxlsx。它讀取xlsx並將其存儲在HSSF表單中。

  // read the xlsx file 
     SimpleXLSXWorkbook = new SimpleXLSXWorkbook(new File("C:/test.xlsx")); 

     HSSFWorkbook hsfWorkbook = new HSSFWorkbook(); 

     org.apache.poi.ss.usermodel.Sheet hsfSheet = hsfWorkbook.createSheet(); 

     Sheet sheetToRead = workbook.getSheet(0, false); 

     SheetRowReader reader = sheetToRead.newReader(); 
     Cell[] row; 
     int rowPos = 0; 
     while ((row = reader.readRow()) != null) { 
      org.apache.poi.ss.usermodel.Row hfsRow = hsfSheet.createRow(rowPos); 
      int cellPos = 0; 
      for (Cell cell : row) { 
       if(cell != null){ 
        org.apache.poi.ss.usermodel.Cell hfsCell = hfsRow.createCell(cellPos); 
        hfsCell.setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING); 
        hfsCell.setCellValue(cell.getValue()); 
       } 
       cellPos++; 
      } 
      rowPos++; 
     } 
     return hsfSheet; 
+0

這對XSSF文件有什麼幫助?你的代碼只有HSSF ... – Gagravarr

相關問題