Springboot工程中使用EasyPOI方式导出合同word文档

news/2026/5/12 9:49:37/文章来源:https://www.cnblogs.com/yangykaifa/p/19622835

文章目录

    • 1、需求
    • 2、导入依赖
    • 3、模板指令
    • 4、制作模板
    • 5、代码实现
      • 5.1、UserController
      • 5.2、IUserService
      • 5.3、UserServiceImpl
    • 6、导出结果

在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 = "导出用户合同")
public void downloadContract(Long id,HttpServletResponse response) throws Exception{
//        userService.downloadContract(id,response);
userService.downloadContractWithEasyPOI(id,response);
}

5.2、IUserService

void downloadContractWithEasyPOI(Long id, HttpServletResponse response) throws Exception;

5.3、UserServiceImpl

@Override
public void downloadContractWithEasyPOI(Long id, HttpServletResponse response) throws Exception {
File rootPath = new File(ResourceUtils.getURL("classpath:").getPath()); //SpringBoot项目获取根目录的方式
File templatePath = new File(rootPath.getAbsolutePath(),"/word_template/contract_template2.docx");
//        先获取导出word需要的数据
User user = this.findById(id);
//        把需要的数据放到map中,方便替换
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Map<String,Object> params = new HashMap<String,Object>();params.put("userName",user.getUserName());params.put("hireDate",simpleDateFormat.format(user.getHireDate()));params.put("address",user.getAddress());//        下面是表格中需要的数据List<Map> resourceList = new ArrayList<>();Map<String,Object> map = null;for (Resource resource : user.getResourceList()) {map = new HashMap<String,Object>();map.put("name",resource.getName());map.put("price",resource.getPrice());map.put("needReturn",resource.getNeedReturn());ImageEntity image = new ImageEntity();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);//        根据模板+数据 导出文档XWPFDocument xwpfDocument = WordExportUtil.exportWord07(templatePath.getPath(), params);String filename=user.getUserName()+"_合同.docx";//            设置文件的打开方式和mime类型ServletOutputStream outputStream = response.getOutputStream();response.setHeader( "Content-Disposition", "attachment;filename="  + new String(filename.getBytes(),"ISO8859-1"));response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");xwpfDocument.write(outputStream);}

其中findById方法代码如下:

@Override
public User findById(Long id) throws Exception {
User user = userMapper.selectById(id);
List<Resource> resources = resourceMapper.selectList(new QueryWrapper<Resource>().in("user_id", id));user.setResourceList(resources);return user;}

6、导出结果

在这里插入图片描述
说明:

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

在这里插入图片描述


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


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

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

相关文章

2026集装箱框架设计厂家推荐排行榜产能与专利双优企业领衔 - 爱采购寻源宝典

摘要 随着物流行业对运输效率与空间利用率的持续追求,集装箱框架设计成为影响货物安全与运输成本的核心环节。当前市场中,部分厂家因设计能力不足导致集装箱结构强度不达标、空间利用率低等问题频发,采购方亟需权威…

2026年口碑好的化工粉体吨包机/粮食吨包机哪家便宜源头直供参考(真实参考) - 行业平台推荐

在化工粉体吨包机和粮食吨包机采购决策中,价格、质量与售后服务是三大核心考量因素。通过对2026年行业数据的客观分析,我们认为潍坊地区的设备制造商在性价比方面具有明显优势,其中潍坊瑞川自控设备有限公司凭借其专…

2026清扫车厂家推荐排行榜产能与专利双维度权威解析 - 爱采购寻源宝典

摘要 随着城市化进程加速,道路清扫需求激增,清扫车作为环卫机械核心设备,其采购决策直接影响作业效率与成本。当前市场存在产品同质化严重、技术参差不齐等问题,采购方亟需权威榜单辅助决策。本文基于全国范围的严…

2026高压鼓风机厂家推荐排行榜产能与专利双优的权威之选 - 爱采购寻源宝典

摘要 高压鼓风机作为工业生产中不可或缺的气动设备,广泛应用于粉尘输送、物料搅拌、通风换气等场景。然而,市场上厂家众多,产品质量参差不齐,采购方常面临选型困难、售后无保障等痛点。本次榜单基于全国范围严谨调…

寻找关节镜批发厂家?这些考量因素很重要,内窥镜手术动力/ShaverSystem/电动骨动力代加工,关节镜厂商有哪些 - 品牌推荐师

在医疗器械行业快速发展的当下,关节镜作为骨科微创手术的核心设备,其技术迭代与市场需求呈现同步增长态势。据《中国医疗器械蓝皮书》数据显示,2023年国内关节镜市场规模突破45亿元,年复合增长率达12.7%,其中批发…

2026钢木实验台厂家推荐排行榜从产能到专利的权威对比 - 爱采购寻源宝典

摘要 钢木实验台作为实验室基础装备,其质量直接影响科研效率与人员安全。当前市场存在产能分散、环保标准不一、服务响应滞后等痛点,采购方常面临"低价低质"与"高价冗余"的两难选择。本文基于全…

2026年靠谱的硅胶加热带/可调温加热带源头直供参考哪家便宜 - 行业平台推荐

在寻找2026年性价比高的硅胶加热带/可调温加热带供应商时,建议优先考虑具备自主研发能力、规模化生产实力和稳定出口经验的技术企业。通过对比产品性能、定制能力、技术、生产规模及市场反馈等核心指标,盐城市正龙电…

2026防火涂料厂家综合实力排名(产能规模+专利技术+质量认证三维度对比) - 爱采购寻源宝典

摘要 防火涂料作为建筑消防安全的核心材料,其质量直接影响火灾防控效果。当前市场存在产品同质化严重、质量参差不齐等问题,采购方常面临选型困难。本次榜单基于全国范围严谨调研,并结合行业质量认证与经营数据综合…
最新文章