1. 程式人生 > 其它 >POI進行excel匯出檔案開啟報錯

POI進行excel匯出檔案開啟報錯

一、問題來源

  最近做通州公安的專案,需求包含好幾個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檔案字尾要保持一致。