EasyExcel实现动态表头功能

news2024/11/25 21:52:57

EasyExcel实现动态表头功能

开发过程中,大部分都会使用到导出报表功能,目前阶段会用得有
poi导出(暂无),
easyexcel导出(官方文档,https://easyexcel.opensource.alibaba.com/docs/current/),
easypoi导出(官方文档,http://doc.wupaas.com/docs/easypoi/easypoi-1c10ldlb9epsk)。
三者感觉大差不差,只不过后两者有大部分功能得集成,可能会免去很多代码。详细得区别详见各自得官方文档,拿一个适合自己开发即可。接下来,着重介绍一下今天得嘉宾,easyExcel ,会通过他得某些功能,来实现动态表头得输出。

动态表头(官方List方式)

首先是我们经常使用得动态表头导出,也是一搜一大把得,更是官方文档里提供得一种动态表头方式,也就是增加对应得list。由自己在业务层算好需要多少个列,就增加多少个list,哪行需要合并 也要增加对应得数据。
这种方式么比较耗费代码,适用于增减几个字段得业务场景。
这种方式方法就不过多追叙了,基本上一搜就是一大把得方式,这次主要介绍得,是一种适用于统计年月得情况。

 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;
    }

动态表头(自研,性能未知)

这种业务场景,虽然不多,但是不免也有用到得地方,大概场景就是 根据选择得年月区间,表内容既要展示一些基本信息,也要展示对应得年月数据,例如选了1-2月 就是 基本数据+ 1月 + 2月。选了3-5月,就得显示 基本数据+ 3月 + 4月 + 5月,由于后边月得不确定性,官方文档得List方式就有点不是很又好了。一方面,反参字段得设计,由于每个月都有三四条业务数据,所以12个月得话 光反参字段就是 12X4+ ,太多了。如果每个月得数据后续在增加一个属性字段,代码层面就要跟着变动 n处*12处,显然使用list方式已经不是很适合了,代码编写量翻倍,修改时候也得翻倍,很容易出错。另一方面,easyexcel导出字段中不能使用list,否则注解识别不了,造成导出异常,大概就是只能输出字符串,不能输出整个list,

    @ApiModelProperty(value = "查询统计数据")
    private List<TT> ttList;

在这里插入图片描述

种种原因,之前得方式肯定是不适用了,只能是看看能不能将两种方式结合起来,
第一步,肯定是设计参数了,由于数据是按月查询得,月份得数据反参也肯定是用list来收了,只不过会将查询到得数据,会在xml中自动转为list。最终得反参就是 n个基础数据字段, 2个list月份数据,其中一个用于计算所选月得平均值。
第二步,反参里得月份怎么能输出到excel中,按照异常提示,搜索一下,也不难搜索,搜索到得基本一致,都是加一个类型转换得,就是把读取得数据转字符输出。

 @Override
    public CellData convertToExcelData(Object o, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        //写excel文件时被EasyExcel调用
        //用json转换工具将List对象转换为json字符串
        String json = JSONUtil.toJsonStr(o);
        CellData cellData = new CellData();
        return new CellData(json);
    }
@ExcelProperty(converter = ListDataConverter.class)
private List<TT> ttList;

这是处理完之后得注解,需要加上这个,然后对应得导出

  //处理集合数据
EasyExcel.write(response.getOutputStream())
.registerConverter(new ListDataConverter())
......

这样 导出之后 前边得基础数据也能正常显示,
在这里插入图片描述
只不过数据都是字符形式,
接着第三步就是对这个数据的处理,
第三步,写入数据,https://blog.csdn.net/qq_43021813/article/details/121465753?spm=1001.2014.3001.5502
可以参考之前得写数据文档,只不过这次是 通过实现RowWriteHandler 然后重写里边得afterRowDispose实现,

  implements RowWriteHandler 

 @Override
    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean aBoolean) {


}
  

原理是将这个list对应得列,将数据取出,然后根据不同得参数去创建不同得列,list 有几个数据就创建几个列,一般是4X新列,并将数据放里,这样list循环完之后,就会得到一个动态得表头了

           //基础数据到11  从11 开始增加列 每增加一列 列+1
            int cellNum = 11 ;
 					for (int i = 0; i < responseList.size(); i++) {
                        //得分
                        Cell cell1 = row.createCell(cellNum);
                        cell1.setCellValue(ttList.get(i).getA().toString());
                        // 每增加一列 列+1
                        cellNum++;
                        //得分
                        Cell cell2 = row.createCell(cellNum);
                        cell2.setCellValue(ttList.get(i).getB().toString());
                        cellNum++;
                        //设置得分小计
                        Cell cell3 = row.createCell(cellNum);
                        cell3.setCellValue(ttList.get(i).getC().toString());
                        cellNum++;
                        //设置是否达标
                        Cell cell4 = row.createCell(cellNum);
                        cell4.setCellValue(ttList.get(i).getD().toString());
                        cellNum++;
                }

