前言

最近接手一个需求,需要在现有项目中添加一个菜单栏目,其中有个导出excel的功能,但是格式相对有些复杂,有单组数据的显示,也有多组数据的显示,查了好多文章,都不是很明白.但是这篇文章和我的需求差不多非常相似(链接放在文末),根据这篇文章然后将自己的实现过程记录了下来,以防之后再用到.

这是我需要导出的excel格式
开头是单条数据的展示
之后是多条数据的展示

1.要想导出复杂的excel样式 需要用到自定义excel模板---->意思就是我们根据自己需要的excel格式,新建一个excel,然后将完整的格式先画出来,将固定的标题内容填好,单元格大小,背景色等等.
2.需要改变的数据用{}花括号包含起来
单个的数据直接{实体对应的属性名}例如:用户名{userName}密码{password}
多条数据{.实体对应的属性名} 例如: 时间{.date} 编号{.id} 加点.的意思就是显示多条数据
3.要注意:
如果一个excel文件中需要显示多个list.之前需要加标识,用来区分哪个数据是谁的.例如: 地址{list1.address}编号{list2.id}

这是我写的excel模板

因为我只需要一个list显示多条数据,所以我.之前没有加标识

导入依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version>
</dependency>

前端

import { getParamString } from '/@/api/commn/common';
import { getAppEnvConfig } from '/@/utils/env';enum Api {DOWNLOAD_OPERATIONAL = '/ldmp/report/download/operational',
}const { VITE_GLOB_API_URL } = getAppEnvConfig();export function exportOperationalListApi(params: any) {console.log('运营数据导出==' + getParamString(params));if (import.meta.env.DEV) {window.location.href = Api.DOWNLOAD_OPERATIONAL + getParamString(params);} else {window.location.href = VITE_GLOB_API_URL + Api.DOWNLOAD_OPERATIONAL + getParamString(params);}
}

后端

ExcelUtils (自己封装的easyExcel工具类)

public class ExcelUtils {/*** 导出固定表头Excel* Author wang.lch* @param response* @param list* @param name* @param sheetName* @param model* @throws Exception*/public static void exportExcel(HttpServletResponse response, List<? extends BaseRowModel> list,String name, String sheetName, BaseRowModel model) throws Exception{SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");String date = sdf.format(new Date());String fileName = new String(name.getBytes(), CommonConstants.UTF8) + date + ".xlsx";response.setHeader("Content-Disposition", "attachment;filename=" + fileName);EasyExcel.write(response.getOutputStream(), model.getClass()).sheet(sheetName).doWrite(list);}/*** 导出复杂表头的Excel 先单组数据填充,再多组数据填充* @param response* @param list 多组数据List* @param map 单组数据Map* @param outFileName 导出的Excel名称* @param templateFileName Excel模板的路径名称* @throws Exception*/public static void exportExcel(HttpServletResponse response, List<? extends BaseRowModel> list, Map<String,Object> map,String outFileName, String templateFileName ) throws Exception{//告诉response下载的是excel文件response.setContentType("application/vnd.ms-excel");//告诉response使用utf-8编码格式response.setCharacterEncoding("utf-8");//.withTemplate(templateFileName)就是读取模板//.write(ExcelUtil.getOutputStream(outFileName, response))是将数据写入文件,并交给responseExcelWriter excelWriter = EasyExcel.write(ExcelUtils.getOutputStream(outFileName, response)).withTemplate(templateFileName).build();//创建Sheet//设置excel Sheet为第几张并设置名称//.writerSheet(0,"第一个")中前面的参数为sheetNo,就是第几张sheet//第二参数为sheet名称//不写就是默认WriteSheet writeSheet  = EasyExcel.writerSheet().build();// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存//.direction(WriteDirectionEnum.VERTICAL)这个是设置list填入的时候是纵向填入FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).forceNewRow(Boolean.FALSE).build();//这里是将list填充到excel中。//会去找模板上对应的数据填入,例如模板中的{list.getGoodsName}就是下面List集合中名为goodsName字段对应的数据//new FillWrapper("list", selectOrderDTO.getSelectOrderGoodsDTOS())前面的参数是设置一个填入的list名//后面的参数是获得的list,里面就包含了要填入的数据//.fill()主要就是将数据填入excel中excelWriter.fill(new FillWrapper(list), fillConfig, writeSheet);//这里是将一些普通数据放到map中,方便填入,可以看getStringObjectMap()。//map的String是对应的名称,Object就是数据了。//将数据填入excelWriter.fill(map, writeSheet);//关闭excelWriter.finish();}/*** 这是ExcelUtil.getOutputStream* 这里就是将文件下载交给了浏览器* @return*/public static OutputStream getOutputStream(String Name, HttpServletResponse response) throws Exception {//这里是对文件的重命名SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");String date = sdf.format(new Date());String fileName = new String(Name.getBytes(), CommonConstants.UTF8) + date + ".xlsx";// 这里文件名如果涉及中文一定要使用URL编码,否则会乱码response.setContentType("application/force-download");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);return response.getOutputStream();}
}

