【问题标题】:Writing Unicode plane 1 characters with Apache POI使用 Apache POI 编写 Unicode 平面 1 字符
【发布时间】:2018-08-14 09:28:43
【问题描述】:

我正在尝试将 Unicode 字符写入 Excel 文件。我使用 Unicode 平面 0 成功地做到了,但没有使用 Unicode 平面 1。

我使用 POI 3.16 并使用这段简单的代码进行测试:

    public void createFile() throws IOException {
        SXSSFWorkbook workbook = new SXSSFWorkbook(1);
        SXSSFSheet sheet = workbook.createSheet("data");

        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);
        String value = "????????????ᚬᚬᚬ";
        cell.setCellValue(value);

        try (FileOutputStream fop = new FileOutputStream("C:\\Users\\Emilien\\PROJECTS_FILES\\BUGS\\SLIMS_14124\\test.xlsx")) {
            workbook.write(fop);
        } finally {
            workbook.dispose();
        }
    }

在 excel 2016 中,单元格包含“??????ᚬᚬᚬ”,而不是显示“????????????ᚬᚬᚬ”。 在这里 ???? 找到有关字符的 URL。

我解压了excel文件,查看了data表的内容,cell对应的XML内容是:

<row r="1">
   <c r="A1" t="inlineStr"><is><t>??????&#5804;&#5804;&#5804;</t></is></c> 
</row>

如我们所见,平面 0 的字符已被转换为 HTML Unicode 字符,而平面 1 的字符已丢失。

如果我改变“??????”经过 ”????????????”在 XML 文件中,然后再次将文件压缩到新的 xlsx 文件中,字符将按需要呈现(意思是,单元格实际上包含????????????ᚬᚬᚬ)。

Java 字符串似乎不是以 UTF-8 格式写入 XML,而是似乎由 POI 处理(我们以 HTML 字符结尾)。有谁之前经历过这个吗 ?是否可以将 SMP 字符写入 Excel 文件?

这可能是一个错误吗?我的意思是,XML 文件在其标头中声明了 UTF-8 编码,但似乎并不尊重它。我错过了什么吗?

<?xml version="1.0" encoding="UTF-8"?>

【问题讨论】:

标签: java excel character-encoding apache-poi


【解决方案1】:

解决方案因使用apache poi 的流部分SXSSFapache poi 的默认XSSF 部分而异。

There was a problem with xmlbeans-2.6.0.jar apache poi 直到版本 3.17 用于访问 XML。该库已将字符的高代理范围 (\uD800-\uDBFF) 和低代理范围 (\uDC00-\uDFFF) 排除为“坏字符”。这就是为什么所有需要这些代理范围的 Unicode 都无法正确处理的原因。那是从 0x10000 向上的 Unicode 范围。见Supplementary Characters as Surrogates

然后使用apache poi 版本3.17 这个问题在他们的流媒体SXSSF 部分中得到解决,因此SXSSF 也可以使用xmlbeans-2.6.0.jar。因此流式处理SXSSF 部分的解决方案只需更新为apache poiversion 3.17

SXSSF 默认创建内联字符串,并且与XSSF 部分不同。这就是为什么 XSSF 在需要高于 0xFFFF 的 Unicode 并使用 xmlbeans-2.6.0.jar 时会进一步创建错误的 XML 的原因。为了在XSSF 中解决这个问题,需要更新版本的 XMLBeans。有xmlbeans-2.6.2.jar 和现在xmlbeans-3.0.0.jar 可用。两者都在用apache poiXSSF 部分解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多