Java APACHE POI EXCEL XmlException:是无效的XML字符,是否有任何方法预处理EXCEL文件?

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

我使用java和ApachePOI读取.xlsx文件(60k+行),但我得到了错误

我使用poi和xmlbeans的最新版本maven插件

根据我在StackOverflow中发现的相关问题,最新的poi应该能够成功地处理具有特殊字符的文件

如果是xml文件,我可以自己替换程序中的特殊字符。但它是一个excel文件

困难在于我不知道如何使用poi成功读取“excel”文件

或者是否有任何方法来处理该文件

我使用openjdk,版本:“1.8.0_171-1-redhat”

错误消息如下所示

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 "&#55357" 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> 
&#55357;&#56397;&#55357;&#56397;&#55357;&#56397;
&#55357;&#56397;
&#55357;&#56397;&#55357;&#56397;&#55357;&#56397;&#55357;&#56397;&#55357;&#56397;&#55357;&#56397;&#55357;&#56397;
etc....