1.需求:将此页面的几个表格导出


其中表头中的仓库 集散地是是动态生成的。
首先制作Excel模板:

代码:

@Resource
private RedisService redisService;
@Override
public void assignModel(EventInfo info, HttpServletResponse response) {
AssginModelRes res=new AssginModelRes();
Object obj = redisService.getObj("modelExport-"+info.getId());
if (null == obj) {
throw new CustomException("找不到指定的事件!");
}
res = (AssginModelRes) obj;
try {
// 获取workbook对象
// 单sheet或多sheet 只需要更改此处即可
Workbook workbook = exportAssignModelByTemplate(res) ;
// 设置excel的文件名称
String excelName = "资源分配模型" ;
// 重置响应对象
response.reset();
// 当前日期,用于导出文件名称
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String dateStr = "["+excelName+"-"+sdf.format(new Date())+"]";
// 指定下载的文件名--设置响应头
response.setHeader("Content-Disposition", "attachment;filename=" +dateStr+".xls");
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 写出数据输出流到页面
OutputStream output = response.getOutputStream();
BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
workbook.write(bufferedOutPut);
bufferedOutPut.flush();
bufferedOutPut.close();
output.close();
} catch (IOException e) {
e.printStackTrace();
} }
private Workbook exportAssignModelByTemplate(AssginModelRes res) throws IOException {
// 手动创建导出数据,需根据具体业务进行查询
// sheet1内容
Map<String,Object> map = new HashMap<String, Object>() ;
map.put("w1", res.getT1().getT1header().get(0));
map.put("w2", res.getT1().getT1header().get(1));
map.put("w3", res.getT1().getT1header().get(2));
map.put("resultList1",res.getT1().getData());
for(int i=0;i<res.getT2().getT2header().size();i++) {
map.put("p"+(i+1), res.getT2().getT2header().get(i));
}
map.put("resultList2",res.getT2().getData());
map.put("resultList3",res.getT3().getData());
map.put("resultList4_1",res.getT4().get(0).getData());
map.put("resultList4_2",res.getT4().get(1).getData());
map.put("resultList4_3",res.getT4().get(2).getData());
// 设置导出配置
// 获取导出excel指定模版
TemplateExportParams template = new TemplateExportParams("templates/model.xls", true);
// 导出excel
return ExcelExportUtil.exportExcel(template , map);
}

主要是在exportAssignModelByTemplate方法内创建map将数据动态地塞进模板里,数据实体类AssginModelRes 为

package cn.com.reformer.model.comandestimate.assignmodel;

import java.io.Serializable;
import java.util.List; import lombok.Data;
@Data
public class AssginModelRes implements Serializable{ /**
*
*/
private static final long serialVersionUID = 1L;
/**
* 表格1
*/
private Table1 t1;
/**
* 表格2
*/
private Table2 t2;
/**
* 表格3
*/
private Table3 t3;
/**
* 表格4
*/
private List<Table4> t4; }
@Data
public class Table1 implements Serializable { /**
*
*/
private static final long serialVersionUID = 1L;
/*
* 表头 最近的三个仓库
*/
private List<String> t1header;
/**
* 表格数据
*/
private List<Table1Data> data; } @Data
public class Table2 implements Serializable { /**
*
*/
private static final long serialVersionUID = 1L;
/**
* 表头:事件和次生事件的地点.
*
*
*/
private List<String> t2header;
private List<Map<String, Object>> data; }
@Data
public class Table3 implements Serializable { /**
*
*/
private static final long serialVersionUID = 1L;
/*
* 表头
*/
private List<String> t3header;
private List<Map<String, Object>> data; }
/*
* 表4:分配结果
*/
@Data
public class Table4 implements Serializable { /**
*
*/
private static final long serialVersionUID = 1L;
/*
* 表头:仓库名、集散地
*/
private Table4Header header;
private List<Map<String, Object>> data;
}

数据格式示例:

