一、回顾

继上次“动态表头easyExcel导入导出(https://blog.csdn.net/qq_37337660/article/details/114680512)”,
和上上次“动态表头导入(https://blog.csdn.net/qq_37337660/article/details/110288393)”之后。

我们迎来了第三波【easyExcel官网】的折磨,这次导出复杂的Excel,顺便用了【hutool官网】里面的Excel功能。

1.第一步是设计模板,利用模板导出一份新的xlsx;
2.第二步是利用hutool把新的xlsx读取,然后往里加数据,同时调整格式,合并单元格,改动sheet名称等。

需求:导出:多页sheet、复杂表头、sheet名称改动、单元格合并、简单格式调整

分析:以上这个sheet0的格式要求,可以看出前面几列的格式非常复杂且固定、表头也是相对固定。我们只要把剩下的空白格子和标题利用填充的办法就可以搞定。模板如下:

二、easyExcel的填充功能

官网填充:https://www.yuque.com/easyexcel/doc/fill
这次就少说废话了,代码都加上了注释

private String doFill() {String fileName = unit.getShortname() + startTime + "—" + endTime + "导出.xlsx";// 指定新文件的路径和名称File file = new File(FORM_STORE_PATH + fileName);if (!file.getParentFile().exists()) {boolean mkdirs = file.getParentFile().mkdirs();}String newFile = file.getPath();// 这里是填充的模板,放到resource下InputStream template = this.getClass().getResourceAsStream("/template/模板.xlsx");com.alibaba.excel.ExcelWriter excelWriter = EasyExcel.write(newFile).withTemplate(template).build();// 开始填充(我这里有8个sheet,每一个里面都有标题动态填充。这里先把标题填充好,把sheet0、2的内容填充好)for (int sheetNo = 0; sheetNo < 8; sheetNo++) {WriteSheet writeSheet = EasyExcelFactory.writerSheet(sheetNo).build();writeSheet.setSheetName(getSheetNameBySheetNo(sheetNo));FillConfig fillConfig =FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();excelWriter.fill(new FillWrapper("CommonTitle", Collections.singleton(title)),// 这个就是模板里面的前缀fillConfig,writeSheet);switch (sheetNo) {case 0:excelWriter.fill(new FillWrapper("data", getData()),// "data"这个就是模板里面的前缀writeSheet);break;case 2:excelWriter.fill(new FillWrapper("data", getData()),// 这个就是模板里面的前缀writeSheet);break;default:break;}}excelWriter.finish();return fileName;}
//这里严格按照定义的顺序封装数据。list有几行,就会往下填充几行(当然也可以用map装数据,可以看看官网怎么用的)
private List<Sheet02Statistic> getData() {}
//实体类定义如下
public class Sheet02Statistic {/** 本期 */private Long bq;/** 上期 */private Long sq;/** 本期增长率 */private String bqRate;/** 去年同期 */private Long qntq;/** 去年同期增长率 */private String qntqRate;/** 今年以来 */private Long jnyl;/** 今年以来增长率 */private String jnylRate;
}

三、hutool的Excel生成-ExcelWriter

各类用法参考官网:https://www.hutool.cn/docs/#/poi/Excel%E7%94%9F%E6%88%90-ExcelWriter
原始第8个sheet:

通过下面代码生成后的:

这里截取部分代码:

// newFilePath 是刚刚用模板生成的文件的路径
private void doWrite(String newFilePath) {cn.hutool.poi.excel.ExcelWriter writer = ExcelUtil.getWriter(newFilePath);writeSheet1(writer);writeSheet3(writer);writeSheet5(writer);writeSheet6(writer);writeSheet7(writer);writeSheet8(writer);//这里改sheet名称writer.renameSheet(0, title.getSheet0());writer.renameSheet(1, title.getSheet1());writer.renameSheet(2, title.getSheet2());writer.renameSheet(7, title.getSheet7());//如果有用了公式,用这个来使公式生效Workbook workbook = writer.getWorkbook();workbook.setForceFormulaRecalculation(true);writer.close();}private void writeSheet8(cn.hutool.poi.excel.ExcelWriter writer) {//设置字体Font font = writer.createFont();font.setFontName("黑体");font.setFontHeightInPoints((short) 12);//设置头样式。去除背景setFillPatternCellStyle headCellStyle = writer.getHeadCellStyle();headCellStyle.setFillPattern(FillPatternType.NO_FILL);headCellStyle.setFont(font);headCellStyle.setBorderTop(BorderStyle.NONE);headCellStyle.setBorderRight(BorderStyle.NONE);headCellStyle.setAlignment(HorizontalAlignment.LEFT);List<Sheet8Statistic> data1 = getSheet8StatisticData(1);writer.setSheet(8);//跳过前的几行writer.passRows(4);//写入表1的内容writer.write(data1);//表1写完了,再跳一行writer.passRows(1);//生成第二张表的表头信息。合并单元格writer.merge(5 + data1.size(), 5 + data1.size(), 0, 7, "(三)标题", true);writer.merge(6 + data1.size(), 7 + data1.size(), 0, 0, "", false);writer.merge(6 + data1.size(), 7 + data1.size(), 1, 1, "本期", false);writer.merge(6 + data1.size(), 6 + data1.size(), 2, 3, "上期", false);writer.merge(6 + data1.size(), 6 + data1.size(), 4, 5, "去年同期", false);writer.merge(6 + data1.size(), 6 + data1.size(), 6, 7, "今年以来", false);//跳过刚刚的表头信息行writer.passRows(2);List<Sheet8Statistic> data2 = getSheet8StatisticData(2);data2.add(0, new Sheet8Statistic("无", "本期", "件", "±%", "件", "±%", "件", "±%"));writer.write(data2);}
//这里严格按照定义的顺序封装数据。list有几行,就会往下填充几行(当然也可以用map装数据,可以看看官网怎么用的)
private List<Sheet8Statistic> getSheet8StatisticData(int tableNo) {}
//实体类定义如下
public class Sheet8Statistic {/** 地区 */private Object area;/** 本期 */private Object bq;/** 上期 */private Object sq;/** 本期增长率 */private Object bqRate;/** 去年同期 */private Object qntq;/** 去年同期增长率 */private Object qntqRate;/** 今年以来 */private Object jnyl;/** 今年以来增长率 */private Object jnylRate;
}

到这里写入的数据都差不多了,有问题或不对的地方欢迎评论指教。利用easyExcel的填充功能,和hutool的写入功能完成一份报表的导出。需要注意的是我这边数据很小无所谓,hutool这个是先把所有数据都写入内存,最后再写入文件的,数据太大就要再处理了,官网也提到了多次写入的办法那些。

用到的依赖:

 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version></dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>
<!--https://www.hutool.cn/docs  hutool有单独的poi包,我这里用的all了。他依赖上面的poi4.1.2 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.14</version></dependency>

下面附上一些用到的常用方法:

四、计算增长率、同比环比、比重等

/*** 计算增长率 2位小数** @param bq 本期* @param sq 上期*/protected String calculateRate(Long bq, Long sq) {DecimalFormat df = new DecimalFormat("0.00");if (sq == 0) {return "0";}return df.format((float) (bq - sq) / sq * 100);}/*** 计算同比、环比、比重** @param bq 本期* @param sq 上期*/protected static String calculateTbHb(Long bq, Long sq) {if (sq == 0) {return "0";}BigDecimal bqBigDecimal = BigDecimal.valueOf(bq);BigDecimal sqBigDecimal = BigDecimal.valueOf(sq);BigDecimal result =(bqBigDecimal.subtract(sqBigDecimal)).divide(sqBigDecimal, 4, BigDecimal.ROUND_UP).multiply(BigDecimal.valueOf(100L)).setScale(2, BigDecimal.ROUND_UP);if (result.compareTo(BigDecimal.ZERO) > 0) {return "+" + result.doubleValue();} else if (result.compareTo(BigDecimal.ZERO) < 0) {return String.valueOf(result.doubleValue());} else {return "0";}}

EasyExcel第三弹 + hutool-poi 配合使用导出较复杂Excel.xlsx + 计算增长率、同比环比、比重等相关推荐

  1. 利用EasyExcel完整的springboot +vue前后端导出并下载excel表格

    文章目录 写在前面 正文 1. springboot后端引入easyexcel及使用 1.1 引入依赖 1.2 接口serviceImpl方法 1.3 提供一个对list集合去重的方法(根据相同key ...

  2. java导出复杂excel表格_java使用freemarker导出复杂的excel表格

    正常导出excel表格使用的poi,但是导出复杂的excel有点困难,但是可以使用freemaker模板来导出复杂的excel. 都是先生成一个Excel表格的模板,最好是增加一行数据.具体看图里面的 ...

  3. Java操作Excel三种方式POI、Hutool、EasyExcel

    Java操作Excel三种方式POI.Hutool.EasyExcel 1. Java操作Excel概述 1.1 Excel需求概述 1.2 Excel操作三种方式对比 2. ApachePOIExc ...

  4. Apache POI和EasyExcel 第三集:Apache POI的Excel大数据量写入(分为03版的xls、07版的xlsx、升级版SXSSF)

    Apache POI和EasyExcel 第三集:Apache POI的Excel大数据量写入(分为03版的xls.07版的xlsx.升级版SXSSF) 一.结果 我的03跑了1.204秒,07跑了5 ...

  5. EasyExcel 三分钟搞定导入导出

    前言:本文章教你从零开始,三分钟搞定excel单sheet导出.导入.多sheet导出.导入.excel模板导入单个sheet.多个sheet,废话不多说,直接上代码 1.引入依赖 <!--ex ...

  6. Apache POI和EasyExcel 第二集:Apache POI的基本Excel写入(分为03版的xls和07版的xlsx)

    Apache POI和EasyExcel 第二集:Apache POI的基本Excel写入(分为03版的xls和07版的xlsx) 一.导入依赖 老样子使用Maven,比较方便,一个dependenc ...

  7. MaxCompute - ODPS重装上阵 第三弹 - 复杂类型

    摘要: MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个BU的核心业务. MaxCompute除了持续优化性能外,也 ...

  8. 利用hutool工具类导出Excel

    简单介绍 可以使用hutool工具类,简单的生成Excel.本质上还是使用的POI组件,只是对其进行了封装,避免开发人员重复造轮子 hutool工具类链接 maven导入 <!-- hutool ...

  9. 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出

    由于 poi 本身只是针对于 excel 等office软件的一个工具包,在一些常规的 excel 导入导出时,还需要再做一次精简的封装,简化代码耦合. 一.现状 本人经历过几家公司的代码封装,导入导 ...

最新文章

  1. 浏览器时间久了重新登录_注意!今日开始打印一建准考证,附各地时间及常见问题汇总...
  2. SAP批次级别的意义及启用操作
  3. 【MFC】根据菜单创建工具栏
  4. php的异常详解,php5异常处理详解_php
  5. c语言:宏里面参数不加括号容易出错,在使用时尽量加括号及举例
  6. 模板:线段树标记永久化
  7. flowable实战(三)flowable流程实例管理接口
  8. ThinkPHP 基础
  9. 鲲鹏展翅 力算未来 | openEuler操作系统源代码正式开放
  10. apipost如何设置断言
  11. 联想tab.android 8,安卓平板顶级对决 联想TAB S8-50 PK 小米平板
  12. 【转】mutation接收单个参数和多个参数
  13. 关于cc2500的介绍
  14. FPS游戏(UE4,U3D引擎)方框绘制,骨骼透视,BT功能的原理 和反外挂策略
  15. bash shell学习-实践 (自己实现一些小工具)
  16. 天道酬勤,仅仅两年,我便做上了那个测试老大···
  17. 读懂 指令、程序、微命令、微操作、微指令、微程序、微地址
  18. 5年市值蒸发2000多亿 绿地控股二次混改能否迎来春天?
  19. 人工智能的可行性分析
  20. CSU 1596: Dick.Z 的炉石赛(模拟)

热门文章

  1. Java SSM 重制版(三)SpringSecurity
  2. 小程序接入查快递功能
  3. Wow.js学习笔记
  4. 《人性的弱点》经典名句
  5. Css font-family字体对照表
  6. 前后端开发bug:python+vue开发图片验证码接口时,刷新浏览器不显示图片验证码,点击以后才可以显示和切换
  7. Windows重装win8,Mac安装win7双系统
  8. 背靠隆力奇日化零售却“力不从心”,聚好商城问题出在哪儿?
  9. 说信任区块链时究竟在信任什么?
  10. android.support.v7的v7报红,但程序不影响编译