EasyPoi动态列导出Excel

最近有一个项目,项目中涉及到一张报表,领导给了个格式大概如下图所示
EasyPoi动态列导出Excel
刚看到这格式,怎么说呢。我心想很简单呀,不就是建个实体类,添加@Excel注解喽,然后直接导出不就行了。
**PS:**实体类的字段名就是上面的这个公司(有一列名字叫公司,这个公司也是一家公司,不是用作区分的,你可以把这个公司理解为“公司aaa”,跟后面那些是一样的)。

然而领导说,这个上面的公司,也就是列名数量不固定,不确定有多少,也就是动态显示的。wdmmd?这是什么操作,我吃了一惊。
EasyPoi动态列导出Excel
这里先建议大家看一下EasyPoi的官方文档,有兴趣的可以大概过一遍。没兴趣的直接往下看

先讲一下思路,我一开始想到的就是动态创建实体类,动态创建属性值,加入get和set方法。理论上是可行的,不过网上教程挺少的,所以我找了一遍就想有没有别的方法。

于是在官网找到了这么一段话
EasyPoi动态列导出Excel
简单来说就是把原来的实体类属性换成Map的key,也就是吧Map<Key,value>中的key当做类的属性,也就是我们所要的动态列名。ok,问题完美解决了。
下面就是定一下源数据的格式,用于处理成所需的样式。
EasyPoi动态列导出Excel
上面是我的实体类字段

EasyPoi动态列导出Excel
这个是我造的一些数据。动态列名就是那个companies。这个数据哪里来呢?就是从上面的数据中提取出来的不重复公司,这个应该能理解吧。那怎么提取,方法有很多,我就不具体讲了。你可以从数据库取到这些数据的时候,再在数据外面套一层
select distinct company from(你查询出结果的语句)t
这样不就获取到数据中不重复的公司了吗
那这样,数据准备好了,动态列名准备好了。下面的你总该会了吧。
EasyPoi动态列导出Excel
EasyPoi动态列导出Excel
这就是我最后做出来的成果了。有一些难点就比如说指定行和列的合并单元格,网上找了好久没找到,后来还是自己去翻文档找到的。还有就是纵向合并的单元格(这个有现成方法,但是你要保证你所有一样的数据都在一起,这里就涉及到排序了)
这里的横竖两个合计也是我用代码动态计算后创建出来的。

需要代码的留言,或联系Q1607364475,看到会回复。