Как вставить Emoji в файл Excel, используя POI-XSSF в Java

Я использую приведенный ниже код для вставки смайликов в Excel с помощью Apache POI-HSSF. Пожалуйста, дайте мне знать, как я могу вставить смайлики в файл.xlsx с помощью POI-XSSF в Java,

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

Любая помощь будет высоко оценен.

0 ответов

Это работает с xmlbeans 3.0.0

Кто-то упомянул версию 2.6.2, которая больше не индексируется (на данный момент, июнь 2019 г.), поэтому сразу переходите к 3.xx

Вам необходимо перейти с 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: цикл EntizeContent CDATA повторяется слишком много раз (вызывает ошибку утверждения или исключение ArrayIndexOutOfBoundsException при замене)

    Исправление для XMLBEANS-332: XMLBeans заменяет байты суррогатной пары на вопросительные знаки.

Другие вопросы по тегам