当前位置: 首页 > 面试题库 >

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

祁星阑
2023-03-14
问题内容

我正在使用NetBeans 6.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;
}

以下是我的方法,该方法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中。您正在调用POI中与OLE2
Office文档有关的部分。您需要调用POI的其他部分来处理此数据(例如XSSF而不是HSSF)

我使用的源错误还是上述代码有其他问题?解决办法是什么?

代码是从这里获取的。


问题答案:

您的代码明确要求HSSF,因此仅适用于较旧的.xls(二进制)文件。

如果需要,您可以要求POI自动检测您拥有的文件类型,然后根据情况选择合适的HSSF或XSSF之一。但是,要做到这一点,您需要稍微更改代码,并使用接口而不是具体的类(因此,无论获取HSSF还是XSSF对象,代码都可以工作)

POI网站上有进行这些更改的指南,应指导您完成这些更改。

例如,当您遵循此步骤时,您的前几行是:

    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文件



 类似资料:
  • 问题内容: 我遵循了使用Apache POI XSSF构造工作簿的简单指南。遵循相同的指南,我能够写出一张Excel工作表,但是,当尝试从其中读取数据时,我收到了代码后显示的错误。 码: 错误输出: 线程“主”中的异常java.lang.NoSuchFieldError:org.apache.poi.openxml4j.opc.internal.ZipHelper.verifyZipHeader(

  • 我在SOAP UI工具中编写了groovy脚本,用于从excel工作表中读取值并执行SOAP UI xml,但每当运行脚本时,我都会遇到以下错误, 请帮帮我。我不明白这里缺少什么。我也添加了所有jar文件。 脚本为 错误:

  • 我正在使用对象读取Excel文件并返回DataTable中的数据。下面的Excel工作表有两列,这两列是导入的,但我也想用我的数据读取Excel行号。 这是我用来读取Excel文件的代码: 我可以通过数据表中的新列的增量数来管理它,但是我可以应用WHERE子句和SELECT语句来返回来自不同行号的数据吗(应用增量行号可能会失败)?

  • 似乎这里和这里已经有了答案,但是,这些解决方案都不适合我。 我正在努力 不管怎样,最后仍然包含第一张而不是第二张。我使用的是Python 3和Pandas 0.20。1(水蟒发行版)。我错过了什么?如何将第二张图纸加载到?

  • 我返回了一个代码,使用jsoup-1.7.3.jar读取网页,它对一些网站有效,但对一些URL显示读取超时错误。 线程“main”java.net.SocketTimeoutException中的异常:java.net.SocketInputStream.socketRead0(本机方法)处java.net.SocketInputStream.Read(SocketInputStream.java

  • 我有一个包含三列名称,年龄,地址的Excel工作表。现在我想在同一本工作手册中创建另一个具有两列名称,计数的Excel工作表。也就是说,我应该在第一个 excel 工作表中找到不同名称的计数数并写入第二个 excel 工作表。也就是说,如果在第一个 excel 表中,pinku 出现 5 次,名称 ram 出现 2 次。然后在第二张工作表中,它应该显示每个名称及其计数。谁能建议?