Получение вопросительного знака вместо нескольких пробелов while при экспорте в Excel в apache poi

#java #excel #apache

#java #excel #apache

Вопрос:

Я получаю символ вопросительного знака (?) вместо нескольких пробелов в выходных данных Excel. Я использую apache poi 3.7. Для одного пробела он работает нормально.

Например:-

если мой ввод равен «a b», то сгенерированный результат равен «a? b». Здесь a и b имеют два пробела между ними.

Комментарии:

1. Закодируйте, пожалуйста. Как мы могли бы помочь без кода?

Ответ №1:

Этот фрагмент кода работает просто отлично. Можете ли вы сравнить со своим собственным кодом и опубликовать какой-нибудь пример кода, если у вас все еще есть проблема?

     Workbook book = new HSSFWorkbook();
    Sheet sheet = book.createSheet();

    Row oRow = sheet.createRow(1);
    Cell oCell = oRow.createCell(1);
    oCell.setCellValue("a  b");

    OutputStream out = new FileOutputStream("c:\temp\test.xls");
    book.write(out);
    out.close();
  

Комментарии:

1. Спасибо, Эрик. Мой код такой же, как вы упомянули. Вывод в Microsoft office идеален. Только это создает проблему с Open Office. Я думаю, что при написании в open office может возникнуть какая-то проблема с кодировкой, и именно поэтому он показывает вопросительный знак (?) вместо нескольких пробелов.

2. Я только что открыл файл, сгенерированный моим кодом в Open Office v3.4.1, и он показывает правильные данные, без вопросительных знаков. Вы уверены, что ваш код выводит «пробелы», а не какой-либо другой «пустой символ»?

3. Да, Эрик. Я также пытался сделать то же самое. Я взял одну строку и напечатал в Excel, и она отлично отображалась в Excel и open office. Но мои данные поступают из отсканированного PDF-файла, и я конвертирую отсканированный PDF-файл в читаемый, а затем печатаю данные в Excel. Я также анализировал данные в режиме отладки, но во время вставки в Excel они выглядят идеально.

4. Сначала вы должны более точно просмотреть свои данные. Например: выполните цикл для каждого символа в вашей строке и выведите числовое значение с чем-то вроде «System.out.print((int)ch)». Скорее всего, вы обнаружите, что некоторые пробелы кодируются не ’32’ (пробел), а, возможно, ‘160’ (неразрывный пробел, см. en.wikipedia.org/wiki/Non-breaking_space ). Если это так, вам следует заменить эти символы 160 на обычные символы 32 перед экспортом.

5. Обратите внимание, что я только что протестировал, и даже неразрывные пробелы отлично экспортируются в Excel и Open Office (строка Java «a u00A0 b»)… Не могли бы вы, пожалуйста, вставить сюда результат этого кода в вашу строку ‘str’ ? : /*****/ System.out.print(«Str=[«); for(int i = 0; i < str.length(); i) System.out.print(Integer.toHexString((int)str.charAt(i)) «-«); System.out.println(«]»); /*****/

Ответ №2:

Попробуйте открыть сгенерированную электронную таблицу в Microsoft Excel.

Это проблема с кодировкой. Иногда может случиться так, что если ваш ввод содержит несколько пробелов, то Open office отображает вас как «?».

Ответ №3:

Для дальнейшего использования это решило мою проблему. Как указал Эрик, сначала следует выяснить, какие коды символов создают проблемы, в моем конкретном случае это нули.

 String s = getStringFromSource();
s = s.replace('u0000', 'u0020'); // check values with dec to hexa first, u0020 means 32
cell.setValue(s);