EasyPoi系列之框架集成及基础使用
EasyPoi系列之框架集成及基础使用
- 1 EasyPoi
- 1.1 gitee仓库地址
- 2 EasyPoi集成至SpringBoot
- 2.1 maven引入jar包
- 3 EasyPoi Excel导出
- 3.1 基于实体对象导出
- 3.1.1 @Excel 注解
- 3.1.2 编写实体
- 3.1.3 编写导出方法
- 3.1.4 导出效果
- 3.2 基于模板导出
- 3.2.1 编写模板文件
- 3.2.2 编写导出方法
- 3.2.3 导出效果
- 4 EasyPoi 数据导入
- 4.1 导入数据准备
- 4.2 编写接口
- 4.3 导入测试
- 4.3.1 编写apiFox
- 4.3.2 导入结果
- 4.3.3 修改 "核定金额" 为“核定金额1”
- 5 EasyPoi 模板填充
- 5.1 模板表达式
- 5.2 Excel模板填充导出
- 5.3 Word模板填充导出
- 5.3.1 模板准备
- 5.3.2 编写导出代码
- 5.3.3 导出效果
- 6 总结
1 EasyPoi
官方介绍为:EasyPoi Excel和 Word简易工具类
easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法。
1.1 gitee仓库地址
https://gitee.com/wupaas/easypoi
2 EasyPoi集成至SpringBoot
2.1 maven引入jar包
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version>
</dependency>
3 EasyPoi Excel导出
3.1 基于实体对象导出
3.1.1 @Excel 注解
代码位于:cn.afterturn.easypoi.excel.annotation.Excel,用于通过注解标识实体字段,核心属性如下:
- name:用于表示Excel表头
- width:导出时在excel中每个列的宽 单位为字符,一个汉字=2个字符
- suffix:文字后缀,如% 90 变成90%
- isWrap:是否换行 即支持\n
- type:导出类型 1 是文本 2 是图片,3 是函数,10 是数字, 11 特殊符号 默认是文本
- enumExportField:枚举导出使用的字段
3.1.2 编写实体
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
/*** 导出实体*/
@Data
public class ExportEntity {@Excel(name = "序号",width = 20)private Integer index;@Excel(name = "资金性质",width = 50)private String accountType;@Excel(name = "项目名称",width = 50)private String projectName;@Excel(name = "申请金额",width = 50)private String amountApplied;@Excel(name = "核定金额",width = 50)private String approvedAmount;
}
3.1.3 编写导出方法
/*** 构建到处数据(模拟数据库查询)* @param num* @return*/
private List<ExportEntity> buildExportData(int num){List<ExportEntity> exportData = new ArrayList<>();ExportEntity exportEntity = null;for (int i = 0; i < num; i++) {exportEntity = new ExportEntity();exportEntity.setIndex(i+1);exportEntity.setAccountType("资金性质"+i);exportEntity.setProjectName("项目名称"+i);exportEntity.setAmountApplied("申请金额"+i);exportEntity.setApprovedAmount("核定金额"+i);exportData.add(exportEntity);}return exportData;
}/**
* 通过实体导出Excel
* @param response
*/
@RequestMapping("/excel/exportByEntity")
public void exportByEntity(HttpServletResponse response) throws Exception {ExportParams exportParams = new ExportParams();List<ExportEntity> datas = this.buildExportData(10);Workbook workbook = null;try{response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("测试exportByEntity", "utf-8") + ".xlsx");workbook = ExcelExportUtil.exportExcel(exportParams, ExportEntity.class, datas);workbook.write(response.getOutputStream());}finally {IoUtil.close(workbook);}
}
3.1.4 导出效果
浏览器访问 http://ip:port/excel/exportByEntity(根据实际情况进行替换),导出文件效果如下:

3.2 基于模板导出
3.2.1 编写模板文件
具体模板语法在后续会进行讲解

