使用easypoi导出excel实现动态列

说明

使用的是easypoi进行导出
行头是动态生成
依据key进行列匹配,进行数据填充
第一列进行纵向动态合并
自己的一个使用,记录一下

工具依赖

<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.2.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>3.2.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>3.2.0</version>
</dependency>

实现效果

变更前样式

变更后样式

代码解析

动态生成列头

  private List<ExcelExportEntity> dynamicNewAddExcel(Map<String, PlatformStatisParamRespData> paramInfo) {//表头的集合,用于添加表头List<ExcelExportEntity> entityList = new ArrayList<>();//ExcelExportEntity构造参数【第一个是列名头的统计字段,第二个是需要指定的一个key在填充数据的时候是需要根据这个key进行填充值,第三个参数是列宽】ExcelExportEntity platformXh = new ExcelExportEntity("统计字段1", "statisKey1", 30);//列的合并(纵向列的同名称会进行合并,效果见上图的平台名称的变化)platformXh.setMergeVertical(true);entityList.add(platformXh);ExcelExportEntity statisDateXh = new ExcelExportEntity("统计字段2", "statisKey2", 30);entityList.add(statisDateXh);//参数信息--[用于动态拼接列头]final Iterator<String> iterator = paramInfo.keySet().iterator();while (iterator.hasNext()) {final String paramKeyStr = iterator.next();final String paramNameStr = paramInfo.get(paramKeyStr).getDataName();//列头由参数汉字名称,参数key为列keyentityList.add(new ExcelExportEntity(paramNameStr, paramKeyStr, 30));}return entityList;}

动态填充数据

private List<Map<String, Object>> dynamicListDataByKey(List<PlatformIncomeRespDTO> statisData) {//参数类型final Set<String> statisParamKey = statisData.get(0).getParamInfo().keySet();final List<String> statisDate = statisData.get(0).getStatisDate();final int platformNum = statisData.size();//最终的数据List<Map<String, Object>> datas = new ArrayList<>();for (int i = 0; i < platformNum; i++) {for (int j = 0; j < statisDate.size(); j++) {Map<String, Object> hashMap = new LinkedHashMap<>(10);//这个是依据key进行数据的填充,(根据前面填写的statisKey1进行填充数据)hashMap.put("statisKey1", statisData.get(i).getPlatformNickName());String statisDateStr = statisDate.get(j);//这个是依据key进行数据的填充,(根据前面填写的statisKey2进行填充数据)hashMap.put("statisKey2", statisDateStr);//参数的验证for (String paramKey : statisParamKey) {for (BiPlatformStatisRespDTO paramData : statisData.get(i).getStatisData().get(j)) {if (paramKey.equals(paramData.getParamKey())) {hashMap.put(paramData.getParamKey(), paramData.getValue() + "(" + paramData.getRateValue() + ")");}}}datas.add(hashMap);}}return datas;}

excel的导出

//statisData就是我们查询出来的数据
public void downloadPlatformIncomeContrast(List<PlatformIncomeRespDTO> statisData, HttpServletResponse response) {if (CollectionUtils.isEmpty(statisData)) {return;}//获取参数信息final Map<String, PlatformStatisParamRespData> paramInfo = statisData.get(0).getParamInfo();//拼装列头List<ExcelExportEntity> colList = this.dynamicNewAddExcel(paramInfo);//数据拼装List<Map<String, Object>> list = this.dynamicListDataByKey(statisData);final String xlsFileName = DateHelper.getNowString(FormatUnit.yyyyMMddHHmmss, true) + ".xls";final Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), colList, list);//动态合并纵列[mergeMap key列索引(从0开始),value依赖的列,没有传空,startRow 开始行(从零开始)]//Map<Integer, int[]> mer = new HashMap<>();//mer.put(0, new int[]{});//PoiMergeCellUtil.mergeCells(workbook.getSheetAt(0), mer, 1);EasypoiUtil.downLoadExcel(xlsFileName, response, workbook);}
  • EasypoiUtil工具类
public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {try {response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));workbook.write(response.getOutputStream());} catch (IOException e) {throw new RuntimeException(e.getMessage());}}
  • PlatformIncomeRespDTO
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PlatformIncomeRespDTO implements Serializable {private static final long serialVersionUID = 1100499105160261425L;/*** 平台别名*/private String platformNickName;/*统计时间*/private List<String> statisDate;/*查询参数信息--[用户收入来源统计导出使用]*/private Map<String, PlatformStatisParamRespData> paramInfo;/*统计数据*/private List<List<BiPlatformStatisRespDTO>> statisData;
}
  • PlatformStatisParamRespData
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PlatformStatisParamRespData implements Serializable {private static final long serialVersionUID = 4263523446154995471L;/*** 参数名称*/private String dataName;/*** 参数key*/private String dateKey;/*** 参数描述*/private String dateDesc;}
  • BiPlatformStatisRespDTO
@Data
@AllArgsConstructor
public class BiPlatformStatisRespDTO implements Serializable {private static final long serialVersionUID = 6070471415344415351L;@Excel(name = "统计字段", orderNum = "1")private String param;/*** 参数的key*/private String paramKey;/*** 参数描述*/private String paramDesc;private String startDate;private String endDate;@Excel(name = "统计数据", orderNum = "2")private String value;private String rateValue;private Long id;private Integer riseOrFall;public BiPlatformStatisRespDTO(String startDate, String paramKey, String value) {this.paramKey = paramKey;this.startDate = startDate;this.value = value;}public BiPlatformStatisRespDTO() {}
}

测试用例

测试特殊说明

导出的结果有个控制,是在拼装的时候没有填充此数据,不影响整体效果

测试结果示例

测试数据json示例

[{"paramInfo": {"userCount": {"dataName": "用户数", "dateDesc": "用户信息", "dateKey": "userCount"}, "friendsCount": {"dataName": "好友数", "dateDesc": "好友信息", "dateKey": "friendsCount"}}, "platformNickName": "aaa", "statisData": [[{"paramKey": "userCount", "startDate": "2019-12-26", "value": "100"}, {"paramKey": "friendsCount", "startDate": "2019-12-26", "value": "200"}], [{"paramKey": "userCount", "startDate": "2019-12-27", "value": "300"}, {"paramKey": "friendsCount", "startDate": "2019-12-27", "value": "400"}]], "statisDate": ["2019-12-26", "2019-12-27"]}, {"paramInfo": {"userCount": {"dataName": "用户数", "dateDesc": "用户信息", "dateKey": "userCount"}, "friendsCount": {"dataName": "好友数", "dateDesc": "好友信息", "dateKey": "friendsCount"}}, "platformNickName": "bbb", "statisData": [[{"paramKey": "userCount", "startDate": "2019-12-26", "value": "500"}, {"paramKey": "friendsCount", "startDate": "2019-12-26", "value": "600"}], [{"paramKey": "userCount", "startDate": "2019-12-27", "value": "700"}, {"paramKey": "friendsCount", "startDate": "2019-12-27", "value": "800"}]], "statisDate": ["2019-12-26", "2019-12-27"]}
]

测试用例代码

public class Simple {/*** @Description: 拼接表头* @Param: paramInfo :表头信息* @return: java.util.List<cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity>* @Author: peikunkun* @Date: 2019/12/26 0026 上午 10:42*/private static List<ExcelExportEntity> dynamicNewAddExcel(Map<String, PlatformStatisParamRespData> paramInfo) {//表头的集合,用于添加表头List<ExcelExportEntity> entityList = new ArrayList<>();//ExcelExportEntity构造参数【第一个是列名头的统计字段,第二个是需要指定的一个key在填充数据的时候是需要根据这个key进行填充值,第三个参数是列宽】ExcelExportEntity platformXh = new ExcelExportEntity("统计字段1", "statisKey1", 30);//列的合并(纵向列的同名称会进行合并,效果见上图的平台名称的变化)platformXh.setMergeVertical(true);entityList.add(platformXh);ExcelExportEntity statisDateXh = new ExcelExportEntity("统计字段2", "statisKey2", 30);entityList.add(statisDateXh);//参数信息--[用于动态拼接列头]final Iterator<String> iterator = paramInfo.keySet().iterator();while (iterator.hasNext()) {final String paramKeyStr = iterator.next();final String paramNameStr = paramInfo.get(paramKeyStr).getDataName();//列头由参数汉字名称,参数key为列keyentityList.add(new ExcelExportEntity(paramNameStr, paramKeyStr, 30));}return entityList;}/*** @Description: 拼接数据* @Param: statisData :拼接数据* @Author: peikunkun* @Date: 2019/12/26 0026 上午 10:42*/private static List<Map<String, Object>> dynamicListDataByKey(List<PlatformIncomeRespDTO> statisData) {//参数类型final Set<String> statisParamKey = statisData.get(0).getParamInfo().keySet();final List<String> statisDate = statisData.get(0).getStatisDate();final int platformNum = statisData.size();//最终的数据List<Map<String, Object>> datas = new ArrayList<>();for (int i = 0; i < platformNum; i++) {for (int j = 0; j < statisDate.size(); j++) {Map<String, Object> hashMap = new LinkedHashMap<>(10);//这个是依据key进行数据的填充,(根据前面填写的statisKey1进行填充数据)hashMap.put("statisKey1", statisData.get(i).getPlatformNickName());String statisDateStr = statisDate.get(j);//这个是依据key进行数据的填充,(根据前面填写的statisKey2进行填充  数据)hashMap.put("statisKey2", statisDateStr);//参数的验证for (String paramKey : statisParamKey) {for (BiPlatformStatisRespDTO paramData : statisData.get(i).getStatisData().get(j)) {if (paramKey.equals(paramData.getParamKey())) {hashMap.put(paramData.getParamKey(), paramData.getValue() + "(" + paramData.getRateValue() + ")");}}}datas.add(hashMap);}}return datas;}@Testpublic void Administrator_84_20191226095523() throws IOException {System.out.println("欢迎使用单元测试方法【Administrator_84()_20191226095523】");System.out.println("此方法测试描述:【】");//拼装第一个数据---------------------------------------------------------------------final PlatformIncomeRespDTO platformIncomeRespDTO1 = new PlatformIncomeRespDTO();platformIncomeRespDTO1.setPlatformNickName("aaa");//拼装时间维度platformIncomeRespDTO1.setStatisDate(Lists.newArrayList("2019-12-26","2019-12-27"));//拼装头信息Map<String, PlatformStatisParamRespData> paramInfo1=new HashMap<>();paramInfo1.put("userCount", new PlatformStatisParamRespData("用户数","userCount","用户信息"));paramInfo1.put("friendsCount", new PlatformStatisParamRespData("好友数","friendsCount","好友信息"));platformIncomeRespDTO1.setParamInfo(paramInfo1);//拼装数据final ArrayList<List<BiPlatformStatisRespDTO>> data1 = Lists.newArrayList();data1.add(Lists.newArrayList(new BiPlatformStatisRespDTO("2019-12-26","userCount","100"),new BiPlatformStatisRespDTO("2019-12-26","friendsCount","200")));data1.add(Lists.newArrayList(new BiPlatformStatisRespDTO("2019-12-27","userCount","300"),new BiPlatformStatisRespDTO("2019-12-27","friendsCount","400")));platformIncomeRespDTO1.setStatisData(data1);//拼装第二个数据---------------------------------------------------------------------final PlatformIncomeRespDTO platformIncomeRespDTO2 = new PlatformIncomeRespDTO();platformIncomeRespDTO2.setPlatformNickName("bbb");//拼装时间维度platformIncomeRespDTO2.setStatisDate(Lists.newArrayList("2019-12-26","2019-12-27"));//拼装头信息Map<String, PlatformStatisParamRespData> paramInfo2=new HashMap<>();paramInfo2.put("userCount", new PlatformStatisParamRespData("用户数","userCount","用户信息"));paramInfo2.put("friendsCount", new PlatformStatisParamRespData("好友数","friendsCount","好友信息"));platformIncomeRespDTO2.setParamInfo(paramInfo2);//拼装数据final ArrayList<List<BiPlatformStatisRespDTO>> data2 = Lists.newArrayList();data2.add(Lists.newArrayList(new BiPlatformStatisRespDTO("2019-12-26","userCount","500"),new BiPlatformStatisRespDTO("2019-12-26","friendsCount","600")));data2.add(Lists.newArrayList(new BiPlatformStatisRespDTO("2019-12-27","userCount","700"),new BiPlatformStatisRespDTO("2019-12-27","friendsCount","800")));platformIncomeRespDTO2.setStatisData(data2);final ArrayList<PlatformIncomeRespDTO> platformIncomeRespDTOS = Lists.newArrayList(platformIncomeRespDTO1, platformIncomeRespDTO2);System.out.println(JSONObject.toJSONString(platformIncomeRespDTOS));//拼装列头List<ExcelExportEntity> colList = dynamicNewAddExcel(paramInfo2);//数据拼装List<Map<String, Object>> list = dynamicListDataByKey(platformIncomeRespDTOS);//文件名称final Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), colList, list);//此功能与【拼装列头】中的 platformXh.setMergeVertical(true);功能效果一样,可直接使用 platformXh.setMergeVertical(true);进行纵向合并//动态合并纵列[mergeMap key列索引(从0开始),value依赖的列,没有传空,startRow 开始行(从零开始)]//Map<Integer, int[]> mer = new HashMap<>();//mer.put(0, new int[]{});//PoiMergeCellUtil.mergeCells(workbook.getSheetAt(0), mer, 1);final FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\1.xls");//导出exceldownLoadExcel(null, fileOutputStream, workbook);}/*** @Description: 下载文件* @Param: fileName* @Param outputStream* @Param workbook* @return: void* @Author: peikunkun* @Date: 2019/12/26 0026 上午 10:44*/public static void downLoadExcel(String fileName, FileOutputStream outputStream, Workbook workbook)throws IOException {try {workbook.write(outputStream);} catch (IOException e) {throw new RuntimeException(e.getMessage());} finally {outputStream.close();}}
}

使用easypoi导出excel实现动态列相关推荐

  1. 使用 easypoi 导出 excel 实现动态列,完美解决!

    点击关注公众号,利用碎片时间学习 说明 使用的是easypoi进行导出 行头是动态生成 依据key进行列匹配,进行数据填充 第一列进行纵向动态合并 自己的一个使用,记录一下 工具依赖 <depe ...

  2. easypoi导出excel表格实现列宽自适应

    每日废话:每月5号发工资,但是每月感觉5号才是我最穷的一天,仔细想想,原来今天是资本家剥削压榨谈判的日子 //当前采用easypoi4.1.2版本依赖如下<!--excel 模板导出 easyp ...

  3. 使用EasyPOI导出Excel模板数据(含图片)

    使用EasyPOI导出Excel模板数据(含图片) EasyPOI功能如同名字Easy,主打的功能就是容易,让一个没接触过POI的人员可以方便的写出Excel导出,Excel模板导出,Excel导入, ...

  4. EasyPoi导出Excel实现标记颜色

    EasyPoi导出Excel实现标记颜色 PS:不知道EasyPoi 的可以看快速上手文档 <dependency><groupId>cn.afterturn</grou ...

  5. EasyPoi导出excel多Sheet遇到的坑

    问题描述 1.项目中需要多shee导出,需要动态生成列. 2.我的方法是在执行ExcelExportUtil.exportExcel之后,插入自定义的列. 3.发现在执行ExcelExportUtil ...

  6. 编码技巧——使用Easypoi导出Excel、多sheet

    本文主要介绍easypoi导出Excel的代码示例:自己之前手动实现过导出工具类<编码技巧--导出工具类>,基于实体和注解,通过反射来映射实体字段和exce列的关系:在部分工程里面看到了e ...

  7. easypoi导出excel不设置样式_EasyPOI 导出excel设置边框,背景颜色,字体样式

    EasyPOI 导出excel设置边框,背景颜色,字体样式 EasyPOI 导出代码示例ExportParams exportParams = new ExportParams(); exportPa ...

  8. Easypoi 导出excel 使用注解实现一二级标题行的单元格合并

    Easypoi 导出excel 使用注解实现一二级标题行的单元格合并 先看一下最终效果图 上代码 Excel 模板实体类 @Data public class HxAdvisoryZJEndExcel ...

  9. 用easyPoi导出excel,带多sheet,合并单元格,合计,单元格金额类型

    用easyPoi导出excel,带多sheet,合并单元格,合计,单元格金额类型 文档连接:http://easypoi.mydoc.io/ 1.引入依赖 <!-- 导出文件工具 EasyPoi ...

最新文章

  1. 一篇比较深刻的讲FP特性的文章
  2. 归纳整理--第4篇--常用软件
  3. NTFS for Mac 15如何检查与修复连接的移动磁盘
  4. layabox 打印_LayaBox开发实战之实现一个简单的模板类
  5. 亲测win10安装mac虚拟机+网络配置完整过程
  6. centos7上运行 ultravnc repeater
  7. [SSL_CHX][2021-08-19]区间和
  8. 【转载】BAPI_GOODSMVT_CREATE FUNCITON FOR MIGO 各种移动类型 源代码参考
  9. aspx页面乱码问题解决
  10. 18.集合框架(Map集合,HashMap和Hashtable的区别,Collections(集合工具类),集合练习,模拟斗地主(洗牌,发牌,看牌))
  11. 什么是企业数据?企业工商数据如何获取的。
  12. 浙江大学计算机科学排名,2017浙江大学专业排名结果
  13. 物理计算机技术研究生就业前景,2018物理学专业就业前景和就业方向分析
  14. 高级面试题--SpringBoot启动流程解析
  15. 【PySide6】三、设置系统托盘
  16. Ubuntu18.04 在线安装显卡驱动
  17. Crackme007
  18. 伟平在重阳节给深爱的父母鞠一躬
  19. JavaSwing图片绘制,实现简单的图片查看器
  20. 硬件电路设计之——DC-DC上电时电压输出尖峰电压

热门文章

  1. 倒金字塔java语言_金字塔和倒金字塔
  2. 色彩搭配的基本原理,在黑色的背景下,什么颜色才能够有效、漂亮地突出主题
  3. RAM/ROM存储器的设计
  4. awk打印除第一列之外的所有列
  5. ICLR 2022 | 基于对抗自注意力机制的预训练语言模型
  6. CAD手机看图软件使用技巧:CAD快捷命令功能
  7. Python学习 | 2022-1-14 在jupyternotebook中用markdown
  8. 出牌,用程序判断手中的牌是否能够压过对方出牌
  9. 明日之后双人十庄房子蓝图_明日之后和同居的那些事
  10. LED音乐频谱之输入数据处理