在这里插入图片描述123 是三个字段,这样就循环出了4个月得数据 每个月又有123 三条业务数据,这样赋值完毕后,发现原有得list得字符串还在,就得想办法删掉,使用 row.removeCell(cell100); 只能删除内容,这样一来,又在报表中有了一列空白列,搜了两天没搜到结果,然后想到注解可以指定列输出数据所有就给他指定到一个永远不会使用得列去

    @ExcelProperty(converter = ListDataConverter.class,index = 100)
    @ApiModelProperty(value = "得分汇总(分月)")
    private List<TT> ttList;

指定完就是这样 将数据输出到表得第100列,这样将数据读取后 在是哦那个remove就不会造成空白列了。
第四步,数据基本都渲染完了,然后就是创建表头,合并表头,等等, 这些就直接搜索就行了,一搜也是一大把,根据自己表头得需要,写不同得handler就行了。
第五步,增加表名,类型,sheet名等等,就不多介绍了。

总体下来,第一天搭架子,写sql倒是没啥坑,第二天开始踩了不少坑,都是数据转换,赋值excel列数据等,要么就是写数据得方式不对写不进去,要么就是读取得有问题,各种坑各种填,一天改来改去得,第三四天基本就步入正轨了,数据渲染,表头设置合并等。
查询一个月示例
在这里插入图片描述
查询半年,当然了,年月时间可以随意
在这里插入图片描述
最终得效果还算比较满意吧,其余得就是宽高得微调了,

总之,自研还是有难度啊,中间还一度研究到了easypoi。发现原理和这个也差不多,又切回了excel。
此文档就不贴源码了,如有需要请私信有偿提供。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1177938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

六大设计原则:构建优雅、可维护和可扩展的软件

六大设计原则&#xff1a;构建优雅、可维护和可扩展的软件 单一职责原则 (Single Responsibility Principle)开放封闭原则 (Open-Closed Principle)里氏替换原则 (Liskov Substitution Principle)依赖倒置原则 (Dependency Inversion Principle)接口隔离原则 (Interface Segreg…

【Linux】Shell命令行的简易实现(C语言实现)内键命令,普通命令

文章目录 0.准备工作1.大体框架 一、获取命令行二、解析命令行三、进程执行1.普通命令2.内建命令 四、完整代码&#xff1a; 0.准备工作 1.大体框架 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <u…

【MySql】MySql表的增删查改

目录 1.新增 1.1单行数据 全列插入 2.2 多行数据 指定列插入 2.查询 2.1 全列查询 2.2 指定列查询 2.3查询字段为表达式 2.4 别名 2.5 去重&#xff1a;DISTINCT 2.6 排序&#xff1a;ORDER BY 2.7 条件查询&#xff1a;WHERE 2.8 分页查询&#xff1a;LIMIT 3.修…

ARMday01(计算机理论、ARM理论)

计算机理论 计算机组成 输入设备、输出设备、运算器、控制器、存储器 1.输入设备&#xff1a;将编写好的软件代码以及相关的数据输送到计算机中&#xff0c;转换成计算机能够识别、处理和存储的数据形式 键盘、鼠标、手柄、扫描仪、 2.输出设备&#xff1a;将计算机处理好的数…

警告:未配置spring boot 配置注解处理器

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 问题 我再使用ConfigurationProperties(prefix “redisson”)去加载配置文件中的属性的时候&#xff0c;发现idea有个警告 并且配…

系统提示缺少或找不到msvcp140.dll文件的解决方法

MSVCP140.dll是Microsoft Visual C 2015 Redistributable的一个组件&#xff0c;它是运行许多Windows应用程序所必需的。当您在计算机上遇到“msvcp140.dll丢失”的错误消息时&#xff0c;这意味着您的系统缺少这个重要的动态链接库文件。以下是详细介绍的5种解决方法&#xff…

Halcon WPF 开发学习笔记(1):Hello World小程序

文章目录 文章专栏视频链接Hello World训练图片训练目的 开始训练图像预处理导入图像三通道处理调用算子通道选取 滤波什么是好的滤波 增加对比度 区域选取阈值处理算子参数选择运行结果(红色为选择区域) 区域分割运行结果 特征筛选参数代码第二次&#xff0c;面积筛选 画选中十…

网络工程师回顾学习

根据书本目录&#xff0c;写下需要记忆的地方&#xff1a; 参考之前的笔记&#xff1a; 网络工程师回答问题_one day321的博客-CSDN博客 重构第一部分需要记忆的&#xff1a; 第一章&#xff1a;计算机网络概论 计算机网络的定义和分类&#xff1a;计算机网络是指将地理位…

