Выдача кодировки java-> xls - PullRequest
0 голосов
/ 03 июня 2010

Это не чисто вопрос Java, а также может быть связано с HTML

Я написал Java-сервлет, который запрашивает таблицу базы данных и отображает результат в виде таблицы HTML.Пользователь также может попросить получить результат в виде листа Excel.Я создаю лист Excel, печатая ту же HTML-таблицу, но с типом содержимого "application / vnd.ms-excel".Файл Excel создан нормально.Проблема в том, что таблицы могут содержать неанглийские данные, поэтому я хочу использовать кодировку UTF-8.

PrintWriter out = response.getWriter();
response.setContentType("application/vnd.ms-excel:ISO-8859-1");
//response.setContentType("application/vnd.ms-excel:UTF-8");
response.setHeader("cache-control", "no-cache");
response.setHeader("Content-Disposition", "attachment; filename=file.xls");
out.print(src);
out.flush();

Неанглийские символы отображаются в виде мусора (пометкой)

ТакжеЯ попытался преобразовать в байты из String

byte[] arrByte = src.getBytes("ISO-8859-1");
String result = new String(arrByte, "UTF-8");

Но я все еще получаю мусор, что я могу сделать ?.Спасибо

ОБНОВЛЕНИЕ: если я открываю файл Excel в блокноте + +, тип кодировки файла - «UTF-8 без спецификации», если я изменяю кодировку на «UTF-8», а затем открываю файл вExcel, иероглифы «бейсболка» выглядят неплохо.

Ответы [ 4 ]

1 голос
/ 03 июня 2010

Excel - это двоичный формат, а не текстовый формат, поэтому вам не нужно устанавливать какую-либо кодировку, поскольку она просто не применяется. Независимо от того, какую систему вы используете для создания файла Excel (например, Apache Poi), позаботится о кодировании текста в файле Excel.

Не следует пытаться преобразовать полученные байты в строку, просто сохраните их в байтовом массиве или запишите в файл.

РЕДАКТИРОВАТЬ: из комментария звучит не так, как будто вы используете «настоящий» двоичный файл Excel, но текстовый файл с разделителями табуляции (CSV). В этом случае убедитесь, что вы используете согласованную кодировку, например, UTF-8 повсюду.

Кроме того, прежде чем звонить response.getWriter(), сначала позвоните setContentType.

См. HttpServletResponse.getPrintWriter ()

РЕДАКТИРОВАТЬ: Вы можете попробовать написать спецификацию. Обычно это не требуется, но обработка форматов файлов в Office далека от обычной ...

В Java на самом деле нет поддержки спецификации. Вам придется подделать это. Это означает, что вам нужно использовать ответ outputStream, а не write, так как вам нужно записать необработанные байты (BOM). Таким образом, вы измените свой код на это:

response.setContentType("application/vnd.ms-excel:UTF-8");
// set other headers also, "cache-control" etc..
OutputStream outputStream = response.getOutputStream();
outputStream.write(0xEF);   // 1st byte of BOM
outputStream.write(0xBB);
outputStream.write(0xBF);   // last byte of BOM
// now get a PrintWriter to stream the chars.
PrintWriter out = new PrintWriter(new OutputStreamWriter(outputStream,"UTF-8"));
out.print(src);
0 голосов
/ 08 октября 2015

У меня была та же проблема .. я исправил это с использованием print () вместо write ()

outputStream.print('\ufeff');
0 голосов
/ 04 июня 2010

Попробуйте использовать метод ServletResponse.setCharacterEncoding(java.lang.String charset).

response.setCharacterEncoding("UTF-8");
0 голосов
/ 03 июня 2010

Получаете ли вы "мусор" при выводе результата на стандартный вывод?

Редактировать (код в тегах кода из комментария ниже): response.setContentType("application/vnd.ms-excel; charset=UTF-8")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...