【问题标题】:How to insert emoji in Excel file using POI-XSSF in Java如何在 Java 中使用 POI-XSSF 在 Excel 文件中插入表情符号
【发布时间】:2017-09-15 12:00:30
【问题描述】:

我正在使用以下代码,使用 apache POI-HSSF 将表情符号插入 excel,请告诉我如何在 Java 中使用 POI-XSSF 将表情符号插入 .xlsx 文件,

Workbook workBook =new HSSFWorkbook();
Sheet createSheet = workBook.createSheet("Emoji");
String str ="????????"+"somevalue";

Row createRow = createSheet.createRow(0);
createRow.createCell(0).setCellValue(str);
//creating a file and writing the Workbook data 
try {
    FileOutputStream fileOutputStream = new FileOutputStream("/tmp/MyFirstExcel.xls");
    workBook.write(fileOutputStream);
    fileOutputStream.close();
} catch (IOException iException) {
    System.out.println("IO exception occured while creating the file" + iException.getMessage());
}

任何帮助将不胜感激。

【问题讨论】:

  • 您的代码对我有用。你有什么问题?您使用的是哪个apache poi 版本和哪个Excel 版本?
  • 之所以有效,是因为我使用的是“HSSFWorkbook”,但我希望使用“XSSF”获得相同的功能
  • 那么这应该是问题的一部分,不是吗? XSSF 使用 unicode 的问题见 stackoverflow.com/questions/38007641/…xmlbeans-2.6.0.jar 中有一个错误。我的补丁对我有用。前段时间我发现了一个xmlbeans-2.6.2.jar,其中已经包含了那个补丁。但是再也找不到了。
  • 正如我所说,使用这个罐子对我有用。当然,您需要从类路径中删除 xmlbeans-2.3.0.jar。否则这可能会被使用。
  • 抱歉,因为我没有使用 Maven,所以我无能为力。但肯定是 groupId 不同,因为两个罐子都来自不同的来源。因此,我建议您通过显示哪些有效和哪些无效并另外添加标签maven 来完善您的问题。那么maven 专家可能会回答这个问题。

标签: java apache-poi xssf


【解决方案1】:

您需要从 xmlbeans-2.6.0 升级到更高版本。我确实用 3.1.0 替换了它 加上你的 UTF-8 需要强制执行。这一步不是必须的,而是确保

String cleanedText = StringEscapeUtils.unescapeJava(yourstringhere);
                    byte[] bytes = cleanedText.getBytes(StandardCharsets.UTF_8);
                    String text = new String(bytes, StandardCharsets.UTF_8);
                    Charset charset = Charset.forName("UTF-8");
                    CharsetDecoder decoder = charset.newDecoder();
                    decoder.onMalformedInput(CodingErrorAction.IGNORE);
                    decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
                    CharsetEncoder encoder = charset.newEncoder();
                    encoder.onMalformedInput(CodingErrorAction.IGNORE);
                    encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
                    try {
                        // The new ByteBuffer is ready to be read.
                        ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(text));
                        // The new ByteBuffer is ready to be read.
                        CharBuffer cbuf = decoder.decode(bbuf);
                        String str = cbuf.toString();
                        RichTextString rx = createHelper.createRichTextString(str);
                            row.createCell((short) 1).setCellValue(rx);
                    } catch (CharacterCodingException e) {
                        logger.error("PUT SOME CODE HERE FOR DEBUGGING");
                        row.createCell((short) 1).setCellValue(new XSSFRichTextString(""));
                    }

不要忘记这一点,它不会在 HttpServletResponse 响应的转换中丢失:

        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
        response.setHeader("Content-Disposition", "attachment; filename=" + filename + ";");

顺便说一下,这里是 xmlbeans 2.6.0 与 3.1.0 的更改日志

  1. XMLBEANS-517:使用安全的 XML 解析器

    XMLBEANS-516:删除不必要的 javax 和 org.w3c 类

    XMLBEANS-515:删除短笛支持

    XMLBEANS-514:使 java 6 成为支持的最低运行时

    XMLBEANS-489:修复 Cursor getAllNamespaces 不返回默认值 命名空间

    修复 XMLBEANS-499:xmlbeans2.6.0.jar 包含重复的类 文件(在 Android 上引起问题)

    XMLBEANS-447:删除 ConcurrentReaderHashMap 源代码

    修复 XMLBEANS-404:entitizeContent CDATA 循环迭代次数过多 次(导致断言错误或 ArrayIndexOutOfBoundsException 在 替换)

    修复 XMLBEANS-332:XMLBeans 将代理对字节更改为 问号

【讨论】:

    【解决方案2】:

    这从 xmlbeans 3.0.0 开始工作

    有人提到2.6.2版本,已经没有索引了(截至目前,2019年6月),所以直接跳到3.x.x

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2018-03-08
      相关资源
      最近更新 更多