3.2.2 编写导出方法
/*** 构建到处数据(模拟数据库查询)* @param num* @return*/
private List<ExportEntity> buildExportData(int num){List<ExportEntity> exportData = new ArrayList<>();ExportEntity exportEntity = null;for (int i = 0; i < num; i++) {exportEntity = new ExportEntity();exportEntity.setIndex(i+1);exportEntity.setAccountType("资金性质"+i);exportEntity.setProjectName("项目名称"+i);exportEntity.setAmountApplied("申请金额"+i);exportEntity.setApprovedAmount("核定金额"+i);exportData.add(exportEntity);}return exportData;
}
/*** 通过模板导出* @param response*/
@RequestMapping("/excel/exportTemplate")
public void exportByTemplate(HttpServletResponse response) throws Exception{//exportTemplate.xlsx 放在resources目录下TemplateExportParams templateExportParams = new TemplateExportParams("templates/exportTemplate.xlsx");//定义map对象Map<String,Object> data = new HashMap<>();List<ExportEntity> datas = this.buildExportData(10);//将导出数据put至map中,注意此处的datas与模板$fe: 后的变量名称一致data.put("datas",datas);Workbook workbook = null;try{response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("测试exportTemplate", "utf-8") + ".xlsx");workbook = ExcelExportUtil.exportExcel(templateExportParams, data);workbook.write(response.getOutputStream());}finally {IoUtil.close(workbook);}
}
3.2.3 导出效果
浏览器访问 http://ip:port/excel/exportByEntity(根据实际情况进行替换),导出文件效果如下:

注意:通过模板导出,可以用于针对复杂表头,使用@Excel注解无法或不好实现场景。
4 EasyPoi 数据导入
4.1 导入数据准备
以3.1中导出的Excel为例,如下图:

4.2 编写接口
ExportEntity为3.1中导出文件时,定义的实体类
/*** excel导入* @param response*/
@PostMapping("/excel/importData")
@ResponseBody
public List<ExportEntity> importData(HttpServletResponse response, MultipartFile file) throws Exception{ImportParams importParams = new ImportParams();List<ExportEntity> datas = ExcelImportUtil.importExcel(file.getInputStream(), ExportEntity.class, importParams);return datas;
}
4.3 导入测试
4.3.1 编写apiFox
在ApiFox中新建请求如下图,选择对应的导入文件,点击发送

4.3.2 导入结果
如下图,通过图中可看出,数据已从Excel中读入到实体集合中

4.3.3 修改 “核定金额” 为“核定金额1”
将“核定金额” 修改为 “核定金额1”,如下图:

再次进行导入,可以看到,由于字段不匹配,未能成功导入:

注意:通过Excel进行导入时候,1、需要保证导入的实体注解上的内容要与Excel表头文本一致(前后空格会自动进行处理),2、如果存在多列相同的表头,会以最后一列为匹配数据进行导入。
5 EasyPoi 模板填充
5.1 模板表达式
- 空格分割
- 三目运算 {{test ? obj:obj2}}
- n: 表示 这个cell是数值类型 {{n:}}
- le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
- fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
- fn: 格式化数字 {{fn:(obj;###.00)}}
- fe: 遍历数据,创建row
- !fe: 遍历数据不创建row
- $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
- !if: 删除当前列 {{!if:(test)}}
- 单引号表示常量值 ‘’ 比如’1’ 那么输出的就是 1
- &NULL& 控制
- ]] 换行符
5.2 Excel模板填充导出
excel模板填充,可以参考3.2 基于模板导出
5.3 Word模板填充导出
5.3.1 模板准备
编写 纳税信息.docx,放置在resources/templates目录下,内容如下:

5.3.2 编写导出代码
/*** word 测试*/
@Controller
@RequestMapping("/word")
public class WordTestController {/*** 通过模板填充word文档* @param response*/@RequestMapping("/exportByTemplate")public void exportByTemplate(HttpServletResponse response){try {//模拟从数据库读取数据List<Map<String,String>> taxlist = new ArrayList<>();Map<String,String> tax1= new HashMap<>();tax1.put("type","税种1");tax1.put("presum","1");tax1.put("thissum","2");tax1.put("curmonth","1");tax1.put("now","2025-02-18");taxlist.add(tax1);Map<String,String> tax2= new HashMap<>();tax2.put("type","税种2");tax2.put("presum","3");tax2.put("thissum","4");tax2.put("curmonth","2");tax2.put("now","2025-02-19");taxlist.add(tax2);Map<String,Object> data = new HashMap<>();data.put("taxlist",taxlist);Map<String,String> total= new HashMap<>();total.put("totalpreyear","4");total.put("totalthisyear","5");data.put("total",total);data.put("totalpreyear","测试3");data.put("totalthisyear","测试4");response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("测试exportByTemplate", "utf-8") + ".docx");//传入模板地址与模板变量进行填充try(XWPFDocument head = WordExportUtil.exportWord07("templates/纳税信息.docx",data )){head.write(response.getOutputStream());}}catch (Exception e) {e.printStackTrace();}}
}
5.3.3 导出效果
浏览器访问 http://ip:port/word/exportByTemplate(根据实际情况进行替换),导出文件效果如下:

注意:通过模板导出,可以用于订单填充、合同数据填充等应用场景,能够较好的保留原格式;结合笔者文章 “kkFileView二开之word转pdf接口”,可以快速实现合同文件生成的需求
6 总结
工欲善其事必先利其器。在日常工作中,需要多了解相关的三方组件,以便于在将来遇到类似的需求的时候,能够尽快的提出对应的解决方案,以展现自己的专业能力。
相关文章:
EasyPoi系列之框架集成及基础使用
EasyPoi系列之框架集成及基础使用 1 EasyPoi1.1 gitee仓库地址 2 EasyPoi集成至SpringBoot2.1 maven引入jar包 3 EasyPoi Excel导出3.1 基于实体对象导出3.1.1 Excel 注解3.1.2 编写实体3.1.3 编写导出方法3.1.4 导出效果 3.2 基于模板导出3.2.1 编写模板文件3.2.2 编写导出方法…...
Web后端 Tomcat服务器
一 Tomcat Web 服务器 介绍: Tomcat是一个开源的Java Servlet容器和Web服务器,由Apache软件基金会开发。它实现了Java Servlet和JavaServer Pages (JSP) 技术,用于运行Java Web应用程序。Tomcat轻量、易于配置,常作为开发和部署…...
【RK3588嵌入式图形编程】-SDL2-构建模块化UI
构建模块化UI 文章目录 构建模块化UI1、概述2、创建UI管理器3、嵌套组件4、继承5、多态子组件6、总结在本文中,将介绍如何使用C++和SDL创建一个灵活且可扩展的UI系统,重点关注组件层次结构和多态性。 1、概述 在前面的文章中,我们介绍了应用程序循环和事件循环,这为我们的…...
面向机器学习的Java库与平台简介、适用场景、官方网站、社区网址
Java机器学习的库与平台 最近听到有的人说要做机器学习就一定要学Python,我想他们掌握的知道还不够系统全面。本文作者给大家介绍几种常用Java实现的机器学习库,快快收藏加关注吧~ Java机器学习库表格 Java机器学习库整理库/平台概念适合场…...
基于YOLO11深度学习的心脏超声图像间隔壁检测分割与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割、人工智能
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
ubuntu24基于虚拟机无法从主机拖拽文件夹
以下是解决问题的精简步骤: 安装 open-vm-tools-desktop: bash复制 sudo apt-get install open-vm-tools-desktop 重启虚拟机后,文字复制粘贴功能可正常工作。 禁用 Wayland: 编辑 /etc/gdm3/custom.conf 文件: bash复…...
常用Webpack Loader汇总介绍
引言 在前端项目开发中,Webpack 作为强大的模块打包工具,能够将各种资源进行打包处理。而其中的 Loader 则是 Webpack 处理不同类型文件的关键,它允许 Webpack 不仅仅局限于处理 JavaScript 文件,还能处理 CSS、图片、字体等多种…...
剑指 Offer II 023. 两个链表的第一个重合节点
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20023.%20%E4%B8%A4%E4%B8%AA%E9%93%BE%E8%A1%A8%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E9%87%8D%E5%90%88%E8%8A%82%E7%82%B9/README.md 剑指 Offer II 023. 两…...
个人搭建CDN加速服务 特网科技
在互联网快速发展的今天,网站的加载速度对用户体验有着至关重要的影响,传统的网页加载方式依赖于服务器的性能和网络环境,这使得某些网站的页面加载时间过长,用户体验不佳,为了解决这个问题,许多企业开始采…...
用deepseek学大模型08-卷积神经网络(CNN)
yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数,损失函数,梯度下降 标量和矩阵形式的数学推导,pytorch真实能跑的代码案例以及模型,数据,预测结果的可视化展示, 模型应用场景和优缺点…...
蓝桥杯单片机基础部分——6、555定时器
前言 NE555是一个纯硬件的设计,旦硬件电路确定了,其功能也确定了,没有可编程的部分,也没什么好去理解的地方,如果理解不了就直接背代码,这里也不是很常考,大家了解一下就可以了,知道…...
Python学习心得函数
一、函数的定义及调用 1.函数的定义: 函数的定义:函数是将一段能实现某种特定功能的代码,使用函数名进行封装,并通过函数名称进行调用。从而达到一次编写,多次调用的目的。 2.函数类型分为两类: &#…...
神经网络实验——MLP
目录 1 目的 2 方法 3 源代码 4 结果 1 目的 ①熟悉 Python 的输入输出流; ②学会使用 matplotlib进行图像可视化; ③掌握神经网络的基本原理,学会使用 sklearn 库中的 MLPClassifier 函数构建基础的多层感知机神经网络分类器; ④学会使用网格查找进行超参数优…...
配置Api自动生成
我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/TVlJdMgYLoDJrsxAwMgcCE14nxt 使用Springfox Swagger生成API,并导入Postman,完成API单元测试 Swagger: 是一套API定义的规范,按照这套规范的要求去定义接口及接口相关信息,再通过可…...
dify-AI 私有部署可修改前端页面
dify文档 官方文档:欢迎使用 Dify | Dify 源码:https://github.com/langgenius/dify.git 安装docker 官网:https://www.docker.com/ 部署服务到docker cd dify cd docker cp .env.example .env docker compose up -d查看效果 http://localh…...
使用 @Results 注解来手动指定字段映射
在 MyBatis 中,Results 注解用于手动指定查询结果的字段映射,尤其当数据库列名与 Java 对象的字段名不一致时。你可以通过 Results 和 Result 注解来精确控制每一列与类属性之间的映射关系。 示例:使用 Results 注解来手动指定字段映射 假设你…...
数据治理中 大数据处理一般都遵循哪些原则
在数据治理中,大数据处理通常遵循以下原则: 最小化原则:企业应只收集实现特定目的所需的数据,避免数据冗余和安全风险。 合法性原则:企业必须遵守相关法律法规,确保数据处理符合法律要求,降低法…...
从0到1:STM32温控系统开发踩坑指南
1. 设计目标 核心功能:实现0-100℃范围内的温度闭环控制 性能指标: 测量精度:0.5℃(使用DS18B20传感器) 控制响应时间:<5秒 显示分辨率:0.1℃ 扩展功能: LCD实时显示当前温度…...
修改时无条件,可以自定义id条件(通过查询)
在这段代码中,$(row).attr(data-rarity, data.rarity); 的作用是给表格的每一行 (row) 添加一个 data-rarity 的自定义属性,属性的值是该行数据中的 rarity 字段。 解释: 1.row 是当前行的 DOM 元素。 2.data.rarity 是从 data 对象中获取的…...
工业制造能耗管理新突破,漫途MTIC-ECM平台助力企业绿色转型!
在工业制造领域,能源消耗一直是企业运营成本的重要组成部分。随着“双碳”目标的推进,如何实现高效能耗管理,成为制造企业亟待解决的问题。漫途MTIC-ECM能源能耗在线监测平台,结合其自研的硬件产品,为工业制造企业提供…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
