首页 文章

使用Java读取Excel工作表时出错

提问于
浏览
10

我试图读取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;
}

以下是我的 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的不同部分来处理此数据(例如,XSSF而不是HSSF)

我使用了错误的来源或上面的代码有什么不对吗?解决办法是什么?

代码取自here .

2 回答

  • 39

    您的代码显式请求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文件

  • 6

    您也可以用XSSF替换HSSF .

    除了poi .jar之外,请确保添加poi-ooxml .jar . poi-ooxml为XSSF提供支持 . 确保您还添加了Apache POI components page上列出的给定依赖项 .

相关问题