EasyPoi导出

本文介绍了如何在Easypoi4.4.0版本中使用Excel注解进行Java对象到Excel的导出,包括列名、格式、替换、后缀以及自定义字典处理。还展示了如何动态调整导出列、大数据导出和模板导出的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录easypoi的使用,代码使用版本是:4.4.0

@Excel注解常用属性

属性类型说明
nameString列名,动态设置排除字段时使用此值
widthdouble设置excel列宽
formatString时间格式,eg:yyyy年MM月dd日
replaceString[]值替换,简单数字、字母转中文配置,eg:{“女_0”,"男_1"}
suffixString文字后缀,eg:%   90 导出为 90%
dictString自定义字典转换处理器时字段标识值

@Data
public class UserInfoVo {

    /*
    姓名
     */
    @Excel(name = "姓名",width = 10.25)
    private String userName;

    /*
    出生年月日
     */
    @Excel(name = "出生日期",format = "yyyy年MM月dd日",width = 20)
    @JsonFormat(pattern = "yyyy年MM月dd日")
    private Date birthDay;

    /*
    性别
     */
    @Excel(name = "性别",replace = {"女_FEMALE","男_MAL"},suffix = "生")
    private SexEnum sex;

    /*
    电话
     */
    @Excel(name = "手机号码",width = 14.50)
    private String phone;

    /*
    邮箱
     */
    @Excel(name = "邮箱地址",width = 20)
    private String email;

    /*
    地址
     */
    @Excel(name = "详细地址",width = 30)
    private String addr;

    /*
    爱好
     */
    @Excel(name = "爱好",dict = "hobby",width = 30)
    private String[] hobbys;

    /*
    学历
     */
    @Excel(name = "学历",dict = "education",width = 20)
    private EducationEnum education;

}

IExcelDictHandler

继承IExcelDictHandler接口结合dict注解实现导入导出内容转义,代码中hobbys和education就是通过实现此接口实现导出内容的自定义。

public class ExcelCommonHandlerImpl implements IExcelDictHandler {

    /**
     * 转换为excel显示支
     * @param s excel注解dict属性的值
     * @param o 对象
     * @param s1 属性名
     * @param o1 属性值
     * @return
     */
    @Override
    public String toName(String s, Object o, String s1, Object o1) {
        if (ObjectUtils.isEmpty(o1) || ObjectUtils.isEmpty(s)) {
            return "";
        }
        String res = "";
        switch (s) {
            case "education":
                res = ((EducationEnum)o1).getMsg();
                break;
            case "hobby":
                res = parseHobby(o1);
                break;
        }
        return res;
    }

    @Override
    public String toValue(String s, Object o, String s1, Object o1) {
        return null;
    }

    private String parseHobby(Object o1) {
        String[] strArr = (String[]) o1;
        return String.join(",", strArr);
    }

}

导出

在导出时可以通过两种方式动态调整导出的列

  • 通过设置ExportParams对象的exclusions字段来动态调整不需要导出的列,设置的值是Excel注解name属性值;
  • 动态构建List<ExcelExportEntity>值来实现动态列导出

测试代码使用了设置exclusions字段的时来动态移除“详细地址的导出”

    public void export(HttpServletResponse response) throws Exception {
        List<UserInfoVo> lst = UserInfoVo.createList();
        ExportParams exportParams = new ExportParams();
        exportParams.setDictHandler(new ExcelCommonHandlerImpl());
        exportParams.setType(ExcelType.XSSF);
        //根据Excel注解name值动态移除不需要导出的字段
        exportParams.setExclusions(new String[]{"详细地址"});
        Workbook workbook = null;
        ServletOutputStream out = null;
        try {
            workbook = ExcelExportUtil.exportExcel(exportParams, UserInfoVo.class, lst);
            String fileName = "a.xlsx";
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            out = response.getOutputStream();
            workbook.write(out);
        } catch (Exception ex) {
            ex.printStackTrace();
            response.setStatus(500);
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            response.getWriter().print("失败");
        } finally {
            if (out != null) {
                IoUtil.close(out);
            }
            if (workbook != null) {
                if (workbook instanceof SXSSFWorkbook) {
                    ((SXSSFWorkbook) workbook).dispose();
                }
                workbook.close();
            }
        }
    }

导出结果:

大数据导出

使用ExcelExportUtil.exportBigExcel实现大数据导出,此方法包含一个IExcelExportServer接口参数,需要自定义实现此接口分批获取数据;

public class ExcelExportServerImpl implements IExcelExportServer {

    private final Integer SIZE = 10000;

    @Autowired
    private TestMapper testMapper;


    /**
     * 
     * @param o  exportBigExcel方法最后一个参数
     * @param pageIndex
     * @return
     */
    @Override
    public List<Object> selectListForExcelExport(Object o, int pageIndex) {
        TestQuery query = (TestQuery)o;
        query.setCurrent(pageIndex);
        query.setSize(SIZE);
        List limitList = testMapper.pageList(query);
        System.out.println("查询"+pageIndex+"次");
        return limitList;
    }
}

导出:

    public void bigExport(TestQuery query, IExcelExportServer exportServer, HttpServletResponse response) throws Exception{
        ExportParams exportParams = new ExportParams();
        exportParams.setDictHandler(new ExcelCommonHandlerImpl());
        exportParams.setType(ExcelType.XSSF);
        Workbook workbook = null;
        try{
            workbook = (SXSSFWorkbook) ExcelExportUtil.exportBigExcel(exportParams, Test.class, exportServer, query);
        }catch (Exception ex){
            
        }
        finally {
            if (workbook != null) {
                //大数量使用exportBigExcel导出时需要手动释放,实例必须是SXSSFWorkbook对象(只有SXSSFWorkbook对象才有dispose方法);
                //在使用exportBigExcel时会构建临时文件,只有当应用重启或者关闭时才会自动删除这些临时文件,通过调用dispose方法在每次导出之后立马清除这些临时文件。
                if (workbook instanceof SXSSFWorkbook) {
                    ((SXSSFWorkbook) workbook).dispose();
                }
                workbook.close();
            }
        }
    }

模板导出

不改变excel原有样式进行导出,记录下已经使用过的指令:

{{}}代表表达式,然后根据表达式里面的数据取值

指令描述用法
fe遍历数据,创建rowfe:list
&INDEX&循环中的序号,自动添加&INDEX&
fd格式化时间fd:(t.date;yyyy年MM月dd日)
dict字典dict:hobby;t.hobbys

Tip:fe:list中list对应map的key,取值时使用t.字段名,使用其它别名数据出不来

@GetMapping(value = "/templateExport", produces = "application/octet-stream")
    public void templateExport(HttpServletResponse response) throws Exception{
        List<UserInfoVo> lst = UserInfoVo.createList();
        //sheetNum指定要导出的sheet的序号,可以导出多个sheet,此处导出sheet1和sheet2
        TemplateExportParams params = new TemplateExportParams("static/m.xlsx", 0, 1);
        params.setDictHandler(new ExcelCommonHandlerImpl());
        ServletOutputStream out = null;
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("list", lst);
        try {
            Workbook workbook = ExcelExportUtil.exportExcel(params, map);
            String fileName = "d.xlsx";
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            out = response.getOutputStream();
            workbook.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                IoUtil.close(out);
            }
        }
    }

导出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值