需求

最近在做公司自己的工作流项目,不同的项目-业务 除开固定字段,都可自定义不同的字段以便不同的业务处理不同的工作流,其中关于报表的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表头(动态表头)的处理相关推荐

  1. 工作记录:EasyExcel对于不定长Excel表头的处理,写excel

    一.需求 公司项目的一个功能,导出账户信息excel表格,不同的账户类型除开所要展示的固定表头字段,还要展示每个账户类型所有的特殊字段,并且将所有账户类型的数据全部展示在同一个的excel文件的不同s ...

  2. easyExcel 复杂表头 动态表头

    需求: 要根据数据来导出这个excel 左侧菜单有一百多个固定菜单,这些肯定不能放到数据库里建字段,所以就根据上面的抽检总点数,合格总点数,合格率三个字段建立数据库字段. 技术实现: 我们选择的是ea ...

  3. EXCEL导出动态表头

    一般在项目里需要导出数据时都是表头固定的,这样用EasyExcel导出时,只要先定义和POJO类,然后注释的方式定义好表头即可,如下: @Getter @Setter @EqualsAndHashCo ...

  4. 关于element table 动态表头+动态表头及内容+表格优化+初始化表格+隐藏功能,技术提升请来!

    本篇文章属于升级版,欢迎交流指教~~ 导航: 表格头部与内容对不齐 表格内容过长 处理初始化闪过暂无数据 动态表头1 动态表头+内容2 动态表头及层级表头 1.第一个就是表格头部与内容对不齐的问题了, ...

  5. springboot+easyexcel实现固定表头+动态表头的数据导出

    /*** 固定标头的实体类*/ @Data public class BaseExportExcelStringVo implements Serializable {private static f ...

  6. java poi导出Excel表格(动态表头)

    HSSFWorkbook xssfWorkbook = new HSSFWorkbook(); //创建工作表对象Sheet sheet = xssfWorkbook.createSheet(); / ...

  7. easypoi导出复杂表头动态表头(纯代码导出)

    想要导出的样式 看需求要用那种方式的,使用注解一样可以导出杂表头,我的表头是动态的所以用的代码写 //Excel注解依赖<dependency><groupId>cn.afte ...

  8. easyexcel导出excel自定义合并单元格【动态表头和动态数据均可以自由合并】

    网上合并单元格的博客还是很多的,大家自行舍取吧.本文主要讲解固定与不固定的表头和内容如何合并 参考官网 https://easyexcel.opensource.alibaba.com/docs/cu ...

  9. easyExcel实现单sheet多子表,并结合动态表头,复杂表头

    easyExcel实现单sheet多子表,并结合动态表头,复杂表头 一.实现目标 二.官方文档阅读 1.动态表头 2.单页面多子表 3.复杂表头 三.开始编码 测试主类 数据类LIst获取 表头lis ...

最新文章

  1. FCKeditor 2.6 安装配置使用指南(asp)
  2. Linux运维常用命令总结
  3. buildroot的使用简介【转】
  4. 3种类型的程序员:“虫族”,“人族”,“神族”(转载)
  5. MapReduce 示例:减少 Hadoop MapReduce 中的侧连接
  6. 【Level 08】U07 Mixed Feelings L2 Let's go shopping
  7. CentOS安装tengine(淘宝服务器)
  8. GridBagLayout
  9. 解决linux 运行自动化脚本浏览器无法启动问题
  10. 明解C语言(第3版)入门篇-【部分】第五章练习题解(练习5-9至5-12)
  11. std::stack使用总结
  12. processing python mode - 01
  13. 亚马逊美国UL 299,第 11 版,2012 年 4 月 13 日- UL 安全干粉灭火器标准
  14. K8s系列之:网络原理
  15. Qt的对话框与窗口--标准的对话框
  16. 『dos』使用bat文件打开jupyter lab
  17. python实战: 短链接生成器
  18. python3:利用openpyxl xlwt xlrd实现对excel的增删改查和读入
  19. ElasticSerach7.6.0拼音分词器安装和使用
  20. 用计算机术语赞美老师,赞美老师的句子

热门文章

  1. 视频课之小米商城练习
  2. 使用prometheus(普罗米修斯)监控mysql容器详解
  3. 用java代码实现 PDF转其他文件功能,请为每一行代码进行注释
  4. 题目10:输入一个3位自然数,把这个数的百位与个位数对调,输出对调后的自然数
  5. IBM Dr Watson 的那些事儿
  6. 学校无盘服务器带机量50台要求,如何解决无盘回写压力,提高服务器带机量?...
  7. 21双非计算机保研经验分享
  8. 公众号新变化不断,内容创作者该何去何从?
  9. 苹果iOS开发系列--详解Swift 3.0语言的重大变化
  10. C++高性能协程分布式服务框架设计