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文件后缀要保持一致。

posted @ 2022-04-06 15:12  莫等、闲  阅读(990)  评论(0编辑  收藏  举报