EasyExcel list<Map>批量导出多个sheet

1 列表List<Map<String,Object>> list 按类型分模块分别导出到各自sheet

2 首先获取列表

List<Map<String,Object>> list = tzBusiTaskUserListService.getTaskUserList(tzBusiTaskUserList);

3 分组

Map<String,List<Map<String,Object>>> map = list.stream().collect(Collectors.groupingBy(o->o.get("T_TASK_NAME").toString()));

4.获取表头,这里自定义表头我是自己配置到数据库的,List<T> 实体或者map都可以

List<Map<String,Object>> listColumn = tzBusiTaskListService.getTaskUserColumns();
Map<String,List<Map<String,Object>>> mapColumn = listColumn.stream().collect(Collectors.groupingBy(o->o.get("FORM_NAME").toString()));

5接下来就是导出

ExcelWriter excelWriter = null;
//  设置内容格式 以及 编码方式(文件指定可以修改)
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("人员任务列表数据"+System.currentTimeMillis(), "UTF-8").replaceAll("\\+", "%20");
//attachment指定独立文件下载  不指定则回浏览器中直接打开
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");//输出文件流  调用服务层方法,获取excel对象放入输出流
excelWriter = EasyExcel.write(response.getOutputStream()).build();
int i = 0;

最后:完整代码

   //导出excel/*** 输出多个sheet,自定义表头** @param response 输出多excel表格,让用户下载*/@PostMapping("/exportSheetsWithHeaders")public void exportSheetsWithHeaders(HttpServletResponse response) throws Exception{ExcelWriter excelWriter = null;try{//  设置内容格式 以及 编码方式(文件指定可以修改)response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("人员任务列表数据"+System.currentTimeMillis(), "UTF-8").replaceAll("\\+", "%20");//attachment指定独立文件下载  不指定则回浏览器中直接打开response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");//输出文件流  调用服务层方法,获取excel对象放入输出流TzBusiTaskUserList tzBusiTaskUserList = new TzBusiTaskUserList();//            List<TzBusiTaskUserList> list = tzBusiTaskUserListService.selectAll(tzBusiTaskUserList);List<Map<String,Object>> list = tzBusiTaskUserListService.getTaskUserList(tzBusiTaskUserList);if(list.isEmpty()){response.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");response.getWriter().println(JSON.toJSONString(ApiResp.fail("无数据")));return;}Map<String,List<Map<String,Object>>> map = list.stream().collect(Collectors.groupingBy(o->o.get("T_TASK_NAME").toString()));List<Map<String,Object>> listColumn = tzBusiTaskListService.getTaskUserColumns();Map<String,List<Map<String,Object>>> mapColumn = listColumn.stream().collect(Collectors.groupingBy(o->o.get("FORM_NAME").toString()));if(listColumn.isEmpty()) {response.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");response.getWriter().println(JSON.toJSONString(ApiResp.fail("字段为空")));return;}excelWriter = EasyExcel.write(response.getOutputStream()).build();int i = 0;for (String key:map.keySet()) {if(mapColumn.get(key) == null || mapColumn.get(key).get(0).get("ORA_FIELDS") ==null) continue;String columns = "T_TASK_NAME,T_TASK_TYPE,T_START_TIME,T_END_TIME,"+mapColumn.get(key).get(0).get("ORA_FIELDS").toString()+",CREATE_USER,CREATE_USER_NAME,CREATE_PHONE,CREATE_TIME,CREATE_COUNTY,CREATE_GRID";String headers = "任务名称,任务周期,任务开始时间,任务结束时间,"+mapColumn.get(key).get(0).get("TITLES").toString()+",上报人工号,上报人姓名,上报人电话,上报时间,上报人县市,上报人网格";List<Map<String,Object>> val = map.get(key);List<List<String>> headList = EasyExcelUtil.headList(headers);List<List<Object>> dataList =  EasyExcelUtil.dataList(val,columns);if(dataList.isEmpty()) continue;WriteTable writeTable = new WriteTable();writeTable.setHead(headList);WriteSheet writeSheet = EasyExcel.writerSheet(i,key).build();excelWriter.write(dataList, writeSheet,writeTable);i++;}}catch (Exception e) {// 重置responselog.error("异常",e);response.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");response.getWriter().println(JSON.toJSONString(ApiResp.fail("下载失败",e.getMessage())));}finally {//关闭流if(excelWriter != null){excelWriter.finish();}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop学习笔记(HDP)-Part.16 安装HBase

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

vue3 vue-router过渡动效 滚动行为 (四)

