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

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

执行此代码时,会引发以下exception。

提供的数据似乎在Office 2007+ XML中。 您正在调用处理OLE2 Office文档的POI部分。 您需要调用POI的不同部分来处理这些数据(例如XSSF而不是HSSF)

我是否使用错误的源代码或其他东西是错误的上述代码? 解决办法是什么?

代码取自这里 。

您的代码显式请求HSSF,因此只能使用较旧的.xls(二进制)文件。

如果你愿意,你可以要求POI自动检测你的文件types,并为你的情况select合适的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文件工作

您也可以用XSSFreplaceHSSF。

确保除了poi .jar之外还添加了poi-ooxml .jar。 poi-ooxml为XSSF提供支持。 确保你也添加了在Apache POI组件页面上列出的给定的依赖关系。