Проблема с кодировкой в Apache POI

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