org.apache.poi.POIXMLException:使用Libre Office更新.xls文件后POI API中的java.lang.reflect.InvocationTargetException

我正在阅读使用POI API的Excel,我使用下面的代码来阅读Excel文件。

public class ExcelWorkBook { private static ExcelWorkBook excelWorkBook = null; private static String filePath; private static XSSFWorkbook workbook; /** * This constructor used to initialize the {@link ExcelWorkBook} * @throws IOException */ private ExcelWorkBook() throws IOException { try { workbook = new XSSFWorkbook(getFile()); } catch (FileNotFoundException ex) { Logger.getLogger(ExcelWorkBook.class.getName()).log(Level.SEVERE, null, ex); } } /** * This method create a new object {@link ExcelWorkBook} * @return {@link ExcelWorkBook} * @throws IOException */ public static ExcelWorkBook getInstance() throws IOException { excelWorkBook = new ExcelWorkBook(); return excelWorkBook; } /** * This method create a {@link FileInputStream} * @return {@link FileInputStream} * @throws FileNotFoundException */ private FileInputStream getFile() throws FileNotFoundException { FileInputStream file = new FileInputStream(new File(filePath)); return file; } . . . . 

但是,在使用MS Office 2010创build的特定文件中抛出以下exception,并且未使用Libre办公室。 可能是什么问题呢。 exception的堆栈跟踪如下所示

  org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:61) ~[poi-ooxml-3.7.jar:3.7] at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:277) ~[poi-ooxml-3.7.jar:3.7] at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:282) ~[poi-ooxml-3.7.jar:3.7] at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:186) ~[poi-ooxml-3.7.jar:3.7] at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:189) ~[poi-ooxml-3.7.jar:3.7] at com.excel.ExcelWorkBook.<init>(ExcelWorkBook.java:48) at com.excel.ExcelWorkBook.getInstance(ExcelWorkBook.java:60) at com.excel.ExcelParser.<init>(ExcelParser.java:64) at com.database.DatabaseLoader.process(DatabaseLoader.java:85) at com.fileuploader.FileUploadHandler.doPost(FileUploadHandler.java:116) . . . . at java.lang.Thread.run(Thread.java:662) [na:1.6.0_45] [STDOUT] Caused by: java.lang.reflect.InvocationTargetException: null [STDOUT] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.6.0_45] [STDOUT] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) ~[na:1.6.0_45] [STDOUT] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) ~[na:1.6.0_45] [STDOUT] at java.lang.reflect.Constructor.newInstance(Constructor.java:513) ~[na:1.6.0_45] [STDOUT] at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:59) ~[poi-ooxml-3.7.jar:3.7] [STDOUT] ... 42 common frames omitted [STDOUT] Caused by: org.apache.xmlbeans.XmlException: error: duplicate attribute 'type' [STDOUT] at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3471) ~[xmlbeans-2.3.0.jar:na] [STDOUT] at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1270) ~[xmlbeans-2.3.0.jar:na] [STDOUT] at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1257) ~[xmlbeans-2.3.0.jar:na] [STDOUT] at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345) ~[xmlbeans-2.3.0.jar:na] [STDOUT] at org.apache.xmlbeans.XmlObject$Factory.parse(XmlObject.java:663) ~[xmlbeans-2.3.0.jar:2.3.0-r540734] [STDOUT] at org.apache.poi.xssf.usermodel.XSSFVMLDrawing.read(XSSFVMLDrawing.java:107) ~[poi-ooxml-3.7.jar:3.7] [STDOUT] at org.apache.poi.xssf.usermodel.XSSFVMLDrawing.<init>(XSSFVMLDrawing.java:102) ~[poi-ooxml-3.7.jar:3.7] [STDOUT] ... 47 common frames omitted [STDOUT] Caused by: org.xml.sax.SAXParseException: duplicate attribute 'type' [STDOUT] at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.reportFatalError(Piccolo.java:1038) ~[xmlbeans-2.3.0.jar:na] [STDOUT] at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:723) ~[xmlbeans-2.3.0.jar:na] [STDOUT] at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3439) ~[xmlbeans-2.3.0.jar:na] [STDOUT] ... 53 common frames omitted 

在我用Libe Office编辑一个包含注释的.xlsx文件之后,我遇到了完全相同的exception。 删除评论解决了这个问题。

您的Excel将首先被parsing成XML。 这个exception发生在xml无效时。 当您使用Microsoft Office创buildExcel工作表,然后使用Libre或Open Office等其他软件编辑工作表时,可能会出现这种情况。

我不知道Open Office或Libre Office是做什么的,但是他们对POI不喜欢的文档做了些什么。

使用Microsoft Excel来阅读或编辑您的工作表。 它不幸的为我工作。

我已经在项目中插入了org.apache.xmlbeans。 它帮助。