org.apache.poi.POIXMLException:使用 Libre Office 更新 .xls 文件后 POI API 中的 java.lang.reflect.InvocationTargetException
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25364338/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException in POI API after an .xls file is updated with Libre Office
提问by arjuncc
I am reading an Excel using POI api, I use the following code to read the excel file.
我正在使用 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;
}
.
.
.
.
But its throwing following exception in a particular file which is created using MS Office 2010 and undated using Libre office. What could Be the problem. The Stack trace of exception is attached below
但是它在使用 MS Office 2010 创建并使用 Libre office 未注明日期的特定文件中抛出以下异常。可能是什么问题呢。异常的堆栈跟踪附在下面
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
回答by Gilles
I had exactly the same exception after I edited with Libe Office a .xlsx file containing comments. The removal of the comments solved the issue.
在使用 Libe Office 编辑包含注释的 .xlsx 文件后,我遇到了完全相同的异常。删除评论解决了这个问题。
回答by Goot
Your Excel will be parsed into XML first. This exception happens when the xml is invalid. This can be the case when you create the Excel Sheet with Microsoft Office and then edit the Sheet with some other Software like Libre or Open office.
您的 Excel 将首先被解析为 XML。当 xml 无效时会发生此异常。当您使用 Microsoft Office 创建 Excel 工作表,然后使用其他一些软件(如 Libre 或 Open office)编辑该工作表时,就会出现这种情况。
I don't know what it is that Open Office or Libre Office do, but they do something to the document that POI doesn't like.
我不知道 Open Office 或 Libre Office 是做什么的,但他们对 POI 不喜欢的文档做了一些事情。
Use Microsoft Excel to read or edit your sheets. It worked for me, unfortunately.
使用 Microsoft Excel 阅读或编辑您的工作表。不幸的是,它对我有用。
回答by user3544805
I have inserted org.apache.xmlbeans in project. It helped.
我在项目中插入了 org.apache.xmlbeans。它有帮助。