Java 损坏的文件处理
我想知道是否有人对使用ApachePOI处理受损文件有任何建议 我正在尝试打开一个文件,并收到以下消息:Java 损坏的文件处理,java,excel,apache-poi,Java,Excel,Apache Poi,我想知道是否有人对使用ApachePOI处理受损文件有任何建议 我正在尝试打开一个文件,并收到以下消息: Exception in thread "main" org.apache.poi.hssf.record.RecordInputStream$LeftoverDataException: Initialisation of record 0x1C left 2 bytes remaining still to be read. at org.apache.poi.hssf.reco
Exception in thread "main" org.apache.poi.hssf.record.RecordInputStream$LeftoverDataException: Initialisation of record 0x1C left 2 bytes remaining still to be read.
at org.apache.poi.hssf.record.RecordInputStream.hasNextRecord(RecordInputStream.java:156)
at org.apache.poi.hssf.record.RecordFactoryInputStream.nextRecord(RecordFactoryInputStream.java:231)
at org.apache.poi.hssf.record.RecordFactory.createRecords(RecordFactory.java:480)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:301)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:95)
at ExcelImporter.EditFileImportDialog.main(EditFileImportDialog.java:409)
仅此文件会发生这种情况,如果我在excel中打开文件并保存它,然后尝试使用POI
打开它,则不会引发异常。关于我如何处理这件事有什么建议吗
编辑:
请注意,我的问题可能与有关,但升级POI
并没有解决我的问题,并且与所描述的文件存在不同之处。我搜索过类似的答案,但如果有人知道excel文件本身有什么问题,我可以写一些东西来修补该文件
编辑2
文件创建不在我的控制范围内。Excel会在打开并重新保存文件时修复文件本身。但我的问题是,是否有人能想出一种方法来调整/增强POI,以便以excel能够解决问题的方式来处理这个损坏的文件 编辑3 针对一些评论/回答: 我的最终目标是根本不使用excel
尝试从FileInputStream创建XSSF工作簿 通过更改,您的示例将如下所示:
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class EditFileImportDialog {
/* Omitted irrelevent code */
public static void main(String[] args) {
String file = "Z:\\Path\\To\\File_causing_the_trouble.xls";
try {
InputStream databaseFile = new FileInputStream(file);
XSSFWorkbook wb = new XSSFWorkbook(databaseFile);
System.out.println(wb);
} catch (InvalidFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
您可以尝试使用HSSFWorkbook打开.xls文件 您可以使用以下代码检查POI如何响应xls格式
private boolean isExcel(InputStream i) throws IOException {
return (POIFSFileSystem.hasPOIFSHeader(i) || POIXMLDocument.hasOOXMLHeader(i));
}
我将使用:
InputStream input = new FileInputStream(fileName);
而不是:
File file = new File("Z:\\Path\\To\\File_causing_the_trouble.xls");
您是否检查了文件中单元格0x1C的问题?您可能已经检查过,但如果没有,请查看是否有帮助。它也有类似的问题,您可以找到如何处理它的答案。线程main中的异常不是编码问题。您应该在Excel工作簿中替换错误的单元格引用 线程“main”org.apache.poi.hssf.record.RecordInputStream$LeftoverDataException中的异常: 对记录0x23进行初始化后,仍有12个字节需要读取 当我尝试使用POI HSSF打开包含DDE单元格引用的Excel工作簿时,会引发此异常。“Excel.type.12”单元格引用类型存在此问题,例如: =Excel.Sheet.12 |'\servername\pathname\Workbook.xlsx'!'!我的名字!Z23S22' 解决方法:将引用替换为“Sheet”类型的引用,例如: ='Drive:\pathname[Workbook.xlsx]Sheetname'$V$23
保存工作簿并重试。最好的选择是创建一个新文件,并记住在执行程序之前关闭该文件。这将是最简单的解决方案。如果这是交互过程的一部分(如用户上载文件),那么最好的办法可能是通知用户存在问题,并建议用户在重试之前打开并重新保存文档。@ninesided这不是上载过程的一部分,然而,用户每次都可以打开并重新保存该文件,但这是一个每天都会出现的文件,并且在交付端存在一些我们无法控制的错误。如果无法以编程方式处理此类错误,我们可以使用open/resave方法,让excel处理错误修复,但这不是首选方法,因为这是一个单击过程。您能否提供有关XLS文件源的详细信息?我见过系统同时导出扩展名为.XLS的.CSV和.HTML文件的情况。在这两种情况下,Excel都可以打开数据,但POI可能不检查文件头,并根据扩展名对格式进行假设。您可以尝试使用POI事件API,甚至低级API,以比usermodel API更不严格的方式读取xls@因此,我有权创建类似的东西,但我希望创建一个POI解决方案。像这样依赖excel是不可取的。
XSSFWorkbook
用于打开。xlsx
类型文件,您提出的解决方案会引发无效格式异常
,并且无法解决问题。根据,如果是optionI检查,您最好使用文件而不是输入流,文件的生成有一个简单的问题(我无法控制)。如果查看文档,该方法会正确选择正确的格式。我的问题更多的是想看看是否可以以某种方式为POI复制相同的纠错Excel展示。谢谢你的建议!您可能会重载正确处理错误所需的类。@Xavierboucle您对如何正确处理错误有什么建议吗?您是否尝试过在WorkbookFactory中调试create方法?之后,您可以重写WorkbookFactory并使用自己的创建方法。因为你的问题与一个案例有关,所以你应该能够这样做。不过,这可能会很棘手。欢迎光临。与其仅仅链接到bug报告(即使它被标记为已解决),不如尝试找到实际的解决方案。否则,发表评论就更合适了(一旦你获得了更多的声誉,你就可以对别人的帖子发表评论了)。文件的创建不在我的控制范围内,缺陷存在于创建文件的人这一方。我知道我可以自己编辑文件并使用excel修复单元格。事实上,Excel在打开并重新保存文件时修复了文件本身,从而解决了问题。但我的问题是,是否有人能想出一种方法来调整POI,以像excel处理此问题一样处理此损坏的文件。您应该提供一个简单的代码示例来支持您的答案。同意@pczeus。但既然可以创建一个新的文件来编写,为什么还要编写代码呢?@SanketGupte我不理解你的建议。我的问题是,我需要读取的文件在指定记录处发送时出错。我希望能够让POI修复错误并读取文件。我从来都不知道
File file = new File("Z:\\Path\\To\\File_causing_the_trouble.xls");