为了账号安全,请及时绑定邮箱和手机立即绑定

Apache POI 从文件读取时抛出编码错误,而不是从 Stream 读取

Apache POI 从文件读取时抛出编码错误,而不是从 Stream 读取

皈依舞 2021-09-15 10:48:32
在 Java (7) 中通过 Apache POI (3.17) 加载特定 Excel (XLSX) 文件时,我收到有关编码 ( org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 2 of 4-byte UTF-8 sequence)的异常。这似乎是在读取sharedStrings.xml文件时(注意此文件以 UTF8 编码)。但是,如果我通过 anInputStream而不是 a加载文件File,则文件会正确加载。在这两种情况下,我都(或可以)指定编码。我知道从 an 加载InputStream不是最佳的,我很想避免这种情况。我写了一个小例子来强调我的问题,但不幸的是我无法分享有问题的文件:import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.text.MessageFormat;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.ss.usermodel.WorkbookFactory;public class POIEncodingIssue{    public static void main(final String[] args) throws Exception    {        final File file = new File("path\\to\\my\\file.xlsx"); //$NON-NLS-1$        Workbook workbook = null;        // This works        System.out.println("Trying Stream based approach..."); //$NON-NLS-1$        try (InputStream stream = new FileInputStream(file))        {            workbook = WorkbookFactory.create(stream);            System.out.println(MessageFormat.format("Value was \"{0}\"", workbook.getSheetAt(0).getRow(0).getCell(0))); //$NON-NLS-1$        }        catch (final Exception e)        {            e.printStackTrace();        }        finally        {            if (workbook != null)            {                workbook.close();            }        }        // This doesn't        System.out.println("Trying File based approach..."); //$NON-NLS-1$        try        {            workbook = WorkbookFactory.create(file);            System.out.println(MessageFormat.format("Value was \"{0}\"", workbook.getSheetAt(0).getRow(0).getCell(0))); //$NON-NLS-1$        }        catch (final Exception e)        {            e.printStackTrace();        }        finally        {            if (workbook != null)            {                workbook.close();            }        }    }}
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

将评论提升为答案

您似乎遇到了旧版本的 Apache XML Beans 中的错误。如果您至少升级到Apache XML Beans 3.0.1,您应该会发现问题消失了。

理想情况下,您还至少升级到 Apache POI 4.0.0,这需要更新的 xmlbeans,但这需要 Java 8+。XML Beans 向后兼容,因此您可以坚持使用 POI 3.17 并升级 xmlbeans 没有问题(尽管显然没有 4 中的 POI 修复!)


查看完整回答
反对 回复 2021-09-15
  • 1 回答
  • 0 关注
  • 230 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信