最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot項目中使用EasyPOI方式導(dǎo)出合同Word文檔的代碼實現(xiàn)

 更新時間:2026年01月20日 08:54:12   作者:hhzz  
本文介紹了如何使用EasyPOI庫在Java中導(dǎo)出Word合同文檔,通過模板驅(qū)動的方式,可以靈活地將動態(tài)數(shù)據(jù)填充到預(yù)設(shè)的Word模板中,生成格式規(guī)范的合同文件,重點(diǎn)講解了導(dǎo)入依賴、模板指令、制作模板和代碼實現(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ù)上述的指令要求,我們制作模板如下:

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

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é)果

說明:

  1. 使用.docx格式:模板必須保存為.docx格式(Word 2007+),不支持舊的.doc格式;
  2. 占位符格式:嚴(yán)格使用{{變量名}}格式,前后不能有空格;
  3. 復(fù)雜表格處理:對于動態(tài)行表格,在模板中只需設(shè)計一行,EasyPOI會自動復(fù)制并填充數(shù)據(jù);
  4. 圖片導(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ù)的示例代碼

    SpringBoot集成ShedLock實現(xiàn)分布式定時任務(wù)的示例代碼

    ShedLock 是一個 Java 庫,通常用于分布式系統(tǒng)中,確保定時任務(wù)(Scheduled Tasks)在集群環(huán)境下只被某一個實例執(zhí)行一次,本文給大家介紹了SpringBoot集成ShedLock實現(xiàn)分布式定時任務(wù)的示例代碼,需要的朋友可以參考下
    2024-12-12
  • 關(guān)于@Bean的使用方式

    關(guān)于@Bean的使用方式

    這篇文章主要介紹了關(guān)于@Bean的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java中I/O流讀取數(shù)據(jù)不完整的問題解決

    Java中I/O流讀取數(shù)據(jù)不完整的問題解決

    本文主要介紹了ava中I/O流讀取數(shù)據(jù)不完整的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • java冒泡排序簡單實例

    java冒泡排序簡單實例

    本文主要介紹了JSONjava冒泡排序?qū)嵗c思路分析。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • 舉例講解Java中do-while語句的使用方法

    舉例講解Java中do-while語句的使用方法

    這篇文章主要介紹了Java中do-while語句的使用方法例子,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • Java Switch對各類型支持實現(xiàn)原理

    Java Switch對各類型支持實現(xiàn)原理

    這篇文章主要介紹了Java Switch對各類型支持實現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • JavaWeb response和request對象原理及實例解析

    JavaWeb response和request對象原理及實例解析

    這篇文章主要介紹了JavaWeb response和request對象原理及實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • 創(chuàng)建java多線程程序

    創(chuàng)建java多線程程序

    Java 給多線程編程提供了內(nèi)置的支持。一條線程指的是進(jìn)程中一個單一順序的控制流,一個進(jìn)程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。希望本篇文章能夠給你帶來幫助
    2021-06-06
  • intelij?idea?2023創(chuàng)建java?web項目的完整步驟

    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
  • 解決Spring?MVC中文亂碼的編碼配置

    解決Spring?MVC中文亂碼的編碼配置

    這篇文章主要為大家介紹了解決SpringMVC中文亂碼的編碼配置示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評論

且末县| 离岛区| 景洪市| 正宁县| 望江县| 体育| 宝丰县| 吐鲁番市| 兴安盟| 古丈县| 斗六市| 云梦县| 东城区| 延边| 泽库县| 洛南县| 循化| 清原| 阳新县| 黄石市| 兴和县| 文安县| 潞城市| 镇安县| 勃利县| 门源| 安丘市| 河曲县| 天镇县| 普定县| 龙南县| 彭水| 平昌县| 静安区| 高台县| 突泉县| 嘉义市| 沈阳市| 西华县| 皮山县| 漳州市|