Springboot项目中使用EasyPOI方式导出合同word文档

在Java开发中,使用EasyPOI导出Word合同文档是一种高效且灵活的解决方案。通过模板驱动的方式,开发者可以轻松地将动态数据填充到预设的Word模板中,生成格式规范的合同文件 。这种方法特别适合需要批量生成标准化合同、协议或报告的场景。

1、需求

使用easyPOI方式导出合同word文档。

前几篇文章,我们注重讲了使用EasyPoi操作Excel文件的详细流程,使用Word模板和Excel模板用法基本一致,支持的标签也是一致的,仅仅**支持07版本的word**也是只能生成后缀是docx的文档,本文我们就拿docx做导出功能,

2、导入依赖

版本兼容性
确保使用EasyPOI 4.3.0及以上版本,旧版本可能不支持多图片循环导出等高级功能。同时注意Spring Boot版本与EasyPOI的兼容性:

<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version></dependency>

3、模板指令

EasyPOI提供了丰富的模板指令,可以处理各种复杂的合同导出需求。掌握这些指令能让你的合同文档更加灵活和强大。
下面列举下EasyPoi支持的指令以及作用,最主要的就是各种fe的用法:

三元运算{{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()行,然后插入#fe: 横向遍历v_fe: 横向遍历值!if: 删除当前列{{!if:(test)}}单引号表示常量值 ‘’ 比如’1’ 那么输出的就是1&NULL&空格&INDEX&表示循环中的序号,自动添加]]换行符 多行遍历导出 sum: 统计数据
指令功能描述合同应用示例
{{fe:resourceList }}遍历列表数据创建行合同条款列表、附件清单
{{fd:date;yyyy-MM-dd}}格式化日期合同签署日期、生效日期
{{fn:amount;.00}}格式化数字合同金额、违约金计算
{{if:condition}}条件判断显示/隐藏可选条款、特殊约定
{{}}换行符多行地址、条款换行

对于复杂的合同表格,可以使用{{fe:tableData}}指令动态生成多行数据。例如在合同附件清单中,可以通过遍历List数据自动生成表格行,每行包含附件名称、编号、页数等信息。

4、制作模板

  1. 根据上述的指令要求,我们制作模板如下:
  2. 把制作好的模板放入到项目中

5、代码实现

5.1、UserController

修改原来的导出合同的方法:

@GetMapping(value="/downloadContract",name="导出用户合同")publicvoiddownloadContract(Longid,HttpServletResponseresponse)throwsException{// userService.downloadContract(id,response);userService.downloadContractWithEasyPOI(id,response);}

5.2、IUserService

voiddownloadContractWithEasyPOI(Longid,HttpServletResponseresponse)throwsException;

5.3、UserServiceImpl

@OverridepublicvoiddownloadContractWithEasyPOI(Longid,HttpServletResponseresponse)throwsException{FilerootPath=newFile(ResourceUtils.getURL("classpath:").getPath());//SpringBoot项目获取根目录的方式FiletemplatePath=newFile(rootPath.getAbsolutePath(),"/word_template/contract_template2.docx");// 先获取导出word需要的数据Useruser=this.findById(id);// 把需要的数据放到map中,方便替换SimpleDateFormatsimpleDateFormat=newSimpleDateFormat("yyyy-MM-dd");Map<String,Object>params=newHashMap<String,Object>();params.put("userName",user.getUserName());params.put("hireDate",simpleDateFormat.format(user.getHireDate()));params.put("address",user.getAddress());// 下面是表格中需要的数据List<Map>resourceList=newArrayList<>();Map<String,Object>map=null;for(Resourceresource:user.getResourceList()){map=newHashMap<String,Object>();map.put("name",resource.getName());map.put("price",resource.getPrice());map.put("needReturn",resource.getNeedReturn());ImageEntityimage=newImageEntity();image.setHeight(64);image.setWidth(72);image.setUrl(rootPath.getPath()+"\\static"+resource.getPhoto());map.put("photo",image);resourceList.add(map);}// 把组建好的表格需要的数据放到大map中params.put("resourceList",resourceList);// 根据模板+数据 导出文档XWPFDocumentxwpfDocument=WordExportUtil.exportWord07(templatePath.getPath(),params);Stringfilename=user.getUserName()+"_合同.docx";// 设置文件的打开方式和mime类型ServletOutputStreamoutputStream=response.getOutputStream();response.setHeader("Content-Disposition","attachment;filename="+newString(filename.getBytes(),"ISO8859-1"));response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");xwpfDocument.write(outputStream);}

其中findById方法代码如下:

@OverridepublicUserfindById(Longid)throwsException{Useruser=userMapper.selectById(id);List<Resource>resources=resourceMapper.selectList(newQueryWrapper<Resource>().in("user_id",id));user.setResourceList(resources);returnuser;}

6、导出结果


说明:

  1. 使用.docx格式:模板必须保存为.docx格式(Word 2007+),不支持旧的.doc格式;
  2. 占位符格式:严格使用{{变量名}}格式,前后不能有空格;
  3. 复杂表格处理:对于动态行表格,在模板中只需设计一行,EasyPOI会自动复制并填充数据;
  4. 图片导出:如果需要导出合同中的公司logo或签名图片,使用ImageEntity类进行配置。


“人的一生会经历很多痛苦,但回头想想,都是传奇”。


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

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

相关文章

【优化形状】非主导排序遗传算法的翼型形状优化【含Matlab源码 14992期】含报告

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

互联网大厂Java面试:从Spring基础到微服务架构的技术问答

互联网大厂Java面试&#xff1a;从Spring基础到微服务架构的技术问答 场景概述 小白程序员超好吃面试一家互联网大厂&#xff0c;场景为内容社区与UGC业务。面试官通过三个轮次的提问&#xff0c;从基础到高级&#xff0c;引导小白程序员展示技术能力&#xff0c;并通过业务场景…

深度学习优化算法与实践

深度学习优化算法与实践 本学习路径涵盖了从优化基础理论到多种优化算法&#xff08;包括梯度下降、随机梯度下降、动量法、AdaGrad、RMSProp、Adadelta、Adam及其改进版本Yogi&#xff09;的深入讲解&#xff0c;并探讨了学习率调度策略在深度学习模型训练中的应用。 深度学…

校园“财递通”快递代取系统的设计与实现的设计与实现(源码+论文+部署+安装)

感兴趣的可以先收藏起来&#xff0c;还有在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望可以帮到大家。一、程序背景随着高校规模扩大&#xff0c;师生快递需求激增&#xff0c;传统校园快递代取模式深陷多重困…

qwen 3和 medgemma 最新版本 最主要的架构区别是什么

qwen 3和 medgemma 最新版本 最主要的架构区别是什么下面是 最新版本的 Qwen 3 系列&#xff08;包括 Qwen3‑Max/Qwen3‑Next/Qwen3‑Omni&#xff09; 和 Google 的 MedGemma 系列 在架构层面上的 核心区别&#xff08;截止 2026 年初&#xff09;&#xff1a;&#x1f9e0;…

芙蕊汇坚守初心,为消费者创造更好体验

在美妆行业消费升级的浪潮中&#xff0c;消费者对品质体验与价值共鸣的追求愈发强烈。当市场充斥着多元声音时&#xff0c;“不被喧嚣裹挟&#xff0c;始终聚焦“是芙蕊汇给出的答案。“为消费者创造更好体验”的核心&#xff0c;构建“自用省钱&#xff0c;价值回流”的消费闭…

吹塑机远程监控运维物联网解决方案

吹塑机作为塑料制品、包装容器、汽车配件等行业的关键成型设备&#xff0c;其成型精度、生产效率、运行稳定性直接影响制品壁厚均匀性、机械强度及外观质量&#xff0c;是保障产品一致性、提升生产效益的核心装备。传统模式下&#xff0c;吹塑机多依赖现场人工操作与定期点检&a…

2026年六大远程控制APP深度解析:连接无忧之选

在数字化办公与远程协作深度发展的2026年&#xff0c;远程控制软件已成为支撑企业运营与个人高效办公的重要工具。面对国内外市场上技术路线与定位各具特色的产品&#xff0c;用户如何选择适合自己的工具&#xff1f;本文将分为国内与国外两大类&#xff0c;各选取三款主流软件…

PCB埋容埋阻热管理进阶:功率适配与特殊场景可靠性指南

埋容埋阻工艺在高密度、小型化PCB设计中应用广泛&#xff0c;但在高功率负载、柔性装配、车载复杂工况下&#xff0c;其热管理面临功率适配不足、弯折热失效、返修热损伤等新难题。这些痛点易导致埋容埋阻性能衰减、PCB结构失效&#xff0c;影响产品长期稳定性。依托猎板在埋容…

底薪涨幅12%,年薪百万岗位扎堆,华人创业做AI面试平台,帮500强企业抢技术人才

底薪涨幅12%&#xff0c;年薪百万岗位扎堆&#xff0c;华人创业做AI面试平台&#xff0c;帮500强企业抢技术人才 原创 子墨 子墨 扬帆出海 作者丨子墨 编辑丨火狐狸 众所周知&#xff0c;在内卷加剧的职场环境中&#xff0c;国内找工作愈发困难。其实&#xff0c;在美国类似的…

Flutter艺术探索-Flutter包管理:pubspec.yaml配置详解

Flutter包管理&#xff1a;pubspec.yaml配置详解 引言 搞Flutter开发&#xff0c;你肯定天天和pubspec.yaml这个文件打交道。它看起来简单&#xff0c;就是一个YAML格式的配置文件&#xff0c;但实际上&#xff0c;它管的事儿可多了——项目叫什么、用什么版本的Dart和Flutter、…

云边端智能制造实践教学系统

近日&#xff0c;八部门联合印发的《“人工智能制造”专项行动实施意见》&#xff08;以下简称《意见》&#xff09;为我国制造业智能化升级描绘了清晰的路线图。《意见》提出&#xff0c;到2027年要推动3-5个通用大模型在制造业深度应用&#xff0c;打造1000个高水平工业智能体…

大蒜蒸煮机口碑绝佳,这家技术公司凭啥脱颖而出引关注?

《蒸煮机哪家好&#xff1a;排名前五专业深度测评》 开篇&#xff1a;定下基调 在食品加工行业中&#xff0c;蒸煮机作为关键设备&#xff0c;其性能优劣直接影响着产品的质量和生产效率。本次测评旨在为对蒸煮机感兴趣的人群&#xff0c;提供一份客观、专业的产品评估报告&a…

常见可与人工智能结合的专业

在科技飞速发展的今天&#xff0c;人工智能已经不再是遥不可及的概念&#xff0c;它正以惊人的速度融入到各行各业中。而行动政策的支持&#xff0c;更是让人工智能的优势愈发凸显&#xff0c;各行各业都在积极依托人工智能实现创新与发展。对于在校大学生来说&#xff0c;了解…

Flutter艺术探索-Flutter网络请求基础:http包使用指南

Flutter 网络请求基础&#xff1a;用好官方 http 包 引言 在移动应用开发中&#xff0c;网络请求是连接客户端与服务器的核心环节。对于 Flutter 开发者而言&#xff0c;官方提供的 http 包是一个绕不开的基础工具。它轻量、稳定且由官方维护&#xff0c;非常适合初学者上手以及…

AI训练“踩坑“新姿势!北大腾讯RAGShaper:让大模型在“噪音地狱“中自动进化,小白也能上手!

主要关注LLM、RAG、Agent等AI前沿技术&#xff0c;每天分享业界最新成果和实战案例。 Agentic RAG 需要“会自己规划、检索、纠错”的模型&#xff0c;但高质量训练数据稀缺——人工标注既贵又浅&#xff0c;无法还原真实检索噪声。北京大学 & 腾讯 AI Lab联合提出了RAGSha…

大厂 算法岗transformer面试题

一&#xff0c;基础原理与数学模型 1.Transformer为何使用多头注意力机制?(为什么不用一个头) 2.Transformer为什么Q和K使用不同的权重矩阵生成?为何不能使用同一个值进行自身的点乘?(注意和第一个问题的区别) 3.Transformer计算attention的时候为何选择点乘而不是加法?…

深夜的“闪电侠”:在线监测如何让电网故障秒级“自愈”

深夜&#xff0c;雷雨交加。一道闪电划过&#xff0c;小区突然陷入黑暗。然而就在你刚摸到手机&#xff0c;准备发朋友圈吐槽时&#xff0c;灯光瞬间恢复了。前后不过几秒钟&#xff0c;快得让人以为是错觉。这不是电网魔法&#xff0c;而是现代电力系统的“智慧大脑”——在线…

加入全球家办精英圈层——HKFA环球家族办公室总会(HKFAGFOA)的会员体系

对于致力于服务高净值家族的机构与专业人士而言&#xff0c;选择一个有分量的业界平台至关重要。HKFA环球家族办公室总会&#xff08;HKFA Global Family Office Association&#xff0c;简称GFOA&#xff09; 正是这样一个平台。HKFA环球家族办公室总会&#xff08;HKFAGFOA&a…

Flutter艺术探索-Flutter异步编程:Future、async/await深度解析

Flutter异步编程&#xff1a;Future、async/await深度解析 引言 开发移动应用时&#xff0c;我们总会遇到一些“慢活儿”&#xff1a;比如等网络返回数据、读写本地文件&#xff0c;或者查一下数据库。如果让这些操作卡住界面&#xff0c;用户体验可就糟透了。好在 Flutter 使用…