使用POI读取.xlsm和.xlsx时出现异常

时间:2012-05-24 08:24:48

标签: java apache-poi

我试图阅读.xls,.xlsm和.xlsx表。 如果尝试读取.xls工作表,代码可以正常工作,但如果尝试读取.xlsm和.xlsx工作表则显示异常。我在类路径中配置了必要的jar文件 -

poi-3.8-20120326.jar,
poi-examples-3.8-20120326.jar,
poi-excelant-3.8-20120326.jar,
poi-ooxml-3.8-20120326.jar,
poi-ooxml-schemas-3.8-20120326.jar,
poi-scratchpad-3.8-20120326.jar,
ooxml-schemas-1.0.jar,
xmlbeans-2.3.0.jar,
dom4j-1.6.1.jar,
geronimo-stax-api_1.0_spec-1.0.1.jar

但是我也遇到了错误 -

Exception in thread "main" org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:62)
at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:403)
at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:408)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:155)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:183)
at screens.LireEcrire.main(LireEcrire.java:26)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:60)
... 5 more
Caused by: org.apache.xmlbeans.XmlException: error: duplicate attribute 'o:relid'
at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3471)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1270)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1257)
at   org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
at org.apache.xmlbeans.XmlObject$Factory.parse(XmlObject.java:663)
at org.apache.poi.xssf.usermodel.XSSFVMLDrawing.read(XSSFVMLDrawing.java:107)
at org.apache.poi.xssf.usermodel.XSSFVMLDrawing.<init>(XSSFVMLDrawing.java:102)
... 10 more
Caused by: org.xml.sax.SAXParseException: duplicate attribute 'o:relid'
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.reportFatalError(Piccolo.java:1038)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:723)
at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3439)
... 16 more

2 个答案:

答案 0 :(得分:1)

Excel生成了错误的xml。可能是特别的。

阅读本文:https://bz.apache.org/bugzilla/show_bug.cgi?id=53819

由错误的xml引起。

这可以通过manully删除duplcate属性定义来解决。

  

堆栈跟踪告诉该文件包含无效的xml。我检查了附件,确实如此:   /xl/drawings/vmlDrawing1.vml包含不允许的重复属性,   看看以下fragemnt:

  <v:fill o:relid="rId1" o:relid="rId1" o:relid="rId1" o:relid="rId1" o:relid="rId1"
   o:relid="rId1" o:relid="rId1" o:relid="rId1" o:relid="rId1" o:relid="rId1"
   o:relid="rId1" o:relid="rId1" o:relid="rId1" o:relid="rId1" o:relid="rId1"
   o:relid="rId1" o:relid="rId1" o:relid="rId1" o:relid="rId1" o:relid="rId1"
   o:relid="rId1" o:relid="rId1" o:relid="rId1" o:relid="rId1" o:relid="rId1"

您可以将xslx打开为zip存档,找到此文件并进行修复。

答案 1 :(得分:0)

您可能需要POI-XSSF才能阅读新格式的XLS文件(精心命名为.XLSX)。