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.