SpringBoot項目中使用EasyPOI方式導(dǎo)出合同Word文檔的代碼實現(xiàn)
在Java開發(fā)中,使用EasyPOI導(dǎo)出Word合同文檔是一種高效且靈活的解決方案。通過模板驅(qū)動的方式,開發(fā)者可以輕松地將動態(tài)數(shù)據(jù)填充到預(yù)設(shè)的Word模板中,生成格式規(guī)范的合同文件 。這種方法特別適合需要批量生成標(biāo)準(zhǔn)化合同、協(xié)議或報告的場景。
1、需求
使用easyPOI方式導(dǎo)出合同word文檔。
前幾篇文章,我們注重講了使用EasyPoi操作Excel文件的詳細(xì)流程,使用Word模板和Excel模板用法基本一致,支持的標(biāo)簽也是一致的,僅僅**支持07版本的word**也是只能生成后綴是docx的文檔,本文我們就拿docx做導(dǎo)出功能,
2、導(dǎo)入依賴
版本兼容性
確保使用EasyPOI 4.3.0及以上版本,舊版本可能不支持多圖片循環(huán)導(dǎo)出等高級功能。同時注意Spring Boot版本與EasyPOI的兼容性:
<dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.4.0</version> </dependency>
3、模板指令
EasyPOI提供了豐富的模板指令,可以處理各種復(fù)雜的合同導(dǎo)出需求。掌握這些指令能讓你的合同文檔更加靈活和強(qiáng)大。
下面列舉下EasyPoi支持的指令以及作用,最主要的就是各種fe的用法:
三元運(yùn)算 {{test ? obj:obj2}}
n: 表示 這個cell是數(shù)值類型 {{n:}}
le: 代表長度{{le:()}} 在if/else 運(yùn)用{{le:() > 8 ? obj1 : obj2}}
fd: 格式化時間 {{fd:(obj;yyyy-MM-dd)}}
fn: 格式化數(shù)字 {{fn:(obj;###.00)}}
fe: 遍歷數(shù)據(jù),創(chuàng)建row
!fe: 遍歷數(shù)據(jù)不創(chuàng)建row
$fe: 下移插入,把當(dāng)前行,下面的行全部下移.size()行,然后插入
#fe: 橫向遍歷
v_fe: 橫向遍歷值
!if: 刪除當(dāng)前列 {{!if:(test)}}
單引號表示常量值 ‘' 比如'1' 那么輸出的就是 1
&NULL& 空格
&INDEX& 表示循環(huán)中的序號,自動添加
]] 換行符 多行遍歷導(dǎo)出
sum: 統(tǒng)計數(shù)據(jù)
| 指令 | 功能描述 | 合同應(yīng)用示例 |
|---|---|---|
| {{fe:resourceList }} | 遍歷列表數(shù)據(jù)創(chuàng)建行 | 合同條款列表、附件清單 |
| {{fd:date;yyyy-MM-dd}} | 格式化日期 | 合同簽署日期、生效日期 |
| {{fn:amount;.00}} | 格式化數(shù)字 | 合同金額、違約金計算 |
| {{if:condition}} | 條件判斷顯示/隱藏 | 可選條款、特殊約定 |
| {{}} | 換行符 | 多行地址、條款換行 |
對于復(fù)雜的合同表格,可以使用{{fe:tableData}}指令動態(tài)生成多行數(shù)據(jù)。例如在合同附件清單中,可以通過遍歷List數(shù)據(jù)自動生成表格行,每行包含附件名稱、編號、頁數(shù)等信息。
4、制作模板
根據(jù)上述的指令要求,我們制作模板如下:

- 把制作好的模板放入到項目中

5、代碼實現(xiàn)
5.1、UserController
修改原來的導(dǎo)出合同的方法:
@GetMapping(value = "/downloadContract",name = "導(dǎo)出用戶合同")
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");
// 先獲取導(dǎo)出word需要的數(shù)據(jù)
User user = this.findById(id);
// 把需要的數(shù)據(jù)放到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());
// 下面是表格中需要的數(shù)據(jù)
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);
}
// 把組建好的表格需要的數(shù)據(jù)放到大map中
params.put("resourceList",resourceList);
// 根據(jù)模板+數(shù)據(jù) 導(dǎo)出文檔
XWPFDocument xwpfDocument = WordExportUtil.exportWord07(templatePath.getPath(), params);
String filename=user.getUserName()+"_合同.docx";
// 設(shè)置文件的打開方式和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、導(dǎo)出結(jié)果

說明:
- 使用.docx格式:模板必須保存為.docx格式(Word 2007+),不支持舊的.doc格式;
- 占位符格式:嚴(yán)格使用{{變量名}}格式,前后不能有空格;
- 復(fù)雜表格處理:對于動態(tài)行表格,在模板中只需設(shè)計一行,EasyPOI會自動復(fù)制并填充數(shù)據(jù);
- 圖片導(dǎo)出:如果需要導(dǎo)出合同中的公司logo或簽名圖片,使用ImageEntity類進(jìn)行配置。

“人的一生會經(jīng)歷很多痛苦,但回頭想想,都是傳奇”。
以上就是SpringBoot項目中使用EasyPOI方式導(dǎo)出合同Word文檔的代碼實現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot EasyPOI導(dǎo)出合同Word的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot集成ShedLock實現(xiàn)分布式定時任務(wù)的示例代碼
ShedLock 是一個 Java 庫,通常用于分布式系統(tǒng)中,確保定時任務(wù)(Scheduled Tasks)在集群環(huán)境下只被某一個實例執(zhí)行一次,本文給大家介紹了SpringBoot集成ShedLock實現(xiàn)分布式定時任務(wù)的示例代碼,需要的朋友可以參考下2024-12-12
Java中I/O流讀取數(shù)據(jù)不完整的問題解決
本文主要介紹了ava中I/O流讀取數(shù)據(jù)不完整的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
JavaWeb response和request對象原理及實例解析
這篇文章主要介紹了JavaWeb response和request對象原理及實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
intelij?idea?2023創(chuàng)建java?web項目的完整步驟
這篇文章主要給大家介紹了關(guān)于intelij?idea?2023創(chuàng)建java?web項目的完整步驟,該教學(xué)主要針對各位剛剛接觸javaweb開發(fā)的小伙伴,各位學(xué)習(xí)java的朋友也難免會經(jīng)歷這個階段,需要的朋友可以參考下2023-10-10