快速安装虚拟机centos7.5

vbox 快速导入安装centos7.5 环境准备 vbox安装&#xff08;下载地址&#xff09; ova镜像&#xff08;下载地址&#xff09;&#xff08;默认是192.168.56.10 加nat网卡&#xff09; 链接&#xff1a;https://pan.baidu.com/s/164Iprh_80HCQmKCU6V-RTw 提取码&#xff1a;if…

Oauth授权流程

我们经常会使用第三方的账号来登录某个平台&#xff0c;比如使用QQ账号登录爱奇艺&#xff0c;使用微博登录自如APP。而登录的过程中&#xff0c;会提示自如想访问你的微博公开资料、好友信息&#xff0c;或者爱奇艺要访问您QQ头像、照片等资料。那么这个过程是有一个比较复杂的…

【String类的常用方法】

文章目录 字符串构造String对象的比较字符串查找charAtindexof 转化1. 数值和字符串转化2.大小写转换 toUpperCase toLowerCase3.字符串转数组 toCharArray4.数组转字符串5.格式化 format 字符串替换替换所有的指定内容替换首个内容 字符串拆分以空格拆分特殊字符拆分多个分隔符…

【数据分享】1985-2022年我国地级市专利数据(8项指标/Excel格式/Shp格式)

专利数量是反映一个城市创新水平的重要指标&#xff0c;我们在很多研究中都会用到专利数量数据&#xff0c;之前我们也分享过一些相关数据&#xff0c;比如全国地级市2017-2019年发明专利授权数和全国地级市2017-2020年专利授权数&#xff08;均可查看之前的文章获悉详情&#…

在Linux系统下部署Llama2(MetaAI)大模型教程

Llama2是Meta最新开源的语言大模型&#xff0c;训练数据集2万亿token&#xff0c;上下文长度是由Llama的2048扩展到4096&#xff0c;可以理解和生成更长的文本&#xff0c;包括7B、13B和70B三个模型&#xff0c;在各种基准集的测试上表现突出&#xff0c;最重要的是&#xff0c…

FHEW 和 TFHE 的统一框架:标准化 FHE

参考文献&#xff1a; [GHS12] Gentry C, Halevi S, Smart N P. Better bootstrapping in fully homomorphic encryption[C]//International Workshop on Public Key Cryptography. Berlin, Heidelberg: Springer Berlin Heidelberg, 2012: 1-16.[GHPS12] Gentry C, Halevi S,…

视频编辑SDK测试

短视频编辑SDK测试有一段时间了&#xff0c;因此抽时间对编辑SDK的相关内容进行简要复盘。 功能说明 短视频编辑SDK支持gif&#xff0c;不同格式的图片&#xff0c;视频文件的拼接导入&#xff0c;编辑&#xff0c;添加特效&#xff0c;合成导出等功能。更具体的介绍可以参照…

14:00面试,14:06就出来了,问的问题有点变态。。。。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

Android 13.0 Launcher3 app图标长按去掉应用信息按钮

1.前言 在13.0的rom定制化开发中,在Launcher3定制化开发中,对Launcher3的定制化功能中,在Launcher3的app列表页会在长按时,弹出微件和应用信息两个按钮,点击对应的按钮跳转到相关的功能页面, 现在由于产品需求要求禁用应用信息,不让进入到应用信息页面所以要去掉应用信息…

5个高质量图片处理软件,抠图、特效不求人!

作为一个设计师或摄影家或者平面设计工作人员&#xff0c;又或者是普通人&#xff0c;只要你有图片处理的需求&#xff0c;就不可避免的会需要一个好用高效的图片处理网站&#xff0c;会抠素材&#xff0c;找图片&#xff0c;删除图片内容等等&#xff0c;都需要花费大量的时间…

【Redis】hash类型-内部编码使用场景

文章目录 内部编码测试内部编码&#xff1a; 使用场景缓存方式对比 内部编码 哈希的内部编码有两种&#xff1a; ziplist&#xff08;压缩列表&#xff09;&#xff1a;当哈希类型元素个数⼩于hash-max-ziplist-entries配置&#xff08;默认512个&#xff09;、同时所有值都⼩…

【C++】智能指针【内存泄漏|智能指针原理及使用|RAII】

目录 1、了解内存泄露 1.1 内存泄漏的定义及危害 1.2 内存泄漏分类&#xff08;了解&#xff09; 1.3 如何检测内存泄漏&#xff08;了解&#xff09; 1.4如何避免内存泄漏 2、智能指针的引出 3、智能指针的使用及原理 3.1 RAII 3.2 智能指针的原理 3.3 std::auto_pt…