iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >使用EasyExcel模版导出
  • 782
分享到

使用EasyExcel模版导出

exceljava后端 2023-09-01 12:09:42 782人浏览 泡泡鱼
摘要

一、官方提供方法 easyexcel官方文档 填充Excel | Easy Excel 官方demo是利用本地模版文件填充并下载到本地 @Test public void complexFill() {

一、官方提供方法

easyexcel官方文档 填充Excel | Easy Excel

官方demo是利用本地模版文件填充并下载到本地

        @Test    public void complexFill() {        // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替        // {} 代表普通变量 {.} 代表是list的变量        String templateFileName =            TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "complex.xlsx";        String fileName = TestFileUtil.getPath() + "complexFill" + System.currentTimeMillis() + ".xlsx";        // 方案1        try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {            WriteSheet writeSheet = EasyExcel.writerSheet().build();            // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。            // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用            // 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存            // 如果数据量大 list不是最后一行 参照下一个            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();            excelWriter.fill(data(), fillConfig, writeSheet);            excelWriter.fill(data(), fillConfig, writeSheet);            Map map = MapUtils.newHashMap();            map.put("date", "2019年10月9日13:28:28");            map.put("total", 1000);            excelWriter.fill(map, writeSheet);        }    }

二、根据业务场景的方法

我用的是WEB项目,将输出改为了输出流 OutputStream

@Overridepublic void exportTask(Long id, httpservletResponse response) {ExcelWriter excelWriter = null;try {// outputStream:要导出的文件的输出流OutputStream outputStream = response.getOutputStream();// 模版文件ClassPathResource classPathResource = new ClassPathResource("template/taskTemplate.xlsx");// 使用模版文件的两种方式:// 1、文件路径:.withTemplate(templateFileName)// 2、输入流:.withTemplate(inputStream)String templateFileName = classPathResource.getFile().getPath();InputStream inputStream = classPathResource.getInputStream();excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).excelType(ExcelTypeEnum.XLSX).autoCloseStream(Boolean.FALSE).build();WriteSheet writeSheet = EasyExcel.writerSheet().build();// 获取数据 dataList columnList fORMDataMap mapDetail = qmsQcTaskDetailService.getDataListByTaskId(id);// 调用微服务获取字典 determine 用来翻译判定结果List determineItem = remoteDictService.getDictByType("determine").getData();// 调用微服务获取字典 product_unit 用来翻译零件单位List unitItem = remoteDictService.getDictByType("product_unit").getData();QmsQcTask formData = (QmsQcTask) mapDetail.get("formData");determineItem.stream().filter(item -> StrUtil.equals(formData.getResult(), item.getItemValue())).findFirst().ifPresent(sysDictItem -> formData.setResult(sysDictItem.getLabel()));unitItem.stream().filter(item -> StrUtil.equals(formData.getMaterialUnit(), item.getItemValue())).findFirst().ifPresent(sysDictItem -> formData.setMaterialUnit(sysDictItem.getLabel()));excelWriter.fill(formData, writeSheet);List> cols = new ArrayList<>();// 查找抽检数是多少,即有几列int num = formData.getSampleNum();for (int i = 1; i <= num; i++) {Map map = new HashMap<>();// 列名map.put("label", "" + i);cols.add(map);}// 横向填充FillConfig fillConfiGCols = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();excelWriter.fill(new FillWrapper("cols", cols), fillConfigCols, writeSheet);// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();List> dataList = (List>) mapDetail.get("dataList");for (int i = 0; i < dataList.size(); i++) {Map data = dataList.get(i);// 翻译判定合不合格(因为业务和字典不在一个数据库,所以放在代码里处理)String determine = (String) data.get("determine");determineItem.stream().filter(item -> StrUtil.equals(determine, item.getItemValue())).findFirst().ifPresent(sysDictItem -> data.put("determine", sysDictItem.getLabel()));// 如果没有质检标准,每一个质检值都要转为合不合格if (StrUtil.isBlank((String) data.get("inspection_standard"))){int samplingNum = Optional.ofNullable((Integer) data.get("sampling_num")).orElse(0);for (int j = 1; j <= samplingNum; j++) {String val = (String) data.get(""+j);int finalJ = j;determineItem.stream().filter(item -> StrUtil.equals(val, item.getItemValue())).findFirst().ifPresent(sysDictItem -> data.put(""+ finalJ, sysDictItem.getLabel()));}}// 给数据加上序号data.put("index", i + 1);}excelWriter.fill(new FillWrapper("details", dataList), fillConfig, writeSheet);// 设置输出流格式以及文件名:response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("质检任务", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");} catch (IOException e) {throw new RuntimeException(e);} finally {// 千万别忘记close关闭流if (excelWriter != null) {excelWriter.close();}}}

 模版:

效果:

三、说明

1、获取输出流

// outputStream:要导出的文件的输出流OutputStream outputStream = response.getOutputStream();

2、获取模版文件

// 模版文件ClassPathResource classPathResource = new ClassPathResource("template/taskTemplate.xlsx");// 方式一:路径String templateFileName = classPathResource.getFile().getPath();// 方式二:输入流InputStream inputStream = classPathResource.getInputStream();

3、创建 ExcelWriterWriteSheet

excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).excelType(ExcelTypeEnum.XLSX).autoCloseStream(Boolean.FALSE).build();WriteSheet writeSheet = EasyExcel.writerSheet().build();

使用模版文件有两种方式,使用其中一种就可以:
    1.文件路径:.withTemplate(templateFileName)
    2.输入流:.withTemplate(inputStream)

4、获取数据

Map mapDetail = qmsQcTaskDetailService.getDataListByTaskId(id);

我这里直接调用了方法,map包含

dataList主要列表数据 formData 列表外的数据

5、填充数据

1.获取字典数据

// 调用微服务获取字典 determine 用来翻译判定结果List determineItem = remoteDictService.getDictByType("determine").getData();// 调用微服务获取字典 product_unit 用来翻译零件单位List unitItem = remoteDictService.getDictByType("product_unit").getData();

我的业务数据和字典不在同一个数据库内,sql无法翻译,所以需要在代码里翻译

2.填充列表外的数据

QmsQcTask formData = (QmsQcTask) mapDetail.get("formData");determineItem.stream().filter(item -> StrUtil.equals(formData.getResult(), item.getItemValue())).findFirst().ifPresent(sysDictItem -> formData.setResult(sysDictItem.getLabel()));unitItem.stream().filter(item -> StrUtil.equals(formData.getMaterialUnit(), item.getItemValue())).findFirst().ifPresent(sysDictItem -> formData.setMaterialUnit(sysDictItem.getLabel()));excelWriter.fill(formData, writeSheet);

只要对象属性名和模版里写的标记已知就可以了

3.填充缺少的列名

模版:

 效果:

 因为我后半部分列名涉及到行转列,且不固定列数,所以需要横着填充上列名。注意列表的名字“cols”要对应起来。

使用.direction(WriteDirectionEnum.HORIZONTAL) 设置为横向填充。

List> cols = new ArrayList<>();// 查找抽检数是多少,即有几列int num = formData.getSampleNum();for (int i = 1; i <= num; i++) {Map map = new HashMap<>();// 列名map.put("label", "" + i);cols.add(map);}// 横向填充FillConfig fillConfigCols = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();excelWriter.fill(new FillWrapper("cols", cols), fillConfigCols, writeSheet);

4.填充主列表数据

// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();List> dataList = (List>) mapDetail.get("dataList");for (int i = 0; i < dataList.size(); i++) {Map data = dataList.get(i);// 翻译判定合不合格(因为业务和字典不在一个数据库,所以放在代码里处理)String determine = (String) data.get("determine");determineItem.stream().filter(item -> StrUtil.equals(determine, item.getItemValue())).findFirst().ifPresent(sysDictItem -> data.put("determine", sysDictItem.getLabel()));// 如果没有质检标准,每一个质检值都要转为合不合格if (StrUtil.isBlank((String) data.get("inspection_standard"))){int samplingNum = Optional.ofNullable((Integer) data.get("sampling_num")).orElse(0);for (int j = 1; j <= samplingNum; j++) {String val = (String) data.get(""+j);int finalJ = j;determineItem.stream().filter(item -> StrUtil.equals(val, item.getItemValue())).findFirst().ifPresent(sysDictItem -> data.put(""+ finalJ, sysDictItem.getLabel()));}}// 给数据加上序号data.put("index", i + 1);}excelWriter.fill(new FillWrapper("details", dataList), fillConfig, writeSheet);

最重要的三句话:

FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();List> dataList = (List>) mapDetail.get("dataList");excelWriter.fill(new FillWrapper("details", dataList), fillConfig, writeSheet);
这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存

5.设置输出流格式以及文件名

// 设置输出流格式以及文件名:response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("质检任务", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

四、思想

我的模版使用了动态的列,不确定有几列,所以我就写了一百多个。

还有另外一种设想:

如果先把列表外的数据填充,然后将主列表的列填充完毕,再把主列表的标记写上,这些操作完毕之后把文件输出到另外的输出流上,再将此输出流转为输入流,再把主列表的数据填充,输出到response。

理论上可行,但我没试。

来源地址:https://blog.csdn.net/weixin_45735511/article/details/127762821

--结束END--

本文标题: 使用EasyExcel模版导出

本文链接: https://www.lsjlt.com/news/388329.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用EasyExcel模版导出
    一、官方提供方法 easyexcel官方文档 填充Excel | Easy Excel 官方demo是利用本地模版文件填充并下载到本地 @Test public void complexFill() { ...
    99+
    2023-09-01
    excel java 后端
  • java使用EasyExcel导入导出excel
    目录一、准备工作 1、导包二、了解注解 1、常用注解2、@ExcelProperty注解 3、@ColumnWith注解 4、@ContentFontStyle注解 5、@Conte...
    99+
    2024-04-02
  • 使用EasyExcel实现Excel的导入导出
    文章目录 前言一、EasyExcel是什么?二、使用步骤1.导入依赖2.编写文件上传配置3.配置表头对应实体类4.监听器编写5.控制层6.前端代码 总结 前言 在真实的开发者场景中,经常会使用excel作为数据的载体,进行...
    99+
    2023-08-17
    java
  • java如何使用EasyExcel导入导出excel
    这篇文章主要介绍了java如何使用EasyExcel导入导出excel,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、准备工作1、导包<!-- poi&nb...
    99+
    2023-06-15
  • Java easyexcel使用教程之导出篇
    目录EasyExcel简介1、导入Maven依赖2、新建Student.java类3、generateStudentUtil.java类,随机生成Student对象4、BaseTes...
    99+
    2024-04-02
  • Java——使用EasyExcel导出动态列的Excel
    有些时候列表的列可能是动态的,需要根据动态表头导出Excel文件,这时候可以使用下面的方法解决: public static void exportDynamicExcel(Set includeColumnFiledNam...
    99+
    2023-09-09
    java excel
  • EasyExcel动态头导出
    前言 这段时间的项目中需要导出动态表格。 根据所选的参数导出对应的字段内容 下图所示选择下面几个tab页就需要导出对应的表头字段 下面为具体实现的效果。表头样式可以通过EasyExcel 提供的方法自定义。 具体实现 主要是通过 传...
    99+
    2023-08-23
    java easyexcel
  • java实现excel的导出之使用easyExcel
    前言 在我们的项目需求中,经常会遇到导出的需求,其中excel的导出最为常见。生成Excel比较有名的框架有Apache poi,jxl等,但他们都存在一个严重的问题就是非常的耗内存,如果你的系统并发量不大的话可能还行,但是一旦并发上来后一...
    99+
    2023-08-18
    java excel 开发语言
  • EasyExcel导出Excel文件
    导出Excel 方法一 导入EasyExcel依赖 com.alibaba easyexcel 创建实体类 @Data@AllArgsConstructor@NoArgsConstruc...
    99+
    2023-10-20
    excel java 开发语言
  • 【Java结合EasyExcel,模板文件填充并导出Excel】
    需求描述: 客户网页上填一个Excel表格,数据存到数据库,这个导出接口要做的就是从数据库中的获取数据并填充到模板文件,最后通过response返给前端一个下载链接,用户即可获取填充好的Excel文件。 方案一: 一开始使用的是easypo...
    99+
    2023-09-14
    java
  • java利用easyexcel实现导入与导出功能
    目录前言1先添加依赖2批量插入数据3创建需要导出数据实体类4创建一个类ExcelListener5实现下载excel6控制器添加我们的导入操作代码7导出效果如图8导入直接调用前言 p...
    99+
    2024-04-02
  • 使用EasyExcel导出表格时合并单元格
    背景 现在需要将一个导出列表数据到Excel表格的功能进行改造,将指定列相同数据自动合并单元格。 如上图所示,指定A、B两列自动合并,如图所示(6、7),(8、9),(13、14、15)要自动合并单...
    99+
    2023-09-01
    excel java
  • Spring Boot + EasyExcel实现数据导入导出
    目录背景SpringBoot项目集成依赖集成实体类实现业务逻辑实现MemberService实现简单导出实现自定义导入实现同步获取结果导入实现基于监听导入实现小结背景 老项目主要采用...
    99+
    2022-11-13
    Spring Boot 数据导入导出 EasyExcel数据导入导出
  • EasyExcel实现excel导出(多sheet)
    EasyExcel官方地址: EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy ExcelEasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存...
    99+
    2023-09-03
    java 开发语言 spring boot
  • 使用VUE+SpringBoot+EasyExcel 整合导入导出数据的教程详解
    目录1 前端2 数据库3 后端3.1 contrller3.2 mapper3.3 bean3.4 listener3.5 config3.6 配置文件4 启动测试创建一个普通的ma...
    99+
    2024-04-02
  • SpringBoot整合EasyExcel实现文件导入导出
    目录准备工作 1. 引入pom依赖2. 实现功能 Excel文件下载 3. 日志实体类4. 接口和具体实现 Excel文件导入 5. 文件读取配置 6. 读取测试7. 附上自定义属性...
    99+
    2024-04-02
  • Java+EasyExcel实现文件的导入导出
    目录引言效果图项目结构核心源码核心实体类核心监听器类EasyExcel导入文件EasyExcel导出文件引言 项目中需要Excel文件的导入与导出Excel并下载,例如,导入员工信息...
    99+
    2024-04-02
  • PhpSpreadsheet 基本使用和导入 导出 模版生成Excel文件
    一. 基本使用 ...
    99+
    2023-09-08
    excel PhpSpreadsheet php
  • JAVA(EasyExcel)通过远程调用模板 导出数据 复杂表头
    前言 最近接手一个需求,单组数据的显示,也有多组数据的显示,查了好多文章,都不是很明白.但是这篇文章和我的需求差不多非常相似(链接放在文末),根据这篇文章然后将自己的实现过程记录了下来,以防之后再用到. 这是我需要导出的excel格式开头是...
    99+
    2023-09-24
    java excel vue.js
  • 使用SpringBoot+EasyExcel+Vue实现excel表格的导入和导出详解
    目录一、导入和导出二、导出数据为excel实现过程三、将excel中的数据导入到数据库中一、导入和导出 导入:通过解析excel表格中的数据,然后将数据放到一个集合中,接着通过对持久...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作