历史文章(文章累计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 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"));
}
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+,开启有趣而充实的学习和职场生涯!