扩展excel导出工具

web工程中需要大量的excel导出功能,但是每个导出功能都直接调用POI原生代码,会导致代码量的冗余,大量和业务无关的代码和业务代码混杂在一起,稀释了业务代码,降低代码的可读性。同时导出excel通用的部分很多,单独书写也降低了代码的复用性。
于是我就从网上找到了一个excel导出工具类NewExportToExcelUtil.java,可以支持单个sheet的excel导出,只要传入对象数组即可。但是我在使用过程中,很多需求不能够满足,于是进行了四项扩展,使得他更加强大。
1.兼容Map:
数组内容之前只能从从Object的属性和值的解析,但是我们很多项目数组里存的是Map,于是我扩展了对Map键值对的解析,用Map的键相当于object的属性,Map的值相当于object的值,于是实现了和前面方法的无缝对接,从而实现了对Map支持的扩展。
方法就是在解析之前,对Object的类进行判断,如果是Map就当Map解析,否则执行之前的解析方法。代码如下:
扩展excel导出工具
2.从单sheet到多sheet:
之前传参的数据是数组对象,扩展为多sheet,需要把数组再组合成一个更大的数组。于是传参格式之上又封装了一层数组。原来生成单个sheet的代码之外包装了一层循环,便实现了多sheet的支持。代码如下:
扩展excel导出工具扩展excel导出工具
3.合并列的支持:
有些需求里,需要把同列相同的元素合并起来,有的不需要,我就使用一个布尔值的参数来控制合并的开关。当合并开关打开时,我们在生成完sheet之后再进行合并处理,为了找出相同内容的列,我们先把sheet里的数据存入一个比对数组。然后循环遍历比对数组,对符合要求的列进行poi的列合并操作,代码如下:
扩展excel导出工具扩展excel导出工具
4.增加隐藏列的支持:
有些需要excel导入的表格里需要存储一些ID信息作为列的唯一标示,但是这些列需要隐藏起来,以免用户手动修改破坏了这些值。我没有通过增加参数来实现,因为参数太多增加了工具的复杂性。于是我们对列的名称下想办法,当列的名称以hide_开头时,该列隐藏。虽然hide_开头的表头不好看,但是隐藏起来就看不到了,这个缺点是发现不了的,可以忽略掉。(新特性3:sheet是否需要合并时我也想到过这个方案,但是sheet的值用户是可以看到的,加上特定的格式会在文件里被看出来,于是选择了扩展参数的方案)当生成完sheet时进行列隐藏操作,遍历所有的列表,当列名符合hide_开头的条件时,执行POI的列隐藏操作。代码如下:
扩展excel导出工具扩展excel导出工具

增加这四个特性后,excel导出需要的大多数需求基本上都能通过这四个特性实现了。