controller层

调用写好的工具类的 exportExcel 方法 参数: 第一个 response, 第二个list (需要在excel中显示的多条数据的list数据),第三个map (需要在excel中显示的单条数据的map), 第四个 outFileName (导出的excel的文件名)(文件名+时间) , 第五个templateFileName (自己建的excel模板路径)

需要显示的单条数据放在map
需要显示的多条数据放在list

/*** 运营数据信息导出** @return ApiResult*/@SysLog("运营数据信息导出")@ApiOperation(value = "运营数据信息导出")@GetMapping("/download/operational")public void downloadOperational(HttpServletResponse response, OperationalDataAnalyticalDto operationalDataAnalyticalDto) {try {List<OperationalDataAnalyticalModel> OperationalList = operationalDataAnalyticalService.operationalListModel(operationalDataAnalyticalDto);OperationalDataAnalyticalDto count = operationalDataAnalyticalService.getNoiseInfoCount(operationalDataAnalyticalDto);//创建map将查询的数据get后方在map中 一一对应excel模板中的属性名HashMap<String, Object> map = new HashMap<>();map.put("thisTimeInstallCount", count.getThisTimeInstallCount());map.put("addInstallCount", count.getAddInstallCount());map.put("nowLeaveCount", count.getNowLeaveCount());map.put("installDateStar", count.getInstallDateStar());map.put("installDateEnd", count.getInstallDateEnd());map.put("district", count.getDistrict());map.put("isLeakCount", count.getIsLeakCount());map.put("isDoubtCount", count.getIsDoubtCount());map.put("isNormalCount", count.getIsNormalCount());map.put("isOfflineCount", count.getIsOfflineCount());//excel模板路径String templateFileName = "/opt/services/file/OperationalTemplate.xlsx";System.out.println(templateFileName);ExcelUtils.exportExcel(response, OperationalList, map, FileName.OPERATIONAL_INFO, templateFileName);} catch (Exception e) {e.printStackTrace();}}

serviceImpl层

想要对查询的数据先一步进行处理,可以在serviceImpl中编写

 /*** 导出噪声设备拆装历史信息列表信息导出** @return List<OperationalDataAnalyticalModel>*/@Overridepublic List<OperationalDataAnalyticalModel> operationalListModel(OperationalDataAnalyticalDto operationalDataAnalyticalDto){return baseMapper.getOperationalExcel(operationalDataAnalyticalDto);//对查询的数据进行复杂的处理}

结果展示:

参考文章:https://blog.csdn.net/weixin_44459007/article/details/115555795?

使用EasyExcel的模板导出复杂表头的Excel- 先单组数据填充,再多组数据填充相关推荐

  1. easyexcel复杂模板导出(合并行列,列统计汇总)

    easyexcel复杂模板导出(合并行列,统计汇总) 为什么使用easyexcel 1. easyexcel可以通过模板导出(符合项目使用习惯) 2. easyexcel支持大数据量导出,性能较好(满 ...

  2. 阿里easyexcel通过模板导出excel

    easyexcel通过模板导出excel 之前使用其他方式进行excel的导出,像poi或者freemarker或者Beetl,效果都还行,但是总是有一些小问题.许多的解决思路都是:通过制作excel ...

  3. EasyExcel根据模板导出动态修改sheet名称

    前言 在公司中使用easyexcel根据模板导出excel表格数据时,由于需要根据不同内容动态修改模板中sheet的名称,网上搜索也很少有这一块的具体实现,所以就给大家分享一下自己的实现方式(也是作者 ...

  4. EasyExcel通过模板导出数据

    EasyExcel通过模板导出数据 大家好,这两天在做excel导出功能,使用的是easyExcel,不得不说其功能全面,很好入手. 但是在开发的过程中也会遇到一些文档里无法提供解决的问题,这里我分享 ...

  5. POI动态导出多层表头的EXCEL文件

    POI动态导出多层表头的EXCEL文件 表格表头导出 单行表头 多行表头 以前接触过一个很古老的导出Excel,实现的逻辑是先声明一个导出的Excel模板,模板里报表的表头名称和顺序是固定的,这样执行 ...

  6. 使用easy excel导出复杂表头的excel

    使用easy-excel导出复杂表头的excel 今天想写一个双层表头的excel导出,一开始使用的是poi来画发现太麻烦, 于是就想到了使用easy-excel的模板填充来实现,将导出写成了一个简单 ...

  7. java通过Excel 模板导出复杂统计类excel文档,在ruoyi前后端分离框架中的应用

    Hello, 大家好! 我是不作死就不会死,智商不在线,但颜值超有品的拆家队大队长 --咖啡汪 一只不是在戏精,就是在戏精路上的极品二哈 前几天刚做了java通过Excel 模板导出复杂统计类exce ...

  8. Easypoi使用模板导出文档或excel表格详解

    Easypoi使用模板导出docx文档或excel表格详解 **doc或docx文档的模板导出** **Excel的模板导出** 话不多说先上依赖 <dependency><grou ...

  9. EasyExcel导入、导出合并单元格excel文件

    原文地址:https://blog.csdn.net/weixin_42195311/article/details/110441885 <!--版本最好大于2.2.6,版本太低会导致没有ext ...

  10. EasyExcel 实现模板导出、模板导入分析功能

    文章目录 0.POM依赖 1.导出模板实现 2.导入模板并分析实现 3.git源码 0.POM依赖 <dependencies><dependency><groupId& ...

最新文章

  1. 最短路径·三:SPFA算法 HihoCoder - 1093 (spfa无向图)
  2. Kafka学习-复制
  3. python和sqlserver_利用python实现mysql数据库向sqlserver的同步
  4. oracle audit文件,[20191128]oracle Audit文件管理2.txt
  5. Python enum的使用总结
  6. 简单php web ftp服务器,php 上传文件到ftp服务器的简单示例(单文件)
  7. 离婚算法:说不清的感情对错,但算得清的财产分割
  8. BZOJ4519 CQOI2016不同的最小割(最小割+分治)
  9. 饱和气压与温度的关系_饱和水蒸气压计算公式,看懂的赶紧来
  10. 在xp IIS上搭建动易论坛注意事项
  11. 由WPS 2005想到的
  12. 数学基础知识(2) 梯度和方向向量
  13. 连接游戏服务器网络延迟高,玩游戏网络延迟高怎么办 网络卡Ping值很高的解决方法...
  14. 论文常用 | FineBI v6.0 新图表 | 箱形图
  15. 红与黑题解(深搜入门ing)
  16. ACL:是什么?目的?使用场景?
  17. 2021春招Java面试题大全(精华六)
  18. html页中加入数学公式,Html+Css+JavaScript实现网页公式编辑器(一)
  19. 每日格言积累及总结——更新中
  20. 比尔总动员技师职业详解

热门文章

  1. 报考软件资格考试过程详解--附学习分享
  2. 外贸软件出口管理亮点有哪些,出口贸易过程全解析
  3. RabbitMQ配置SSL
  4. 【Python】1.基本语法元素
  5. java做一个客房管理系统定制_基于Java的酒店客房网上管理系统设计与实现
  6. 2021-06-01-HPC-performance-test
  7. 论文复现_显示屏装配尺寸测量
  8. C语言银行账户管理系统
  9. ES 数据导出和数据导入
  10. 概率论 —— 条件数学期望