2012-03-08 12 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; 
} 

次は、このコードを実行するには


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

ファイル指定のExcelを読み取るために上記のメソッドを呼び出して、私のControllerにおける方法で、次の例外がスローされます。

提供されたデータはOffice 2007+ XMLのようです。 OLE2 Office Documentsを扱うPOIの部分を呼び出すのは です。あなたは POIの異なる部分をコールする必要が

私が間違っているソースまたは何か他のものを使用していますが、上記のコードが間違っている(例えばXSSF 代わりにHSSFの)このデータを処理するには?解決策は何ですか?

コードはhereから取られます。

+0

'org.apache.poi.hssf.usermodel。*'パッケージを使用するのではなく、別の 'apache.poi' APIをダウンロードし、' org.apache.poi.xssf.usermodel。* 'パッケージを使用しました。 'xls'と' xlsx'です。 – Bhavesh

+0

これを回答として投稿し、できるだけ早くそれを受け入れてください。 – oers

答えて

37

あなたのコードは明示的にHSSFを要求しているため、古い.xls(バイナリ)ファイルでのみ動作します。

POIにお持ちのファイルタイプを自動的に検出して、適切なHSSFまたはXSSFを選択することができます。ただし、コードを少し変更して、具体的なクラスではなくインターフェイスを使用する必要があります(HSSFまたはXSSFオブジェクトを取得するかどうかにかかわらずコードは機能します)

POI Webサイトには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

+10

答えを完成させるために、WorbookFactoryは部分的にpoi-ooxml.jar – Vishnu

6

また、HSSFをXSSFに置き換えることもできます。

poi-ooxml .jarとpoi .jarを必ず追加してください。 poi-ooxmlはXSSFをサポートします。 Apache POI components pageに記載されている特定の依存関係も追加してください。

+0

です。これは私が知り合って以来行ってきたことです。しかし、リレーに感謝します。 P.S.私は忙しいスケジュールのためにこのサイトをかなり頻繁に訪問することはできません。 – Bhavesh

関連する問題