2012-03-08 37 views
10

Tôi đang làm việc với Spring/Hibernet bằng NetBeans 6.9.1. Tôi đang cố đọc một tệp Excel (.xlsx- Office 2007). Mã để đọc tệp Excel như sau sử dụng Vactor để lưu trữ dữ liệu từ trang tính Excel.Lỗi khi đọc trang tính Excel sử dụng Java

import java.io.FileInputStream; 
import java.util.Iterator; 
import java.util.Vector; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import model.NewHibernateUtil; 
import org.apache.poi.hssf.usermodel.HSSFCell; 
import org.apache.poi.hssf.usermodel.HSSFRow; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 
import org.hibernate.Session; 
import org.springframework.validation.BindException; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.SimpleFormController; 

private Vector importExcelSheet(ModelAndView mv) 
{ 
    Vector cellVectorHolder = new Vector(); 
    try 
    {   
     HSSFWorkbook myWorkBook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream("E:/Project/SpringHibernet/MultiplexTicketBookingNew/web/excelSheets/Country.xlsx"))); 
     HSSFSheet mySheet = myWorkBook.getSheetAt(0); 
     Iterator rowIter = mySheet.rowIterator(); 
     System.out.println(mySheet.getRow(1).getCell(0)); 
     while(rowIter.hasNext()) 
     { 
      HSSFRow myRow = (HSSFRow) rowIter.next(); 
      Iterator cellIter = myRow.cellIterator(); 
      Vector cellStoreVector=new Vector(); 
      while(cellIter.hasNext()) 
      { 
       HSSFCell myCell = (HSSFCell) cellIter.next(); 
       cellStoreVector.addElement(myCell); 
      } 
      cellVectorHolder.addElement(cellStoreVector); 
     } 
    } 
    catch (Exception e) 
    { 
     mv.addObject("msg", e.getMessage()); 
    } 
    return cellVectorHolder; 
} 

Sau đây là một phương pháp trong Controller của tôi mà các cuộc gọi phương pháp trên để đọc file Excel định


@Override 
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception 
{ 
    ModelAndView mv=new ModelAndView(); 

    try 
    { 
     if(request.getParameter("import")!=null) 
     { 
      session=NewHibernateUtil.getSessionFactory().getCurrentSession(); 
      session.beginTransaction(); 

      Vector dataHolder=importExcelSheet(mv); 
      for (int i=0;i<dataHolder.size(); i++) 
      { 
       Vector cellStoreVector=(Vector)dataHolder.elementAt(i); 
       for (int j=0; j < cellStoreVector.size();j++) 
       { 
        HSSFCell myCell = (HSSFCell)cellStoreVector.elementAt(j); 
        String st = myCell.toString(); 
        System.out.println(st.substring(0,1)+"\t"); 
       } 
       System.out.println(); 
      } 

      session.flush(); 
      session.getTransaction().commit(); 
     } 
    } 
    catch (Exception e) 
    { 
     mv.addObject("msg", e.getMessage()); 
    } 
    return mv; 
} 

On thực thi mã này, ngoại lệ sau đây được ném.

Dữ liệu được cung cấp có vẻ như trong Office 2007+ XML. Bạn đang gọi đến một phần của POI liên quan đến OLE2 Tài liệu Office. Bạn cần phải gọi một phần khác của POI để xử lý dữ liệu này (ví dụ XSSF thay vì HSSF)

Tôi có sử dụng một nguồn sai hay cái gì khác là sai với mã trên? Giải pháp là gì?

Mã được lấy từ here.

+0

Tôi đã tải xuống api 'apache.poi' khác và sử dụng gói' org.apache.poi.xssf.usermodel. * 'Thay vì sử dụng gói' org.apache.poi.hssf.usermodel. * 'Và nó hoạt động cho cả hai 'xls' và' xlsx'. – Bhavesh

+0

xin vui lòng gửi bài này như là câu trả lời và chấp nhận nó, càng sớm càng tốt. – oers

Trả lời

37

Mã của bạn vì nó viết rõ ràng yêu cầu HSSF, vì vậy sẽ chỉ hoạt động với các tệp .xls (nhị phân) cũ hơn.

Nếu muốn, bạn có thể yêu cầu POI tự động phát hiện loại tệp nào bạn có và chọn loại tệp HSSF hoặc XSSF phù hợp cho trường hợp của bạn. Tuy nhiên, để thực hiện điều đó, bạn cần phải thay đổi mã của mình một chút và sử dụng giao diện thay vì các lớp cụ thể (vì vậy mã của bạn hoạt động cho dù bạn nhận được đối tượng HSSF hoặc XSSF)

Trang web POI có guide to making these changes.

Như một ví dụ, khi bạn làm theo này, vài dòng đầu tiên của bạn mà là:

HSSFWorkbook myWorkBook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream("E:/Project/SpringHibernet/MultiplexTicketBookingNew/web/excelSheets/Country.xlsx"))); 
    HSSFSheet mySheet = myWorkBook.getSheetAt(0); 
    Iterator rowIter = mySheet.rowIterator(); 
    System.out.println(mySheet.getRow(1).getCell(0)); 

sẽ trở thành trong hệ thống mới:

Workbook wb = WorkbookFactory.create(new File("/path/to/your/excel/file")); 
    Sheet mySheet = wb.getSheetAt(0); 
    Iterator<Row> rowIter = mySheet.rowIterator(); 
    System.out.println(mySheet.getRow(1).getCell(0)); 

này sau đó sẽ làm việc cho cả hai .xls và .xlsx files

+1

Tôi đã sử dụng cách tiếp cận tương tự như bạn đã đề cập và nó hoạt động như mong đợi. Cảm ơn. – Bhavesh

+10

Để hoàn thành câu trả lời, WorbookFactory là một phần poi-ooxml.jar – Vishnu

6

Bạn cũng có thể thay thế HSSF bằng XSSF.

Đảm bảo rằng bạn thêm poi-ooxml .jar ngoài poi .jar. poi-ooxml cung cấp hỗ trợ cho XSSF. Hãy chắc chắn rằng bạn cũng đã thêm các phụ thuộc nhất định như được liệt kê trên Apache POI components page.

+0

Đó là những gì tôi đã làm kể từ khi tôi biết. Cảm ơn cho relay mặc dù. P.S. Tôi không thể truy cập trang này khá thường xuyên do lịch trình bận rộn. – Bhavesh

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