2012-12-14 35 views
8

POIで大きなxlsxファイルを読み込む最初のテストをしようとしていますが、小さなファイルで簡単なテストを行うためにセルの値を表示することはできません。POI(SXSSFWorkbook)でxlsxファイルを読む

誰かが私の間違いを教えてくれます。すべての提案は大歓迎です。ありがとう。

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を使用することができ、問題ではないであろう場合xlsxファイルの解析中

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の同じ問題に直面していました...闘争の2日後、私は最終的に本当に完璧だった以下のコードを見つけました。

このコードは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

関連する問題