3

获取 poi(最新版本)apache 库的“IllegalArguementException:参数 'id' 的值超出范围”。

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)); where fis1is a simple FileInputStreamObject。

4

1 回答 1

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 可以正确处理用于在此处导致上述错误消息的文档。

于 2013-09-17T15:43:22.280 回答