简单的excel填充

简单的excel填充

先导入相关依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.16</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version><exclusions><exclusion><groupId>org.apache.poi</groupId><artifactId>poi</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.20</version></dependency><!-- junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.25</version><scope>compile</scope></dependency>

编写需要用到的填充对象

@Getter
@Setter
@EqualsAndHashCode
public class FillData {private String name;private double number;private String date;
}

相关测试类

public class simpleFill {/*** 根据模板进行单个填充*/@Testpublic void simpleFill() {// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替// 造好一个相关的模板String templateFileName = "C:\\Users\\861123024\\Desktop\\mqtt压测软件\\自造热交数据\\excelTemplate.xlsx";// 方案1 根据对象填充String fileName = "C:\\Users\\simpleFill.xlsx";// 这里 会填充到第一个sheet, 然后文件流会自动关闭FillData fillData = new FillData();fillData.setName("张三");fillData.setNumber(5.2);EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(fillData);// 方案2 根据Map填充fileName = "C:\\Users\\simpleFill.xlsx";// 这里 会填充到第一个sheet, 然后文件流会自动关闭Map<String, Object> map = new HashMap<>();map.put("name", "张三");map.put("number", 5.2);EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);}/*** 根据模板进行多个填充*/@Testpublic void listFill() {// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替// 填充list 的时候还要注意 模板中{.} 多了个点 表示list// 如果填充list的对象是map,必须包涵所有list的key,哪怕数据为null,必须使用map.put(key,null)String templateFileName = "C:\\Users\\excelTemplate.xlsx";// 方案1 一下子全部放到内存里面 并填充String fileName = "C:\\Users\\listFill.xlsx";// 这里 会填充到第一个sheet, 然后文件流会自动关闭/* EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(data());*/// 方案2 分多次 填充 会使用文件缓存(省内存)fileName = "C:\\Users\\listFill.xlsx";ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();try  {WriteSheet writeSheet = EasyExcel.writerSheet().build();excelWriter.fill(data(), writeSheet);excelWriter.fill(data(), writeSheet);}finally {excelWriter.finish();}}/*** 根据模板进行复杂填充*/@Testpublic void complexFill() {// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替// {} 代表普通变量 {.} 代表是list的变量String templateFileName = "C:\\Users\\excelTemplate.xlsx";String fileName = "C:\\Users\\complexFill.xlsx";// 方案1EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(data());ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();try {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<String, Object> map = new HashMap<>();map.put("date", "2019年10月9日13:28:28");map.put("total", 1000);excelWriter.fill(map, writeSheet);} finally {excelWriter.finish();}}/*** 数据量大的复杂填充*/@Testpublic void complexFillWithTable() {// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替// {} 代表普通变量 {.} 代表是list的变量// 这里模板 删除了list以后的数据,也就是统计的这一行String templateFileName = "C:\\Users\\excelTemplate.xlsx";String fileName = "C:\\Users\\complexFillWithTable.xlsx";// 方案1ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();try {WriteSheet writeSheet = EasyExcel.writerSheet().build();// 直接写入数据excelWriter.fill(data(), writeSheet);excelWriter.fill(data(), writeSheet);// 写入list之前的数据Map<String, Object> map = new HashMap<String, Object>();map.put("date", "2019年10月9日13:28:28");excelWriter.fill(map, writeSheet);// list 后面还有个统计 想办法手动写入// 这里偷懒直接用list 也可以用对象List<List<String>> totalListList = new ArrayList<>();List<String> totalList = new ArrayList<>();totalListList.add(totalList);totalList.add(null);totalList.add(null);totalList.add(null);// 第四列totalList.add("统计:1000");// 这里是write 别和fill 搞错了excelWriter.write(totalListList, writeSheet);// 总体上写法比较复杂 但是也没有想到好的版本 异步的去写入excel 不支持行的删除和移动,也不支持备注这种的写入,所以也排除了可以// 新建一个 然后一点点复制过来的方案,最后导致list需要新增行的时候,后面的列的数据没法后移,后续会继续想想解决方案} finally {excelWriter.finish();}}/*** 根据横向模板进行横向的填充*/@Testpublic void horizontalFill() {// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替// {} 代表普通变量 {.} 代表是list的变量String templateFileName ="C:\\Users\\excelTemplate1.xlsx";String fileName = "C:\\Users\\horizontalFill.xlsx";// 方案1ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();try {WriteSheet writeSheet = EasyExcel.writerSheet().build();FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();excelWriter.fill(data(), fillConfig, writeSheet);excelWriter.fill(data(), fillConfig, writeSheet);Map<String, Object> map = new HashMap<>();map.put("date", "2019年10月9日13:28:28");excelWriter.fill(map, writeSheet);} finally {excelWriter.finish();}}/*** 组合填充模板进行填充*/@Testpublic void compositeFill() {// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替// {} 代表普通变量 {.} 代表是list的变量 {前缀.} 前缀可以区分不同的listString templateFileName ="C:\\Users\\excelTemplate2.xlsx";String fileName = "C:\\Users\\compositeFill.xlsx";// 方案1ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();try {WriteSheet writeSheet = EasyExcel.writerSheet(0,"sheet0").build();FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();// 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);excelWriter.fill(new FillWrapper("data2", data()), writeSheet);excelWriter.fill(new FillWrapper("data2", data()), writeSheet);excelWriter.fill(new FillWrapper("data3", data()), writeSheet);excelWriter.fill(new FillWrapper("data3", data()), writeSheet);Map<String, Object> map = new HashMap<String, Object>();//map.put("date", "2019年10月9日13:28:28");map.put("date", new Date());excelWriter.fill(map, writeSheet);} finally {excelWriter.finish();}}private List<Object> data() {List<Object> list = new ArrayList<>();FillData fillData = new FillData();for (int i = 0; i < 10; i++) {fillData.setName("小明");fillData.setNumber(1);list.add(fillData);}return list;}
}

相关对应模板:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

横向模板

在这里插入图片描述

组合模板

在这里插入图片描述

若想深入了解可看:https://easyexcel.opensource.alibaba.com/docs/current/

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

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

相关文章

Unity URP下阴影锯齿

1.概述 在Unity开发的URP项目中出现阴影有明显锯齿。如下图所示&#xff1a; 并且在主光源的Shadow Type已经是Soft Shadows模式了。 2.URP Asset 阴影出现锯齿说明阴影质量不高&#xff0c;所以要先找到URP Asset文件进行阴影质量参数的设置。 1.打开PlayerSetting找到Graph…

git提交记录全部删除

目录 问题描述 解决方案 结果 问题描述 新复制的项目具有特比多的提交记录我想给他清除&#xff0c;因为不清楚过多历史也就导致包特别大下载和提交等方面都不是很快 解决方案 查看代码clone网址&#xff1b; 打开远程仓库&#xff0c;选择要去除历史记代码分支&#xff08…

药品不良反应智能监测系统,java药品不良反应(ADR)智能监测系统源码,基于SpringBoot+Vue+MySQL技术开发

java药品不良反应智能监测系统 系统概述&#xff1a; 基于AI技术和深度学习模型&#xff0c;系统构建ADR智能识别模型&#xff0c;实现病程记录分析&#xff0c;提取病程记录实体&#xff0c;并完成语义关系的分类识别。一方面可以根据医务人员设置的监测任务或主题&#xff0c…

多语言历史报纸广告事件抽取(ACL2023)

1、写作动机&#xff1a; 首先&#xff0c;获取大规模的、有注释的历史数据集是困难的&#xff0c;因为只有领域专家才能可靠地为它们打标签。其次&#xff0c;大多数现成的NLP模型是在现代语言文本上训练的&#xff0c;这使得它们在应用于历史语料库时效果显著降低。这对于研…

MySQL面试题 | 02.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

ARP协议详解

1、ARP协议的定义 地址解析协议(Address Resolution Protocol&#xff0c;ARP)&#xff1a;ARP协议可以将IPv4地址(一种逻辑地址)转换为各种网络所需的硬件地址(一种物理地址)。换句话说&#xff0c;所谓的地址解析的目标就是发现逻辑地址与物理地址的映射关系。 ARP仅用于IPv…

NLP(十八):LLM 的推理优化技术纵览

原文&#xff1a;NLP&#xff08;十八&#xff09;&#xff1a;LLM 的推理优化技术纵览 - 知乎 目录 收起 一、子图融合&#xff08;subgraph fusion&#xff09; 1.1 FasterTransformer by NVIDIA 1.2 DeepSpeed Inference by Microsoft 1.3 MLC LLM by TVM 二、模型压…

架构01 - 知识体系详解

架构&#xff0c;又称为知识体系&#xff0c;是指在特定领域或系统中的组织结构和设计原则。它涵盖了该领域或系统的核心概念、基础理论、方法技术以及实践经验等。架构的主要作用是提供一个全面且系统化的视角&#xff0c;帮助人们理解和应用相关知识&#xff0c;并指导系统的…

CSS进阶方法——复合选择器、元素显示、背景设置

1、复合选择器 复合选择器是建立在基础选择器之上&#xff0c;对基础选择器进行组合形成的。 复合选择器可以更准确、更高效的选择目标元素&#xff08;标签&#xff09;复合选择器是由两个或多个基础选择器&#xff0c;通过不同的方式组合而成的常用的复合选择器包括&#xf…

Unity Meta Quest 一体机开发(十三):【手势追踪】自定义交互事件 EventWrapper

文章目录 &#x1f4d5;教程说明&#x1f4d5;交互事件概述&#x1f4d5;自定义交互逻辑⭐方法一&#xff1a;Inspector 面板赋值⭐方法二&#xff1a;纯代码处理 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量…

MT8766安卓核心板/开发板_MTK联发科4G安卓手机主板方案定制开发

MT8766采用台积电 12 nm FinFET 制程工艺&#xff0c;4*A53架构&#xff0c;Android 9.0操作系统&#xff0c;搭载2.0GHz 的 Arm NEON 引擎。提供了支持最新 OpenOS 及其要求苛刻的应用程序所需的处理能力&#xff0c;专为具有全球蜂窝连接的高移动性和功能强大的平板设备而设计…

使用递归将list转换成tree

在产品研发时遇到这样一个问题&#xff0c;对于省市区县这类三级联动的数据&#xff0c;前端插件需要一次把数据全部返回&#xff0c;单纯的使用接口查询字节的没办法满足要求。 如果一次把数据全部返回&#xff0c;前端使用起来很麻烦需要一条一条的进行查找。 常规的使用方…