web-dev-qa-db-ja.com

Java)を使用してExcelシートを読み取っているときにエラーが発生しました

NetBeans6.9.1を使用してSpring/Hibernetを使用しています。 Excelファイル(.xlsx- Office 2007)を読み込もうとしています。 Excelファイルを読み取るためのコードは次のとおりです。Vactorを使用して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;
}

以下は、指定されたExcelファイルを読み取るために上記のメソッドを呼び出す私のControllerのメソッドです。


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

このコードを実行すると、次の例外がスローされます。

提供されたデータはOffice2007 + XMLにあるようです。あなたは、OLE2Officeドキュメントを扱うPOIの一部を呼び出しています。このデータを処理するには、POIの別の部分を呼び出す必要があります(HSSFではなくXSSFなど)

私は間違ったソースを使用していますか、それとも上記のコードで何か他のものが間違っていますか?解決策は何ですか?

コードは ここ から取得されます。

10
Bhavesh

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

必要に応じて、POIに、使用しているファイルタイプを自動検出するように依頼し、ケースに適したHSSFまたはXSSFを選択できます。ただし、これを行うには、コードを少し変更し、具象クラスではなくインターフェイスを使用する必要があります(したがって、HSSFオブジェクトとXSSFオブジェクトのどちらを取得してもコードは機能します)

POI Webサイトには これらの変更を行うためのガイド があります。

例として、これに従うと、最初の数行は次のようになります。

    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ファイルの両方で機能します

39
Gagravarr

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

Poi.jarに加えてpoi-ooxml.jarを必ず追加してください。 poi-ooxmlはXSSFのサポートを提供します。 Apache POIコンポーネントページ にリストされているように、指定された依存関係も追加していることを確認してください。

6
supershnee