Apache POI jar не может записать специальный символ в файл Excel - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть специальный символ в моей строке, который я хочу записать в файл Excel, но poi jar заменяет его на?

Специальный символ, как показано ниже:

enter image description here

Некоторые сайты выкидывают ниже юникода

1)

Unicode character          Oct  Dec Hex HTML
\x{F}   si shift in ctrl-o  017 15  0xF 

2)

U+000F : <control-000F> (SHIFT IN [SI])

Пример:

Моя строка как показано ниже

enter image description here

Excel показывает вывод в виде:

PrincipalOffice~?DIRECTION

Код, который я использую, как показано ниже:

String filename= "D:\\DataFiles\\"+File+"";
XSSFWorkbook hwb =new XSSFWorkbook();
XSSFSheet sheet =  hwb.createSheet("Data");
XSSFRow rowhead=   sheet.createRow((short)0);
rowhead.createCell((short) 0).setCellValue("my");
XSSFRow row=   sheet.createRow((short)i);
String value = "PrincipalOffice~DIRECTION";
row.createCell((short) 0).setCellValue(value);
FileOutputStream fileOut =  new FileOutputStream(filename);
hwb.write(fileOut);
fileOut.close();
hwb.close();

Я пробовал с 3,15 и 3,17 банок apache poi Нужно ли использовать какой-нибудь другой библиотека? Если да, предложите

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Добавление к точке Акселя.

Есть много управляющих символов. Чтобы их идентифицировать, выведите свои данные в notepad ++ или в любой инструмент, который покажет вам имя / данные управляющего символа.

Ниже приведена ссылка, в которой перечислены все управляющие символы

https://ascii.cl/control-characters.htm

Теперь нашел свой юникод в гугле как "si юникод". Вы найдете строку типа U + 000F.

Теперь замените строку как \u000F и вставьте вместо, как _x000F_

Некоторые примеры:

U+000F <Shift In> (SI) Unicode Character - Compart

value = value.replace("\u000F", "_x000F_");

U+001C <File Separator> (FS) Unicode Character - Compart

value = value.replace("\u001C", "_x001C_");

U+001E <Record Separator> (RS) Unicode Character - Compart

value = value.replace("\u001E", "_x001E_");
0 голосов
/ 05 сентября 2018

Символ 0x0F или &#15;, о котором вы упомянули, не может быть сохранен непосредственно в XML, поскольку он является управляющим символом. Таким образом, поскольку файлы *.xlsx хранят содержимое с использованием XML, этот символ не может быть сохранен напрямую.

Тем не менее Microsoft определяет: ECMA-376, часть 1 22.4 Типы вариантов 22.4.2.4 bstr (базовая строка) :

22.4.2.4 bstr (базовая строка)

Этот элемент определяет двоичный базовый тип варианта строки, который может хранить любой допустимый символ Unicode. Символы Unicode, которые нельзя напрямую представить в XML как определяется спецификацией XML 1.0, следует экранировать с помощью Числовое представление символов Юникода _xHHHH_, где H представляет шестнадцатеричный символ в значении символа. [Пример: символ Unicode 8 не разрешен в XML 1.0, поэтому он должен быть экранирован как _x0008_. end example] Чтобы сохранить буквенную форму escape-последовательности, начальное подчеркивание должно сам по себе избежать (т. е. хранится как _x005F_). [Пример: строка литерал _x0008_ будет храниться как _x005F_x0008_. конец примера]

The возможные значения для этого элемента определяются XML-схемой W3C тип данных строки.

Это расширяет тип данных строки XML-схемы W3C. Так что последовательность символов _xHHHH_ имеет особое значение как вид сущности, такой как &#xHHHH;.

Таким образом, будет работать следующее и Excel будет содержать символ 0x0F в качестве содержимого ячейки.

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class CreateExcelControlCharacter {

 public static void main(String[] args) throws Exception {

  Workbook wb = new XSSFWorkbook();

  Sheet sheet = wb.createSheet();
  Row row = sheet.createRow(0);
  Cell cell = row.createCell(0);

  String value = "PrincipalOffice\u000FDIRECTION";

  value = value.replace("\u000F", "_x000F_");

  cell.setCellValue(value);

  wb.write(new FileOutputStream("CreateExcelControlCharacter.xlsx"));
  wb.close();
 }

}

Но могу ли я спросить, зачем вам нужен этот управляющий символ для содержания Excel? Это может быть ответом на мой вопрос Полезные сценарии использования формата escape-символа _xHHHH_ в Office Open XML? .

...