EasyExcel 对于不定长Excel表头(动态表头)的处理
需求
最近在做公司自己的工作流项目,不同的项目-业务 除开固定字段,都可自定义不同的字段以便不同的业务处理不同的工作流,其中关于报表的excel导出时,要求除开必要的字段,还需要导出自定义所需的字段。
下面这些是自定义字段
选择字段
会拼接在视图后面
官方文档例子
/*** 动态头,实时生成头写入* <p>* 思路是这样子的,先创建List<String>头格式的sheet仅仅写入头,然后通过table 不写入头的方式 去写入数据** <p>* 1. 创建excel对应的实体对象 参照{@link DemoData}* <p>* 2. 然后写入table即可*/
@Test
public void dynamicHeadWrite() {String fileName = TestFileUtil.getPath() + "dynamicHeadWrite" + System.currentTimeMillis() + ".xlsx";EasyExcel.write(fileName)// 这里放入动态头.head(head()).sheet("模板")// 当然这里数据也可以用 List<List<String>> 去传入.doWrite(data());
}private List<List<String>> head() {List<List<String>> list = new ArrayList<List<String>>();List<String> head0 = new ArrayList<String>();head0.add("字符串" + System.currentTimeMillis());List<String> head1 = new ArrayList<String>();head1.add("数字" + System.currentTimeMillis());List<String> head2 = new ArrayList<String>();head2.add("日期" + System.currentTimeMillis());list.add(head0);list.add(head1);list.add(head2);return list;
}
业务实现
通过EasyExcel的官方文档中 动态头,实时生成头写入实现
public ByteArrayOutputStream export(WorkSearch search) {search.setCurrentPage(EXPORT_START_ROW);search.setPageSize(EXPORT_MAX_SIZE);PageVO<BtWorkDTO> page = list(search);List<BtWorkDTO> pageData = page.getPageData();//动态头 BASE_DYNAMIC_HEAD:固定展示字段(类型为List<List<String>>)List<List<String>> dynamicHeadList = new ArrayList<>(BASE_DYNAMIC_HEAD);//每行的数据集List<List<String>> rowDataList = new ArrayList<>();//选择展示的自定义字段String defFieldIdStr = search.getDefFieldIdStr();if (StringUtil.isNotBlank(defFieldIdStr)) {//用户选择的所需导出的自定义字段List<BtBizDefFieldDTO> defFieldList = btBizDefFieldService.listByIds(defFieldIdStr);defFieldList.forEach(item -> dynamicHeadList.add(Collections.singletonList(item.getName())));}ByteArrayOutputStream bos = new ByteArrayOutputStream();if (!pageData.isEmpty()) {pageData.forEach(data -> {List<String> eachRowData = new ArrayList<>();//基础表头信息添加for (List<String> baseHeadSingle : BASE_DYNAMIC_HEAD) {String baseHead = baseHeadSingle.get(0);addRowBaseVal(baseHead, eachRowData, data);}//选择的自定义字段值列表List<BtWorkFieldDTO> workFieldList = data.getWorkFieldList();if (Objects.nonNull(workFieldList) && !workFieldList.isEmpty()) {//自定义字段的 字段名称-自定义字段值 映射的MapMap<String, String> fieldName4ValueMap = workFieldList.stream().collect(HashMap::new, (m, v) -> m.put(v.getFieldName(), v.getValue()), HashMap::putAll);for (List<String> dynamicHead : dynamicHeadList) {String head = dynamicHead.get(0);if (BASE_DYNAMIC_HEAD.contains(dynamicHead)) {continue;}eachRowData.add(mustHaveValue(fieldName4ValueMap.get(head)));}}rowDataList.add(eachRowData);});}//.head() 动态头EasyExcel.write(bos).excelType(ExcelTypeEnum.XLSX).head(dynamicHeadList).sheet("default").doWrite(rowDataList);return bos;}
效果
实现结果
官方文档参考
https://alibaba-easyexcel.github.io/quickstart/write.html
EasyExcel 对于不定长Excel表头(动态表头)的处理相关推荐
- 工作记录:EasyExcel对于不定长Excel表头的处理,写excel
一.需求 公司项目的一个功能,导出账户信息excel表格,不同的账户类型除开所要展示的固定表头字段,还要展示每个账户类型所有的特殊字段,并且将所有账户类型的数据全部展示在同一个的excel文件的不同s ...
- easyExcel 复杂表头 动态表头
需求: 要根据数据来导出这个excel 左侧菜单有一百多个固定菜单,这些肯定不能放到数据库里建字段,所以就根据上面的抽检总点数,合格总点数,合格率三个字段建立数据库字段. 技术实现: 我们选择的是ea ...
- EXCEL导出动态表头
一般在项目里需要导出数据时都是表头固定的,这样用EasyExcel导出时,只要先定义和POJO类,然后注释的方式定义好表头即可,如下: @Getter @Setter @EqualsAndHashCo ...
- 关于element table 动态表头+动态表头及内容+表格优化+初始化表格+隐藏功能,技术提升请来!
本篇文章属于升级版,欢迎交流指教~~ 导航: 表格头部与内容对不齐 表格内容过长 处理初始化闪过暂无数据 动态表头1 动态表头+内容2 动态表头及层级表头 1.第一个就是表格头部与内容对不齐的问题了, ...
- springboot+easyexcel实现固定表头+动态表头的数据导出
/*** 固定标头的实体类*/ @Data public class BaseExportExcelStringVo implements Serializable {private static f ...
- java poi导出Excel表格(动态表头)
HSSFWorkbook xssfWorkbook = new HSSFWorkbook(); //创建工作表对象Sheet sheet = xssfWorkbook.createSheet(); / ...
- easypoi导出复杂表头动态表头(纯代码导出)
想要导出的样式 看需求要用那种方式的,使用注解一样可以导出杂表头,我的表头是动态的所以用的代码写 //Excel注解依赖<dependency><groupId>cn.afte ...
- easyexcel导出excel自定义合并单元格【动态表头和动态数据均可以自由合并】
网上合并单元格的博客还是很多的,大家自行舍取吧.本文主要讲解固定与不固定的表头和内容如何合并 参考官网 https://easyexcel.opensource.alibaba.com/docs/cu ...
- easyExcel实现单sheet多子表,并结合动态表头,复杂表头
easyExcel实现单sheet多子表,并结合动态表头,复杂表头 一.实现目标 二.官方文档阅读 1.动态表头 2.单页面多子表 3.复杂表头 三.开始编码 测试主类 数据类LIst获取 表头lis ...
最新文章
- FCKeditor 2.6 安装配置使用指南(asp)
- Linux运维常用命令总结
- buildroot的使用简介【转】
- 3种类型的程序员:“虫族”,“人族”,“神族”(转载)
- MapReduce 示例:减少 Hadoop MapReduce 中的侧连接
- 【Level 08】U07 Mixed Feelings L2 Let's go shopping
- CentOS安装tengine(淘宝服务器)
- GridBagLayout
- 解决linux 运行自动化脚本浏览器无法启动问题
- 明解C语言(第3版)入门篇-【部分】第五章练习题解(练习5-9至5-12)
- std::stack使用总结
- processing python mode - 01
- 亚马逊美国UL 299,第 11 版,2012 年 4 月 13 日- UL 安全干粉灭火器标准
- K8s系列之:网络原理
- Qt的对话框与窗口--标准的对话框
- 『dos』使用bat文件打开jupyter lab
- python实战: 短链接生成器
- python3:利用openpyxl xlwt xlrd实现对excel的增删改查和读入
- ElasticSerach7.6.0拼音分词器安装和使用
- 用计算机术语赞美老师,赞美老师的句子
热门文章
- 视频课之小米商城练习
- 使用prometheus(普罗米修斯)监控mysql容器详解
- 用java代码实现 PDF转其他文件功能,请为每一行代码进行注释
- 题目10:输入一个3位自然数,把这个数的百位与个位数对调,输出对调后的自然数
- IBM Dr Watson 的那些事儿
- 学校无盘服务器带机量50台要求,如何解决无盘回写压力,提高服务器带机量?...
- 21双非计算机保研经验分享
- 公众号新变化不断,内容创作者该何去何从?
- 苹果iOS开发系列--详解Swift 3.0语言的重大变化
- C++高性能协程分布式服务框架设计