Как вставить 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
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 заменяет байты суррогатной пары на вопросительные знаки.