{
"msg": "操作成功",
"code": 200,
"data": {
"t1": {
"t1header": [
"1209测试仓库",
"研判测试仓库",
"测试仓库"
],
"data": [
{
"time": "2020-09-03 19:27:17",
"w1": 20,
"w2": 14,
"w3": 29,
"sum": 63
},
{
"time": "2020-09-03 20:27:17",
"w1": 15,
"w2": 11,
"w3": 20,
"sum": 46
},
{
"time": "2020-09-03 21:27:17",
"w1": 27,
"w2": 21,
"w3": 43,
"sum": 91
}
]
},
"t2": {
"t2header": [
"湖北省武汉市洪山区东湖风景区街道花城大道",
"湖北省武汉市洪山区和平街道悠贝·菁华幼儿园花样年·花郡东区",
"湖北省武汉市武昌区徐家棚街街道油料所社区",
"湖北省武汉市武昌区水果湖街街道万达御湖世家",
"湖北省武汉市武昌区水果湖街街道观星传媒万达尊"
],
"data": [
{
"time": "2020-09-03 19:27:17",
"p1": 21,
"p2": 17,
"p3": 12,
"p4": 15,
"p5": 28,
"sum": 93
},
{
"time": "2020-09-03 20:27:17",
"p1": 16,
"p2": 28,
"p3": 9,
"p4": 17,
"p5": 23,
"sum": 93
},
{
"time": "2020-09-03 21:27:17",
"p1": 28,
"p2": 30,
"p3": 17,
"p4": 29,
"p5": 21,
"sum": 125
}
]
},
"t3": {
"t3header": [
"湖北省武汉市洪山区东湖风景区街道花城大道",
"湖北省武汉市洪山区和平街道悠贝·菁华幼儿园花样年·花郡东区",
"湖北省武汉市武昌区徐家棚街街道油料所社区",
"湖北省武汉市武昌区水果湖街街道万达御湖世家",
"湖北省武汉市武昌区水果湖街街道观星传媒万达尊"
],
"data": [
{
"warename": "1209测试仓库",
"p1": 1.26,
"p2": 1.05,
"p3": 1.37,
"p4": 1.5,
"p5": 1.31
},
{
"warename": "研判测试仓库",
"p1": 1.16,
"p2": 1.25,
"p3": 1.02,
"p4": 1.7,
"p5": 1.57
},
{
"warename": "测试仓库",
"p1": 1.53,
"p2": 1.29,
"p3": 1.07,
"p4": 1.15,
"p5": 1.08
}
]
},
"t4": [
{
"header": {
"ware1": "1209测试仓库",
"places": [
"湖北省武汉市洪山区东湖风景区街道花城大道",
"湖北省武汉市洪山区和平街道悠贝·菁华幼儿园花样年·花郡东区",
"湖北省武汉市武昌区徐家棚街街道油料所社区",
"湖北省武汉市武昌区水果湖街街道万达御湖世家",
"湖北省武汉市武昌区水果湖街街道观星传媒万达尊"
]
},
"data": [
{
"p0": "实际需求dj(t)",
"p1": 21,
"p2": 17,
"p3": 12,
"p4": 15,
"p5": 28
},
{
"p0": "实际需求zj(t)",
"p1": 21,
"p2": 17,
"p3": 12,
"p4": 15,
"p5": 28
},
{
"p0": "分配量∑χφ(t)",
"p1": 21,
"p2": 17,
"p3": 12,
"p4": 15,
"p5": 28
},
{
"p0": "满意度Rj(t)",
"p1": 0.62,
"p2": 0.59,
"p3": 0.68,
"p4": 0.6,
"p5": 0.61
}
]
},
{
"header": {
"ware1": "研判测试仓库",
"places": [
"湖北省武汉市洪山区东湖风景区街道花城大道",
"湖北省武汉市洪山区和平街道悠贝·菁华幼儿园花样年·花郡东区",
"湖北省武汉市武昌区徐家棚街街道油料所社区",
"湖北省武汉市武昌区水果湖街街道万达御湖世家",
"湖北省武汉市武昌区水果湖街街道观星传媒万达尊"
]
},
"data": [
{
"p0": "实际需求dj(t)",
"p1": 21,
"p2": 17,
"p3": 12,
"p4": 15,
"p5": 28
},
{
"p0": "实际需求zj(t)",
"p1": 21,
"p2": 17,
"p3": 12,
"p4": 15,
"p5": 28
},
{
"p0": "分配量∑χφ(t)",
"p1": 21,
"p2": 17,
"p3": 12,
"p4": 15,
"p5": 28
},
{
"p0": "满意度Rj(t)",
"p1": 0.62,
"p2": 0.59,
"p3": 0.68,
"p4": 0.6,
"p5": 0.61
}
]
},
{
"header": {
"ware1": "测试仓库",
"places": [
"湖北省武汉市洪山区东湖风景区街道花城大道",
"湖北省武汉市洪山区和平街道悠贝·菁华幼儿园花样年·花郡东区",
"湖北省武汉市武昌区徐家棚街街道油料所社区",
"湖北省武汉市武昌区水果湖街街道万达御湖世家",
"湖北省武汉市武昌区水果湖街街道观星传媒万达尊"
]
},
"data": [
{
"p0": "实际需求dj(t)",
"p1": 21,
"p2": 17,
"p3": 12,
"p4": 15,
"p5": 28
},
{
"p0": "实际需求zj(t)",
"p1": 21,
"p2": 17,
"p3": 12,
"p4": 15,
"p5": 28
},
{
"p0": "分配量∑χφ(t)",
"p1": 21,
"p2": 17,
"p3": 12,
"p4": 15,
"p5": 28
},
{
"p0": "满意度Rj(t)",
"p1": 0.62,
"p2": 0.59,
"p3": 0.68,
"p4": 0.6,
"p5": 0.61
}
]
}
]
}
}

最终导出的Excel 为:

springboot+easypoi模板导出Excel 动态表头+多表格(一个sheet)的更多相关文章

  1. JAVA POI导出EXCEL 动态表头、多级表头、动态数据

    导出Excel文件是业务中经常遇到的需求,以下是经常遇到的一些问题: 1,导出中文文件名乱码 String filename = "sheet1";response.setChar ...

  2. 根据模板导出Excel报表并生成多个Sheet页

    因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为  根据提供的模板来导出Excel报表 并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求, 使用本工具类时 ...

  3. Java无模板导出Excel,Apache-POI插件实现

    开发环境 jdk 1.8 Maven 3.6 Tomcat 8.5 SpringBoot 2.1.4.RELEASE Apache-POI 3.6 Idea 注意: 我是在现有的基于SpringBoo ...

  4. EasyPOI导入导出Excel

    EasyPOI工具可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 导入maven依赖 <dependency> <group ...

  5. aspose.cells根据模板导出excel

    又隔十多天没写博客了,最近都在忙项目的事情,公司人事变动也比较大,手头上就又多了一个项目.最近做用aspose.cells根据模板导出excel报价单的功能,顺便把相关的核心记下来,先上模板和导出的效 ...

  6. Html Table用JS导出excel格式问题 导出EXCEL后单元格里的000412341234会变成412341234 7-14 会变成 2018-7-14(7月14) 自定义格式 web利用table表格生成excel格式问题 js导出excel增加表头、mso-number-format定义数据格式 数字输出格式转换 mso-number-format:"\@"

    Html Table用JS导出excel格式问题 我在网上找的JS把HTML Tabel导出成EXCEL.但是如果Table里的数字内容为0开的的导成Excel后会自动删除0,我想以text的格式写入 ...

  7. Vue + axios + SpringBoot 2实现导出Excel

    Vue + axios + SpringBoot 2实现导出Excel 1. 前端js代码-发送Http请求 /** * 文件下载 * @param url 下载地址 * @param fileNam ...

  8. POI通过模板导出EXCEL文件

    一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出. 这次在项目中需要用到模板,导出的内容包括(1.模板中 ...

  9. 【每日一点】1. Java如何实现导出Excel单表头或多表头

    一.背景 在后台项目中,经常会遇到将呈现的内容导出到Excel的需求,通过都是导出单个表头的Excel文件,如果存在级联关系的情况下,也就需要导出多表头的场景.今天这篇文章就是分享导出Excel单表头 ...

  10. .Net NPOI 根据excel模板导出excel、直接生成excel

    一.根据Excel模板导出excel 1.导入NPOI.dll  2.DAL中添加类ExportExcel.cs using NPOI.SS.UserModel; using System; usin ...

随机推荐

  1. vue开发一个简单的组件

    首先在项目中新建一个js文件 在文件内创建一个对象,对象内创建install方法,将对象用export default暴漏出去 export default{ install(){ console.l ...

  2. 浅聊web前端性能测试

    最近正好在做web前端的性能测试,这次就来聊聊关于这个的测试思路~ 首先从用户的思维去思考,关于web前端性能,用户最看重的是什么...... 其实就是下面三个点: 1. 加载性能(即页面加载时间+资 ...

  3. 【XML】学习笔记第二章-dtd

    目录 XML-DTD DTD语句 基本声明语句 引用外部DTD DTD元素 四种元素类型 元素定义关键字 修饰符号 DTD中的属性 属性修饰 属性类型 DTD中的实体和符号 符号 坑 XML-DTD ...

  4. iOS app 自动化测试 - 环境搭建

    1. 基本前提 安装好了 mac 上自动化测试的基本环境 如果没有,可以参考这一个: 2. iOS appium python自动化测试环境搭建 2.1 真机环境 2.1.1 前提:安装了 appiu ...

  5. 微信团队分享:来看看微信十年前的IM消息收发架构,你做到了吗

    本文由微信技术团队分享,原题"十年前的微信消息收发架构长啥样?",下文进行了排版和内容优化等. 1.引言 2023 年,微信及 WeChat 的 DAU(月活用户)达到 13.4 ...

  6. 到底什么是Java AIO?为什么Netty会移除AOI?一文搞懂AIO的本质!

    本文由得物技术团队Uni分享,本文有内容修订和大量排版优化. 1.引言 关于Java网络编程中的同步IO和异步IO的区别及原理的文章非常的多,具体来说主要还是在讨论Java BIO和Java NIO这 ...

  7. 百度高效研发实战训练营-Step1

    百度高效研发实战训练营-Step1 1 设计方法与实践介绍 1.1. 软件设计原则 (1)软件设计的目的 软件设计是为了使软件在长期范围内能够容易的进行变化. 变化:软件不是一成不变的,无论是软件本身 ...

  8. JavaScript 数组展平方法: flat() 和 flatMap()

    从 ES2019 中开始引入了一种扁平化数组的新方法,可以展平任何深度的数组. flat flat() 方法创建一个新数组,其中所有子数组元素以递归方式连接到特定深度. 语法:array.flat(d ...

  9. 修改leds-gpio.c 让GPIO LED在kernel启动时就开始闪烁

    内容提要: 客户需要在开机时就闪烁LED,并要求越快越好 diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index ...

  10. 【源码】Kafka订制协议如何处理粘拆包

    前言 在上一篇随笔中,我们探讨了如何使用 Netty 处理自定义协议中的粘包和拆包问题.Netty 提供了高度封装的 API,帮助开发者轻松应对这一挑战,因此很多人都对其解决方案非常熟悉. 但如果我们 ...