2012-12-14 34 views
8

Tôi đang thử làm các bài kiểm tra đầu tiên của mình về đọc tệp xlsx lớn với POI, nhưng để làm một bài kiểm tra đơn giản với một tệp nhỏ tôi không hiển thị giá trị của ô.Đọc tập tin xlsx với POI (SXSSFWorkbook)

Ai đó có thể cho tôi biết sai lầm của tôi là gì. Tất cả các đề xuất đều được chào đón. Cảm ơn.

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 
    } 
} 

Kết quả:

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

test.xlsx:

enter image description here

Trả lời

21

Vui lòng tham khảo: similar question SXSSFWorkBook chỉ viết, nó không hỗ trợ đọc.

Để đọc bộ nhớ thấp của file .xlsx, bạn nên nhìn vào XSSF and SAX EventModel documentation: Gagravarr

Nếu bộ nhớ sẽ không thể là một vấn đề mà bạn có thể sử dụng một XSSFSheet thay vì ví dụ

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

Xin cảm ơn, nhưng tôi cần SXSSFWorkbook được sử dụng để xử lý tệp lớn mà không phát hiện lỗi bộ nhớ. – alditis

+1

Vui lòng tham khảo: [cùng một câu hỏi] (http://stackoverflow.com/questions/12513981/reading-data-from-xlsx-sxssfsheet-with-apache-poi-java) SXSSFWorkBook chỉ viết, nó không hỗ trợ đọc – IDKFA

+0

Bằng cách sử dụng SXSSFWorkbook chúng ta có thể tránh ném ra khỏi ngoại lệ bộ nhớ.Và chúng tôi có thể viết nhiều hơn bản ghi llakh.Nhưng nó chỉ cho phép định dạng .xlsx. – swamy

-1

tôi cũng phải đối mặt với cùng một vấn đề của oom khi phân tách xlsx ... sau hai ngày đấu tranh, cuối cùng tôi phát hiện ra đoạn mã sau đó là thực sự hoàn hảo;

Mã này dựa trên sjxlsx. Nó đọc xlsx và lưu trữ trong một tờ 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

Tính năng này giúp ích cho các tệp XSSF như thế nào? Mã của bạn chỉ là HSSF ... – Gagravarr

Các vấn đề liên quan