Java 损坏的文件处理

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

我想知道是否有人对使用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.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");