获取“IllegalArguementException:参数'id'的值超出范围”for poi(最新版本)apache库。
java.lang.IllegalArgumentException: Value for parameter 'id' was out of bounds
at org.apache.poi.util.IdentifierManager.reserve(IdentifierManager.java:80)
at org.apache.poi.xwpf.usermodel.XWPFRun.<init>(XWPFRun.java:110)
at org.apache.poi.xwpf.usermodel.XWPFParagraph.buildRunsInOrderFromXml(XWPFParagraph.java:126)
at org.apache.poi.xwpf.usermodel.XWPFParagraph.<init>(XWPFParagraph.java:79)
at org.apache.poi.xwpf.usermodel.XWPFDocument.onDocumentRead(XWPFDocument.java:146)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:159)
at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:116)
导致此异常的语句是
XWPFDocument doc=new XWPFDocument(OPCPackage.open(fis1));
其中fis1
是一个简单的FileInputStream
对象。
答案 0 :(得分:4)
这显然(至少)发生在LibreOffice的docx文件中。
除了使用Microsoft Office重新保存该文档的解决方法之外,还可以进行代码修复:
问题是org.apache.poi.util.IdentifierManager初始化为org.apache.poi.xwpf.usermodel.XWPFDocument中从1开始的ID;但是docx文件可以包含从0开始的(有效)ID。
在编译此构造函数调用以从0开始而不是1并构建本地版本的POI JAR之后,POI可以正常使用过去导致上述错误消息的文档。