【EasyPoi实战系列】Spring Boot使用EasyPoi动态控制导出的列 - 第471篇

SpringBoot 2023-05-23 19:28 发表于福建

历史文章(文章累计460+)

国内最全的Spring Boot系列之一

国内最全的Spring Boot系列之二

国内最全的Spring Boot系列之三

国内最全的Spring Boot系列之四

国内最全的Spring Boot系列之五》

国内最全的Spring Boot系列之六

用Midjourney画个美女,AI绘画也太强大了!!! - 第8篇

【EasyPoi实战系列】Spring Boot使用EasyPoi的注解让表格更漂亮以及图片的导出 - 第468篇

推荐一款idea神级代码插件【Bito-ChatGPT】而且免费!- 第9篇

【EasyPoi实战系列】Spring Boot使用EasyPoi实现一对多的导出 - 第469篇

【EasyPoi实战系列】Spring Boot使用EasyPoi实现多Sheet导出 - 第470篇

悟纤:头好疼,真的是芭比Q了。

师傅:徒儿这又是怎么了?

悟纤:产品又来了一个奇葩的需求。

师傅:怎么一个奇葩法?

悟纤:希望导出的单元格的列是是用户可以自定义的,比如:用户只想导出名称和性别,就只导出这两列,其它的不进行导出。

师傅:那这个也很简单呢,可以通过代码的方式进行配置要导出的列。

悟纤:纳尼,还能这样子呢,师傅你教教我呗。

师傅:上车,走起~

导读

注解的导出,规定我们必须把model写好,并且注解写好,每次导出的Excel都是固定的,无法动态控制导出的列,虽然可以通过id来处理一个案例,但是自由度远远不够,本节介绍另外一种导出的方式,自由度十足。

说明:本节的例子的导出实体类是基于前面的章节的实体类进行使用的,所以看的有点蒙圈的小伙伴可以查看前面的文章:

👇🏻👇🏻👇🏻EasyPoi实战系列

01.《【EasyPoi实战系列】Spring Boot集成EasyPoi - 第467篇》

02.《【EasyPoi实战系列】Spring Boot使用EasyPoi的注解让表格更漂亮以及图片的导出 - 第468篇》

03.《【EasyPoi实战系列】Spring Boot使用EasyPoi实现一对多的导出 - 第469篇》

04.《【EasyPoi实战系列】Spring Boot使用EasyPoi实现多Sheet导出 - 第470篇》

一、需求的提出

在前面第一节的导出:

@GetMapping("/exportExcel")public void exportExcel(HttpServletResponse response) throws IOException {    //查询要导出的数据    //List<UserExportVO> users = userService.getUserExportList();    // 模拟数据    List<UserExportVO> users = new ArrayList<>();    // 读取图片    File picture = ResourceUtils.getFile("classpath:static/img/001.png");    InputStream pictureStream = new FileInputStream(picture);    byte[] bytes = IOUtils.toByteArray(pictureStream);    users.add(new UserExportVO("悟纤",1,new Date(),"18688888888","1688@qq.com",bytes,"公众号SpringBoot"));    users.add(new UserExportVO("师傅",1,new Date(),"18666666666","1888@qq.com",bytes,"公众号SpringBoot"));
    ExcelUtil.exportExcelX(users, "测试导出表", "sheet1", UserExportVO.class, "测试导出表.xlsx", response);}

在这里导出了姓名、性别、出生日期、手机号、邮箱、公司logo、描述。

现在产品的需求是说想要导出一个不要手机号的Excel表格,针对这个需求,如果是使用注解的做法就是,需要复制出来一个UserExportVO,然后去掉phone字段。

如果现在产品的需求是这样子的,导出的列是由用户自己在前端进行选择的,那么这种注解的方式,很明显就无法满足要求了。

针对这样的需求情况,就需要使用代码配置的方式进行导出。

基于List 的导出,ExcelExportEntity是注解经过处理翻译成的实体类,两者几乎是一对的,所以如果我们要动态自定义导出列,我们只要动态拼装ExcelExportEntity就可以了

二、动态控制导出的列

要实现动态导出的列,需要将前面注解的部分,通过代码的方式进行实现,这里使用的是ExcelExportEntity,对于ExcelExportEntity最重要的两个配置,是name和key;其中name是列显示的名称,key是在map中对应的key。

2.1 扩展ExcelUtil的方法

动态导出需要使用到方法ExcelExportUtil.exportExcel(ExportParams entity, List<ExcelExportEntity> entityList, Collection<?> dataSet)。

我们扩展一下ExcelUtil的方法,新增一个如下的方法:

