#java #excel #google-app-engine #apache-poi
#java #excel #google-app-engine #apache-poi
Вопрос:
Я создаю файл MS Excel с использованием Apache POI, и все работает нормально, пока я использую его на localhost. Но когда я развертываю проект в Google App Engine, а затем пытаюсь открыть созданный файл в MS Excel, я могу заметить, что все мои специальные символы превратились в вопросительные знаки «?». Кто-нибудь из вас мог бы сказать мне, почему это работает на localhost, но не показывает специальный символ после развертывания.
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
try {
OutputStream out = null;
try
{
String dataa = req.getParameter("dataa");
String json = URLDecoder.decode(dataa, "UTF-8");
Gson gson = new Gson();
ExcelData excelData = gson.fromJson(json, ExcelData.class);
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet1 = (HSSFSheet) workbook.createSheet("myData");
// workbook creation...
ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
workbook.write(outByteStream);
byte [] outArray = outByteStream.toByteArray();
res.setContentType("application/ms-excel");
res.setContentLength(outArray.length);
res.setHeader("Expires:", "0");
res.setHeader("Content-Disposition", "attachment; filename=raport.xls");
out = res.getOutputStream();
out.write(outArray);
out.flush();
} catch (Exception e)
{
throw new ServletException("Exception in Excel Sample Servlet", e);
} finally
{
if (out != null)
out.close();
}
} catch (Exception ex) {
throw new ServletException(ex);
}
}
Комментарии:
1. Я подозреваю, что проблема может быть где-то в вашем коде … который вы нам не показали.
Ответ №1:
Проблема РЕШЕНА
Довольно забавно, когда вы пытаетесь отладить проблему в течение некоторого времени, а затем находите ответ сразу после публикации в stackoverflow 🙂 В любом случае проблема была здесь:
String data = URLEncoder.encode(someString);
String data2 = URLDecoder.decode(data, "UTF-8");
Итак, при работе на localhost с App Engine Данные локального сервера == data2, но на производственном сервере данные!= data2 и разница — это специальные символы, которые кодируются как вопросительные знаки.
// solution
String data = URLEncoder.encode(someString, "UTF-8");
String data2 = URLDecoder.decode(data, "UTF-8");