2012-03-08 94 views
10

我正在使用NetBeans 6.9.1使用Spring/Hibernet。我正在嘗試讀取一個Excel文件(.xlsx- Office 2007)。讀取Excel文件的代碼如下,使用Vactor來存儲Excel表格中的數據。使用Java閱讀Excel表時發生錯誤

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

下面是我Controller的方法調用上面的方法來讀取指定的Excel文件


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

上執行這段代碼,以下異常被拋出。

提供的數據似乎在Office 2007+ XML中。您是 調用處理OLE2 Office文檔的POI部分。您 需要調用POI的不同部分來處理這些數據(以下EG XSSF 代替HSSF)

我使用了錯誤的源或別的東西是錯誤與上面的代碼?解決辦法是什麼?

該代碼取自here

+0

我下載了另一個'apache.poi' api,並使用'org.apache.poi.xssf.usermodel。*'包而不是使用'org.apache.poi.hssf.usermodel。*'包,它適用於'xls'和'xlsx'。 – Bhavesh 2012-03-08 19:52:45

+0

請將此作爲答案並儘快接受。 – oers 2012-03-09 07:06:07

回答

37

您的代碼顯式要求HSSF,因此只能與較舊的.xls(二進制)文件一起使用。

如果需要,您可以要求POI自動檢測您擁有的文件類型,並根據您的情況選擇合適的HSSF或XSSF。然而,要做到這一點,你需要稍微改變你的代碼,並使用接口,而不是具體的類(所以你的代碼工作,無論你得到一個HSSF或XSSF對象)

POI網站有一個guide to making these changes應該引導你通過。

舉個例子,當你遵循這一點,這是你的第幾行:

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)); 

將成爲新系統:

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)); 

這則兩個.xls的工作, .xlsx文件

+1

我使用了與上述相同的方法,並且按預期工作。謝謝。 – Bhavesh 2012-03-12 15:37:30

+10

對於答案的完整性,WorbookFactory是一個組成部分poi-ooxml.jar – Vishnu 2015-03-30 11:34:26

6

您也可以用XSSF替換HSSF。

請確保除了poi .jar之外還添加了poi-ooxml .jar。 poi-ooxml爲XSSF提供支持。確保您還添加了Apache POI components page中列出的給定依賴關係。

+0

這就是自從我認識以來一直在做的事情。雖然感謝接力。附:由於繁忙的時間表,我無法經常訪問這個網站。 – Bhavesh 2013-05-26 20:56:59