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