Java APACHE POI EXCEL XmlException:是无效的XML字符,是否有任何方法预处理EXCEL文件?
我使用java和ApachePOI读取.xlsx文件(60k+行),但我得到了错误 我使用poi和xmlbeans的最新版本maven插件 根据我在StackOverflow中发现的相关问题,最新的poi应该能够成功地处理具有特殊字符的文件 如果是xml文件,我可以自己替换程序中的特殊字符。但它是一个excel文件 困难在于我不知道如何使用poi成功读取“excel”文件 或者是否有任何方法来处理该文件 我使用openjdk,版本:“1.8.0_171-1-redhat” 错误消息如下所示Java APACHE POI EXCEL XmlException:是无效的XML字符,是否有任何方法预处理EXCEL文件?,java,excel,apache-poi,Java,Excel,Apache Poi,我使用java和ApachePOI读取.xlsx文件(60k+行),但我得到了错误 我使用poi和xmlbeans的最新版本maven插件 根据我在StackOverflow中发现的相关问题,最新的poi应该能够成功地处理具有特殊字符的文件 如果是xml文件,我可以自己替换程序中的特殊字符。但它是一个excel文件 困难在于我不知道如何使用poi成功读取“excel”文件 或者是否有任何方法来处理该文件 我使用openjdk,版本:“1.8.0_171-1-redhat” 错误消息如下所示 Ca
Caused by: java.io.IOException: unable to parse shared strings table
at org.apache.poi.xssf.model.SharedStringsTable.readFrom(SharedStringsTable.java:134)
at org.apache.poi.xssf.model.SharedStringsTable.<init>(SharedStringsTable.java:111)
... 11 more
Caused by: org.apache.xmlbeans.XmlException: error: Character reference "�" is an invalid XML character.
at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3440)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1272)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1259)
at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
at org.openxmlformats.schemas.spreadsheetml.x2006.main.SstDocument$Factory.parse(Unknown Source)
at org.apache.poi.xssf.model.SharedStringsTable.readFrom(SharedStringsTable.java:123)
pom.xml
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.0</version>
</dependency>
由于您的问题标题包含“是否有任何方法预处理excel文件?”的问题,我将尝试回答以下问题: 假设:
*.xlsx
文件中的/xl/sharedStrings.xml
包含UTF-16-代理项对xml数字字符引用,如和#55357
=在ticket.xlsx
ZIP存档中的/xl/sharedStrings.xml
肯定有问题。那ticket.xlsx
文件来自哪里?如果您使用Excel
打开ticket.xlsx
会发生什么?Excel文件来自我们的业务合作伙伴(中文)。当我用Excel打开文件时,它看起来很好。我相信如果没有文件ticket.xlsx
,几乎不可能提供帮助。如果您使用Excel
打开ticket.xlsx
,是否使用Excel
重新保存它?apachepoi
是否能够正确读取共享字符串XML?如果解压ticket.xlsx
并提取/xl/sharedStrings.xml
,会发生什么情况?您是否能够使用浏览器或XML读取器正确打开此XML文件?很抱歉,我无法公开这些文件,并且无法正确打开XML文件。我猜内容包含特殊字符。“我猜内容包含特殊字符。”:特殊字符不会是问题。但是和#55357
不是特殊字符,而是0xFFFF以上unicode字符的UTF-16代理项对的一部分。此字符引用不能出现在Office Open XML中,因为那里的编码必须是UTF-8。因此,您的ticket.xlsx
确实在/xl/sharedStrings.xml
中被破坏了。我非常感谢您为解决方案提供的所有帮助。我已经使用java来解压文件,并获取sharedStrings.xml进行解析。但是,I stll不能替换所有可能的UTF-16代理项对XML数字字符引用。你知道吗?或者可以给我一些提示吗?另一个问题是字符串值包含多个UTF-16代理项对XML数字字符引用。如下所示@蒋迈克:我只是假设有像和#55357代码>。你从来没有在你的问题中说过。但在你的问题中,你应该至少用一些例子来说明这一点,以使问题更加清楚。然后下一步是在XML文本中查找所有这些引用,如果找到,则用Unicode替换它们。这值得再问一个问题。人们想到了多种可能性:解析为UTF-16HTML,然后将该HTML转换为Unicode UTF-8。或者从找到的代理项对H和L计算Unicode N:N=(H-0xD800)*0x400+(L-0xDC00)+0x10000
。@mike.jiang:或者将这些缺陷文件交还给创建它们的人。那些家伙肯定做错了。他们现在应该修好它。这就是我要做的。@mike.jiang:关于如何做的一个例子,请参阅我的副刊。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.0</version>
</dependency>
������
��
��������������
etc....