损坏的文件处理
我想知道是否有人有任何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。
- 文件被发送。
- 程序运行。
- 处理错误。
- 处理数据。
您可以尝试使用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答案如何处理它。