损坏的文件处理

我想知道是否有人有任何build议处理与Apache POI损坏的文件

我试图打开一个文件,并收到此消息:

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) 

这是一个SSCCE

 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) { File file = new File("Z:\\Path\\To\\File_causing_the_trouble.xls"); try { Workbook wb = WorkbookFactory.create(file); // Line 409 for ref to the exception stack trace System.out.println(wb); } catch (InvalidFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 

这只发生在这个文件中,如果我在Excel中打开文件并保存,则不会引发exception,然后尝试用POI打开它。 有关我如何处理这个问题的任何build议?

编辑:

作为一个说明,我的问题可能与这个问题有关 ,但是升级POI并没有解决我的问题,并且与描述的文件有不同之处。 我已经search了类似的答案,但也许如果有人知道什么是错误的Excel文件本身,我可以写些东西来修补文件。

编辑2

文件创build不在我的控制之下。 Excel只是在打开和重新保存文件时自行修复。 我的问题是,是否有人可以想办法调整/增加POI来处理这个损坏的文件,就像excel能够解决这个问题一样。

编辑3

回复几条评论/回答:

我的最终目标是不使用excel。

  1. 文件被发送。
  2. 程序运行。
  3. 处理错误。
  4. 处理数据。

您可以尝试使用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有什么问题?

最好的select是创build一个新文件,并让它记住在执行程序之前closures文件。 这将是最简单的解决scheme。

主线程中的exception不是一个编码问题。 你应该在Excel-Workbook中replace错误的单元格引用!

线程“main”中的exceptionorg.apache.poi.hssf.record.RecordInputStream $ LeftoverDataException:logging0x23的初始化剩下12个字节还有待读取。

当我尝试打开包含DDE单元格引用的POI HSSF的Excel工作簿时,会引发此exception。 我有一个单元格引用types的“Excel.Type.12”,例如:= Excel.Sheet.12 |'\ servername \ pathname \ Workbook.xlsx'!'!Sheetname!Z23S22'

解决方法:将引用replace为“Sheet”types的引用,例如:='Drive:\ pathname [Workbook.xlsx] Sheetname'!$ V $ 23

保存您的工作簿并再次尝试。

尝试从FileInputStream创build一个XSSFWorkbook。

随着变化你的样品将如下所示:

 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(); } } } 

您可能已经检查过,但如果没有,请参阅https://bz.apache.org/bugzilla/show_bug.cgi?id=47251(如果有帮助)。; 它有类似的问题,你可以find答案如何处理它。