文章目录 一、过渡动效1.1安装animate.css1.2 利用元信息存储过渡名称1.3 在组件中使用 二、滚动行为2.1 始终滚动到顶部2.2 相对于某个元素的偏移量2.3 保持之前的滚动位置 一、过渡动效 1.1安装animate.css npm install animate.css --save1.2 利用元信息存储过渡名称 {pa…

ROS opencv PCL Ceres-solver之间版本对应关系

ROS1 : neotic Opencv : 4.6.0 Ceres-solver : 2.0.0

ABAP 报表工具栏缺少小计按钮

解决方案&#xff1a; 在sap标准程序 SAPLKKBL 中有多个标准的的状态栏 都有小计按钮 复制过来之后却不显示&#xff0c;调试发现&#xff0c; 在 pf_status_alv里面做了excluding &#xff0c;需要把小计排除 调试RT_EXTAB. 说明程序默认给隐藏了 不显示&#xff0c;删除调…

教你用Python+selenium搭建自动化测试环境

一、环境搭建 1、安装pythonpycharm软件 。python安装网址官网&#xff1a;About Python™ | Python.org 根据自己的电脑系统选择最新版本 下载到本地&#xff0c;选择安装路径并配置好环境变量 验证安装是否成功 搜索中录入cmd 打开命令窗口 录入python显示一下版本号表示…

微服务实战系列之Cache(技巧篇)

前言 凡工具必带使用说明书&#xff0c;如不合理的使用&#xff0c;可能得到“意外收获”。这就好比每个人擅长的领域有所差异&#xff0c;如果放错了位置或用错了人&#xff0c;也一定会让 Leader 们陷入两难之地&#xff1a;“上无法肩负领导之重托&#xff0c;下难免失去伙伴…

软件测试基础知识总结

之前有将基础的软件测试知识做了一个总结&#xff0c;但比较潦草&#xff0c;很多内容只是一笔带过&#xff0c;快到年底了&#xff0c;自己也有个写年终知识总结文档的计划&#xff0c;就将基础的理论知识重新整理一番。 有人问我&#xff0c;这些都是能搜索到的知识&#xf…

用IDEA创建Java类时自动生成作者注释等信息

File->settings-->Editor->File and Code Templates->Includes->File Header(双击)&#xff0c;然后在右边输入框内输入代码即可 /*** Author 作者名* Date ${DATE} ${TIME}* version 1.0* 注释*/

C++日常遇到的一些坑的总结

一、const 相关 C中const的不同位置的用法 const 修饰符用法总结 二、函数形参没有变量名 三、指针偏移问题 笔记&#xff1a; 包含来自C标准库的头文件&#xff0c;用#inlcude<xxx>&#xff0c;包含不来自C标准库的头文件&#xff0c;用#include"xxx"最…

BitWarden数据迁移以及邮箱SMTP配置

bitwarden 个人密码库&#xff0c;这是我玩nas之后最想推荐的一个东西&#xff0c;今天就来分享一下 之前使用bitwarden都是网上现成的文章照抄&#xff08;能搜到的都是抄来抄去的简直离谱&#xff09;&#xff0c;导致邮箱无法使用、数据库也只是本地的sqlLite很不方便。 前…

分布式版本管理系统---->Git(Linux---centos(保姆式)讲解1)

文章目录: 1:什么是Git以及作用 2.Git的基本操作过程(创建git仓库,配置仓库的配置) 3.git的工作区&#xff0c;暂存区&#xff0c;版本库的关系 4.将文件添加到版本库&#xff1a;git add 与git commit -m命令 5.git log查看日志的引入 6.查看.git文件中的内容 7.修改文件内容查…

15:00的面试,15:06就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

java中BigDecimal里面的subtract函数的意思?

在Java中&#xff0c;BigDecimal类提供了一个名为subtract()的函数&#xff0c;用于执行两个BigDecimal对象的减法操作。该函数返回一个新的BigDecimal对象&#xff0c;表示两个操作数相减的结果。 下面是BigDecimal.subtract()函数的用法示例&#xff1a; java Copy code im…

L1-020:帅到没朋友

题目描述 当芸芸众生忙着在朋友圈中发照片的时候&#xff0c;总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤100&#xff09;&#xff0c;是已知朋友圈的个数&#xff1b;随后N行&#…

代码随想录算法训练营第28天|● 93.复原IP地址 ● 78.子集 ● 90.子集II

93. 复原 IP 地址 已解答 中等 相关标签 相关企业 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地…

Java多线程详解(上)——2023/11/23

Process&#xff08;进程&#xff09;与Thread&#xff08;线程&#xff09; 说起进程&#xff0c;就不得不说下程序。程序是指令和数据的有序集合&#xff0c;其本身没有任何运行的含义&#xff0c;是一个静态的概念。而进程则是执行程序的一次执行过程&#xff0c;它是一个动…

基于微服务架构的外卖系统源码开发

在当前互联网时代&#xff0c;外卖行业蓬勃发展&#xff0c;用户对于高效、智能的外卖服务需求不断增加。为了满足这一需求&#xff0c;采用微服务架构的外卖系统成为了开发的主流方向。本文将探讨基于微服务的外卖系统源码开发&#xff0c;涉及到关键技术和示例代码。 1. 微…

伪原创软件盘点,文本处理事半功倍

在工作中&#xff0c;我们常常需要处理大量的文字信息&#xff0c;无论是写作、编辑还是其他文本相关的工作。有时候&#xff0c;为了提高效率&#xff0c;我们可能会需要一些伪原创软件&#xff0c;它们可以帮助我们巧妙地改写文本&#xff0c;使之保留原意的同时呈现出全新的…

Nacos前世今生、安装配置、服务注册源码、整合Springboot实战

一、前言 随着微服务架构的兴起&#xff0c;服务的规模不断增长&#xff0c;对于服务的发现、配置和管理变得越来越复杂。 在这个背景下&#xff0c;Nacos应运而生&#xff0c;以其强大的功能和灵活性成为云原生领域的瑞士军刀之一。 Nacos是一个由阿里巴巴开源的项目&#…

在Spring Cloud中使用组件Zuul网关,并注册到Eureka中去

在上一篇中&#xff0c;我们搭建了Spring Cloud的父子模块&#xff0c;并实现了一个Eureka子模块的启动&#xff0c;可以通过浏览器地址去访问Eureka主页了&#xff0c;相信了解过的童鞋应该看到&#xff0c;主页上并未有任何服务去注册&#xff0c;那么我们就在这篇&#xff0…