POI進行excel匯出檔案開啟報錯
阿新 • • 發佈:2022-04-06
一、問題來源
最近做通州公安的專案,需求包含好幾個excel匯出的功能,匯出我採用POI進行excel匯出,引用如下pom:
<!--excel--> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.4.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version> </dependency>
程式碼如下:
public BaseResult<String> exportStaticsAccessRecord(AccessRecordDto accessRecordDto, HttpServletResponse response) { BaseResult<String> baseResultResult = null; ServletOutputStream out = null; try { BaseResult<List<BaseResultVo>> baseResult = staticsAccessRecord(accessRecordDto); if (baseResult != null && CollectionUtils.isNotEmpty(baseResult.getData())) { String fileName = "access_record_" + DateUtils.format(new Date(), DateUtils.DATE_TIME_FORMAT_YYYYMMDDHHMISS); ExportParams exportParams = new ExportParams("各單位訪問記錄", "各單位訪問記錄", ExcelType.XSSF); Workbook workbook = ExcelExportUtil.exportExcel(exportParams, BaseResultVo.class, baseResult.getData()); out = response.getOutputStream(); response.reset(); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xls"); response.setContentType("application/msexcel"); workbook.write(out); out.flush(); out.close(); } else { baseResultResult = BaseResult.fail("-1", "沒有需要匯出的資料!"); } } catch (IOException e) { logger.error("訪問記錄匯出失敗!請聯絡管理員!", e); baseResultResult = BaseResult.fail("-1", "訪問記錄匯出失敗!請聯絡管理員!"); } finally { try { out.close(); } catch (IOException e) { logger.error("流關閉異常!", e); } } return baseResultResult; }
匯出程式碼執行正常,但是開啟excel檔案後報如下錯:
點選是繼續開啟,檔案可以正常開啟,內容也是正確的。
二、解決方法
由於ExcelType型別與實際生成的excel檔案版本不一致,導致報錯,修改檔案字尾為xlsx即可,修改後程式碼:
public BaseResult<String> exportStaticsAccessRecord(AccessRecordDto accessRecordDto, HttpServletResponse response) { BaseResult<String> baseResultResult = null; ServletOutputStream out = null; try { BaseResult<List<BaseResultVo>> baseResult = staticsAccessRecord(accessRecordDto); if (baseResult != null && CollectionUtils.isNotEmpty(baseResult.getData())) { String fileName = "access_record_" + DateUtils.format(new Date(), DateUtils.DATE_TIME_FORMAT_YYYYMMDDHHMISS); ExportParams exportParams = new ExportParams("各單位訪問記錄", "各單位訪問記錄", ExcelType.XSSF); Workbook workbook = ExcelExportUtil.exportExcel(exportParams, BaseResultVo.class, baseResult.getData()); out = response.getOutputStream(); response.reset(); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx"); response.setContentType("application/msexcel"); workbook.write(out); out.flush(); out.close(); } else { baseResultResult = BaseResult.fail("-1", "沒有需要匯出的資料!"); } } catch (IOException e) { logger.error("訪問記錄匯出失敗!請聯絡管理員!", e); baseResultResult = BaseResult.fail("-1", "訪問記錄匯出失敗!請聯絡管理員!"); } finally { try { out.close(); } catch (IOException e) { logger.error("流關閉異常!", e); } } return baseResultResult; }
問題解決。
三、總結
HSSF類,只支援2007以前的excel,副檔名為xls,XSSF類支援07以後的excel,07以後的excel工作簿預設格式是xlsx,所以ExcelType和excel檔案字尾要保持一致。