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

在 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();

            }

        }

    }

}


皈依舞
浏览 231回答 1
1回答

墨色风雨

将评论提升为答案您似乎遇到了旧版本的 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 修复!)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java