Excel téléchargé corrompu à l'aide de Apache poi

J'essaie de download le file Excel en utilisant POI. Le file Excel est téléchargé en tant que pièce jointe à la réponse. Je me suis référé à d'autres questions sur Stack Overflow, et les réponses ont été principalement pour essayer différents types de contenu, et j'ai essayé tous les différents types de contenu mentionnés, mais le file Excel téléchargé est corrompu.

En outre, lorsque j'ai essayé d'écrire l'Excel sur le système de files en utilisant le même code (avec juste la modification pour l'écrire sur le système de files au lieu de returnner en pièce jointe), l'excel généré sur le système de files a été correctement créé et n'était pas corrompu. Ce n'est que lorsque j'essaie de le renvoyer avec une réponse HTTP que le file Excel est corrompu.

Voici le code que j'utilise pour download Excel

MainController.java

if (downloadFlag) { response = reportsService.initializeXLSContent(response, "Tests_By_Day", fromDate, toDate); List<Ssortingng> columnNames = new ArrayList<>(); columnNames.add("Day"); columnNames.add("Tests Count"); populateAndDispatch(response, result, columnNames); return null; } 

initializeXLSContent method

 public HttpServletResponse initializeXLSContent(HttpServletResponse response, Ssortingng fileName, Date startDate, Date endDate) { response.setContentType("application/force-download"); SsortingngBuilder reportName = new SsortingngBuilder(fileName); Calendar calendar = Calendar.getInstance(); if (null != startDate) { calendar.setTime(startDate); reportName = reportName.append("_" + calendar.get(Calendar.YEAR) + "_" + (calendar.get(Calendar.MONTH) + 1) + "_" + calendar.get(Calendar.DAY_OF_MONTH)); } if (null != endDate) { calendar.setTime(endDate); reportName = reportName.append("_" + calendar.get(Calendar.YEAR) + "_" + (calendar.get(Calendar.MONTH) + 1) + "_" + calendar.get(Calendar.DAY_OF_MONTH)); } reportName.append(".xlsx"); response.setHeader("Content-Disposition", "attachment;filename=" + reportName.toSsortingng()); response.setHeader("Content-Transfer-Encoding", "binary"); return response; } 

méthode populateAndDispatch

 private void populateAndDispatch(HttpServletResponse response, List<ChartData> chartData, List<Ssortingng> columnNames) { List<ArrayList<Ssortingng>> reportData = new ArrayList<>(); switch (columnNames.size()) { case 2: twoColumnPopulate(chartData, reportData); break; case 3: threeColumnPopulate(chartData, reportData); break; } XSSFWorkbook workbook = reportsService.generateContentXLS(reportData, columnNames); response = reportsService.dispatchXLSContent(response, workbook); 

méthode TwoColumnPopulate

 private void twoColumnPopulate(List<ChartData> chartData, List<ArrayList<Ssortingng>> reportData) { for (ChartData rowData : chartData) { ArrayList<Ssortingng> tempRowData = new ArrayList<>(); tempRowData.add(rowData.getxData()); tempRowData.add(rowData.getyData()); reportData.add(tempRowData); } } 

méthode generateXLSContent

 public XSSFWorkbook generateContentXLS(final List<ArrayList<Ssortingng>> sheetData, List<Ssortingng> columnNames) { XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet(); XSSFRow headerRow = sheet.createRow(0); CellStyle style = workbook.createCellStyle(); Font font = workbook.createFont(); font.setFontHeightInPoints((short) 14); font.setBoldweight(Font.BOLDWEIGHT_BOLD); style.setFont(font); int i = 0; // i is used to iterate over rows for (Ssortingng columnName : columnNames) { Cell cell = headerRow.createCell(i++); cell.setCellValue(columnName); cell.setCellStyle(style); } int j; int k = 1; // j is used to iterate over columns and k is used to count // no.of rows for (ArrayList<Ssortingng> rowData : sheetData) { XSSFRow row = sheet.createRow(k++); for (j = 0; j < i; j++) { row.createCell(j).setCellValue(rowData.get(j)); } } return workbook; } 

dispatchXLSContent method

 public HttpServletResponse dispatchXLSContent(HttpServletResponse response, XSSFWorkbook workbook) { try { workbook.write(response.getOutputStream()); response.getOutputStream().flush(); workbook.close(); } catch (IOException ie) { LOGGER.error("IOException occurred in dispatchXLSContent: ", ie); } return response; } 

Une chose intéressante que j'ai trouvé était que, j'ai créé un exemple d'API pour tester cette fonctionnalité de téléchargement excel et ça a bien fonctionné avec la même configuration, mais pas dans cette API particulière. Voici le code pour cet exemple d'API.

 public void testDownload(HttpServletResponse response) throws IOException { List<Ssortingng> test = new ArrayList<>(); test.add("A"); test.add("B"); test.add("C"); XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet(); XSSFRow headerRow = sheet.createRow(0); Cell cell1 = headerRow.createCell(0); cell1.setCellValue("Header 1"); Cell cell2 = headerRow.createCell(1); cell2.setCellValue("Header 2"); XSSFRow row = sheet.createRow(0); row.createCell(0).setCellValue("Cell 1"); row.createCell(1).setCellValue("Cell 2"); row = sheet.createRow(1); row.createCell(0).setCellValue("Cell 1"); row.createCell(1).setCellValue("Cell 2"); response.setHeader("Content-Disposition", "attachment;filename=hello.xlsx"); response.setHeader("Content-Transfer-Encoding", "binary"); response.setContentType("application/force-download"); workbook.write(response.getOutputStream()); response.getOutputStream().flush(); workbook.close(); } 

Dans ce cas, l'Excel ne se corrompt pas et se télécharge correctement.