gpt4 book ai didi

java - 使用 apache POI 读取 excel 2003 文件 - FileNotFound

转载 作者:行者123 更新时间:2023-12-01 14:40:18 24 4
gpt4 key购买 nike

我正在编写一些代码来将 Excel 文件导入数据库。文件可能很大(数千行),因此我使用事件 API。 POI版本为3.9

我正在这样打开文件:FileInputStream fin = new FileInputStream(文件);

//create record listener
HSSFRecordListener mainListener = new HSSFRecordListener("aaa.xls");
// create a new org.apache.poi.poifs.filesystem.Filesystem
POIFSFileSystem poifs = new POIFSFileSystem(fin);
// get the Workbook (excel part) stream in a InputStream
din = poifs.createDocumentInputStream("Workbook");

某些文件在最后一行抛出 FileNotFoundException。事实上,如果我用 7zip 打开这些文件,就没有 Workbook 条目,而是有 Book 条目。

如果找不到 Workbook,我尝试通过打开 Book 条目来解决此问题。

try {
din = poifs.createDocumentInputStream("Workbook");
} catch (FileNotFoundException e) {
try {
din = poifs.createDocumentInputStream("Book");
} catch (FileNotFoundException e1) {
FileNotFoundException e2 = new FileNotFoundException("Neither Workbook nor Book found in file!");
e2.initCause(e1);
throw e2;
}
}

这会导致另一个异常:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.poi.hssf.record.RecordFormatException: Unable to construct record instance
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
root cause

org.apache.poi.hssf.record.RecordFormatException: Unable to construct record instance
org.apache.poi.hssf.record.RecordFactory$ReflectionConstructorRecordCreator.create(RecordFactory.java:65)
org.apache.poi.hssf.record.RecordFactory.createSingleRecord(RecordFactory.java:301)
org.apache.poi.hssf.record.RecordFactoryInputStream$StreamEncryptionInfo.<init>(RecordFactoryInputStream.java:65)
org.apache.poi.hssf.record.RecordFactoryInputStream.<init>(RecordFactoryInputStream.java:182)
org.apache.poi.hssf.eventusermodel.HSSFEventFactory.genericProcessEvents(HSSFEventFactory.java:139)
org.apache.poi.hssf.eventusermodel.HSSFEventFactory.processEvents(HSSFEventFactory.java:106)
pl.veracomp.service.SpreadsheetImportService.process(SpreadsheetImportService.java:369)
pl.veracomp.controller.uploadController.onSubmit(uploadController.java:57)
org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:272)
org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:268)
org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
root cause

org.apache.poi.hssf.record.RecordFormatException: Not enough data (0) to read requested (2) bytes
org.apache.poi.hssf.record.RecordInputStream.checkRecordPosition(RecordInputStream.java:216)
org.apache.poi.hssf.record.RecordInputStream.readShort(RecordInputStream.java:233)
org.apache.poi.hssf.record.InterfaceHdrRecord.<init>(InterfaceHdrRecord.java:43)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
org.apache.poi.hssf.record.RecordFactory$ReflectionConstructorRecordCreator.create(RecordFactory.java:57)
org.apache.poi.hssf.record.RecordFactory.createSingleRecord(RecordFactory.java:301)
org.apache.poi.hssf.record.RecordFactoryInputStream$StreamEncryptionInfo.<init>(RecordFactoryInputStream.java:65)
org.apache.poi.hssf.record.RecordFactoryInputStream.<init>(RecordFactoryInputStream.java:182)
org.apache.poi.hssf.eventusermodel.HSSFEventFactory.genericProcessEvents(HSSFEventFactory.java:139)
org.apache.poi.hssf.eventusermodel.HSSFEventFactory.processEvents(HSSFEventFactory.java:106)
pl.veracomp.service.SpreadsheetImportService.process(SpreadsheetImportService.java:369)
pl.veracomp.controller.uploadController.onSubmit(uploadController.java:57)
org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:272)
org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:268)
org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

Google 有一些关于 POI 3.2 和 3.7 中已修复错误的信息,这些错误与异常数据不足 (0) 无法读取请求的 (2) 字节有关,但似乎又是另外一回事。

相同的文件可以在 Excel 2007 中成功打开。当我使用另存为=>Excel 97/2003 手动保存它们时,7zip 显示 Book 条目已已替换为 Workbook,我可以使用 Apache POI 成功导入它们。

有人发现这个问题了吗?如何解决这个问题?

编辑

问题是当我尝试打开以 Microsoft Excel 5.0/95 文件格式保存的文件时。

要重现此问题,请创建新电子表格,输入任意数据,然后另存为 => Microsoft Excel 5.0/95 工作簿 (*.xls)。

有没有办法用 apache POI 读取这种格式,或者我是否必须强制我的用户在上传之前升级他们的工作簿?

最佳答案

在您提出问题时,Apache POI 没有其他解决方案。好消息是现在就有了!

在新版本的 Apache POI 中,如果您使用这些旧文件之一调用 HSSFWorkbookWorkbookFactory,您将获得更有帮助的 OldExcelFormatException抛出

如果你想从这些文件中获取一些信息,那么OldExcelExtractor能够从包括 Excel 95(及更早版本!)在内的格式中获取文本和数字。

为了支持这一点,还有一些用于这些的 Record 类,因此您可以进行一些基于事件的解析来更详细地处理它们。但没有友好的 UserModel 支持

关于java - 使用 apache POI 读取 excel 2003 文件 - FileNotFound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16033312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com