写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

  今天尝试使用easypoi做Excel导出,首先如它的名字一样,导出相比之前使用的poi确实简单了不少,但是它的官方文档是真的不详细,有待完善,拿我导出的文件来说吧(图如下),这个标题合并单元格的效果是@Excel注解的groupName属性实现的,但是在官方文档中说明@Excel注解的时候并没有对groupName属性做说明,而且源码中虽然有这个属性,但是没有对这些属性做一点注释说明,直到我看到文档的这一节2.12 groupname和ExcelEntity的name属性才对groupname属性进行说明,还有错别字真是太多了。

java 使用easypoi导出word模板并渲染checkbox_字段

虽然感觉什么都有,但是就是源码的注释太少了,根本不知道这些方法是干啥的,虽然抱怨不是个好现象,但是没忍住。。。吐槽到此结束,说归说,入门还是离不开它的官方文档,计划接下来几篇记录一下使用easypoi完成常用的表格操作。

首先,准备下测试表和数据:

java 使用easypoi导出word模板并渲染checkbox_poi_02

实体类、Mapper接口啥的就不贴了,xml中也只有一个简单的查询:

<select id="selectUsers" resultType="com.example.springbootmp.dto.user.UserMobileDto">
        select * from t_user_excel
    </select>

先看下导出的文件样子和生成导出文件的实体类:

java 使用easypoi导出word模板并渲染checkbox_字段_03

java 使用easypoi导出word模板并渲染checkbox_文件名_04

对比上面两张图说明一下使用easypoi导出的实体UserExcelDto,按照官方的使用说明,简单的使用@Excel注解标记一下字段就好,name属性为导出表格的列明,数据库中性别存的字符串类型的man/woman,如果我们导出的时候想显示为男/女,@Excel注解有一个replace属性可以替换值,当然也可以使用枚举,easypoi也有对枚举处理的说明,这个以后再测试,暂且使用replace属性,replace值的写法形如:replace = {"A_a","B_b"},它的意思就是假如实体字段的值为a,那么导出的时候列值替换为A,其它参数同理;@Excel注解还有一个参数groupName可以很容易的实现双行表头的样子,如图中的时间一列,使用groupName可以将多个字段归并到一列。

贴一下controller导出方法代码:

@GetMapping
    public void export(HttpServletResponse response) throws IOException {
        List<UserExcelDto> userExcelDtos = userExcelService.selectUsers();
        String fileName = "下载的文件名";
        String sheetName = "sheet名字";
        String title = "sheet页的title";
        ExportParams exportParams = new ExportParams(title,sheetName);
    ExcelUtil.exportExcel(userExcelDtos,UserExcelDto.class,fileName,exportParams,response);

    }

虽然easypoi提供了导出方法ExcelExportUtil.exportExcel(),不过我这里自定义了一个导出工具类,便于设置参数,从上面的截图可以知道,title、sheetName的作用不啰嗦了,看下导出工具类代码:

/**
     * excel 导出
     *
     * @param list  要导出的数据
     * @param pojoClass  pojo类型
     * @param fileName  文件名称
     * @param exportParams  导出表格参数
     * @param response
     */
    public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName,
                                   ExportParams exportParams,
                                   HttpServletResponse response) throws IOException {
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
        downLoadExcel(fileName, response, workbook);
    }

    /**
     * 下载文件
     *
     * @param fileName 文件名称
     * @param response
     * @param workbook excel数据
     */
    private static void downLoadExcel(String fileName, HttpServletResponse response,
                                      Workbook workbook)
            throws IOException {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename="
                    + URLEncoder.encode(fileName + ".xls", "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

easypoi的体验到此结束,很明显有很多待优化完善的地方,就像是时间显示、枚举类使用、可能一个用户有多笔订单这种需要合并展示的,接下来几天慢慢补充。

补充一下:

ExportParams exportParams = new ExportParams(title,sheetName);

通常我们并不需要导出的表格中带这个这个标题(sheet页的title),那么可以将title设置为null即可,都不传使用空构造器也可以,但是sheetName也会变为默认的sheet0、sheet1这种

还可以用设置二级标题。如:new ExportParams("sheet也title", "日期:2020-11-18","sheet名字");

看下title为null的效果(new ExportParams(null,sheetName)):

java 使用easypoi导出word模板并渲染checkbox_字段_05

看下二级标题的效果:

java 使用easypoi导出word模板并渲染checkbox_字段_06