/** * 动态导出表格列对应的方法. * @param exportParams * @param entityList * @param dataSet * @param fileName * @param response */public static void exportExcel(ExportParams exportParams, List<ExcelExportEntity> entityList, Collection<?> dataSet,String fileName, HttpServletResponse response){    Workbook workbook = ExcelExportUtil.exportExcel(exportParams,entityList,dataSet);    if (workbook != null) {        downLoadExcel(fileName, response, workbook);    }}

2.2 构建数据

构建数据和之前的是一样的,没有任何的差别:

List<UserExportVO> users = new ArrayList<>();// 读取图片File picture = ResourceUtils.getFile("classpath:static/img/001.png");InputStream pictureStream = new FileInputStream(picture);byte[] bytes = IOUtils.toByteArray(pictureStream);users.add(new UserExportVO("悟纤",1,new Date(),"18688888888","1688@qq.com",bytes,"公众号SpringBoot"));users.add(new UserExportVO("师傅",1,new Date(),"18666666666","1888@qq.com",bytes,"公众号SpringBoot"));

2.3 构建表格

使用ExcelExportEntity来构建单元格配置信息,等同于注解@Excel:

//构造ExcelExportEntity listList<ExcelExportEntity> beanList = new ArrayList<ExcelExportEntity>();//构造对象等同于@ExcelbeanList.add(new ExcelExportEntity("姓名", "realName"));beanList.add(new ExcelExportEntity("性别", "sex"));beanList.add(new ExcelExportEntity("手机号码", "phone"));beanList.add(new ExcelExportEntity("邮箱", "email"));beanList.add(new ExcelExportEntity("备注", "remark"));boolean needBirthday = false;if(needBirthday){    beanList .add(new ExcelExportEntity("出生日期", "birthday"));}

2.4 调用导出方法

最后调用导出的方法:

ExcelUtil.exportExcel(new ExportParams("用户列表", "用户信息"), beanList ,users,"用户报表.xlsx",response);

最终的整个代码如下:

/** *  动态导出表格. * /demo/exportExcel3 * @param response */@GetMapping("/exportExcel3")public void exportExcel3(HttpServletResponse response) throws IOException {    // 模拟数据    List<UserExportVO> users = new ArrayList<>();    // 读取图片    File picture = ResourceUtils.getFile("classpath:static/img/001.png");    InputStream pictureStream = new FileInputStream(picture);    byte[] bytes = IOUtils.toByteArray(pictureStream);    users.add(new UserExportVO("悟纤",1,new Date(),"18688888888","1688@qq.com",bytes,"公众号SpringBoot"));    users.add(new UserExportVO("师傅",1,new Date(),"18666666666","1888@qq.com",bytes,"公众号SpringBoot"));
    //构造ExcelExportEntity list    List<ExcelExportEntity> beanList = new ArrayList<ExcelExportEntity>();    //构造对象等同于@Excel    beanList.add(new ExcelExportEntity("姓名", "realName"));    beanList.add(new ExcelExportEntity("性别", "sex"));    beanList.add(new ExcelExportEntity("手机号码", "phone"));    beanList.add(new ExcelExportEntity("邮箱", "email"));    beanList.add(new ExcelExportEntity("备注", "remark"));    boolean needBirthday = false;    if(needBirthday){        beanList .add(new ExcelExportEntity("出生日期", "birthday"));    }
    ExcelUtil.exportExcel(new ExportParams("用户列表", "用户信息"), beanList ,users,"用户报表.xlsx",response);}

这种代码的优势,就是对于数据是一样的,那么配置了相应的ExcelExportEntity就会被导出,否则是不会被导出了,如上面的birthday,如果needBirthday为false的情况下,就不会添加配置ExcelExportEntity("出生日期", "birthday");那么该信息就不会被导出。

针对要导出的字段可以在前端让用户进行自我选择。

2.5 代码测试

运行代码,访问链接:

http://127.0.0.1:8080/demo/exportExcel3

欢迎来到AI+社区!在这里,你可以解锁更多的技能,链接更多的人,以及得到更多的副业机会。作为一个具备人工智能的社区,我们致力于实现人与科技的无缝结合,助力您在个人以及职业生涯中的成长。

加入AI+,您将获得以下优势和机会:

(1)掌握更多技能:AI+汇聚了众多的领域专家和技术大牛,他们将与您分享他们的经验和技能,帮助您掌握新的知识和技能。

(2)拓展人脉:AI+是一个庞大而多元化的社区,在这里,您将有机会认识不同领域的人才和企业家,拓展人脉圈,在职场生涯中获得更多机会。

(3)获取副业机会:AI+的平台上有着丰富多彩的副业机会,您可以在这里与他人合作,创造更多的价值,增加自己的收入。

此外,AI+每天都会提供最新的资讯、最热门的话题、最精彩的活动等,让您在社区中不断学习、交流,拓展自己的视野和认知。

点击链接:https://t.zsxq.com/0etPXiQ28

或者扫码:

加入AI+,开启有趣而充实的学习和职场生涯!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值