Java 動態導出 Word 登記表:多人員、分頁、動態表格的最佳實踐

本文詳細講解如何使用 Java 動態導出包含多人員報名表的 Word 文檔,每人占據獨立一頁,并支持動態表格行(如個人經歷)。我們對比了多種實現方案,最終推薦基于 Freemarker + XML 模板docx4j 的靈活方式,并提供完整代碼示例與最佳實踐,助你高效實現復雜 Word 導出需求。

一、需求分析

在許多業務場景中(如招聘報名、活動登記、培訓考核等),我們需要將多人的信息導出為 Word 文檔,通常要求:

  1. 每人一頁:每個人的報名表獨立成頁,便于打印或分發;
  2. 動態表格行:如“工作經歷”“學習經歷”等,每個人的條目數量不固定;
  3. 模板可配置:希望報名表的字段、排版可靈活調整,而非硬編碼;
  4. 導出為標準 DOCX:兼容 Microsoft Word,支持分頁、表格樣式等。

傳統方式(如直接拼接字符串生成 Word)難以滿足動態需求,而 Apache POI 雖然功能強大,但 API 繁瑣。本文將介紹更優雅的解決方案。

在這里插入圖片描述

二、實現思路

方案對比

方案技術棧靈活性復雜度適用場景
Freemarker + XML 模板Freemarker + 手動操作 DOCX 結構????中高需要高度定制化模板
docx4jdocx4j 庫?????生產環境推薦,支持復雜排版
Apache POI XWPFApache POI???中高簡單到中等復雜度需求
JasperReportsJasperReports??報表類導出

推薦選擇

  • 追求靈活性和可控性 → Freemarker + XML 模板
  • 追求開發效率和穩定性 → docx4j

核心實現步驟

  1. 定義數據模型:如 Applicant(姓名、經歷等);
  2. 準備 Word 模板:
    • 方式 1:從 DOCX 中提取 document.xml,用 Freemarker 語法替換動態部分;
    • 方式 2:直接編寫 XML 模板(需熟悉 Word 的 XML 結構);
  3. 動態渲染:用 Freemarker 填充數據,生成 document.xml
  4. 打包為 DOCX:將渲染后的 XML 放入標準 DOCX 結構(或使用 docx4j 直接生成)。

三、示例代碼

1. 數據模型定義

// Applicant.java
public class Applicant {private String name;private List<Experience> experiences;// getters/setters...
}// Experience.java
public class Experience {private String period;private String organization;// getters/setters...
}

2. Freemarker + XML 模板方案

(1)XML 模板片段(applicant_template.ftl
<w:tbl><w:tr><w:tc<w:p><w:r><w:t>時間段</w:t></w:r></w:p></w:tc><w:tc<w:p><w:r><w:t>單位</w:t></w:r></w:p></w:tc></w:tr><#list experiences as exp><w:tr><w:tc<w:p><w:r><w:t>${exp.period}</w:t></w:r></w:p></w:tc><w:tc<w:p><w:r><w:t>${exp.organization}</w:t></w:r></w:p></w:tc></w:tr></#list>
</w:tbl>
<w:p<w:r><w:br w:type="page"/></w:r></w:p> <!-- 分頁符 -->
(2)Java 渲染代碼
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setClassForTemplateLoading(getClass(), "/templates");
Template template = cfg.getTemplate("applicant_template.ftl");StringWriter xmlWriter = new StringWriter();
Map<String, Object> data = new HashMap<>();
data.put("name", applicant.getName());
data.put("experiences", applicant.getExperiences());
template.process(data, xmlWriter);// 將 xmlWriter.toString() 插入到完整 DOCX 的 document.xml 中

3. docx4j 方案(推薦生產環境使用)

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.wml.*;// 創建 Word 文檔
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();// 循環添加每個人
for (Applicant applicant : applicants) {// 添加基本信息段落wordMLPackage.getMainDocumentPart().addParagraphOfText("姓名: " + applicant.getName());// 創建表格Tbl table = factory.createTbl();// 添加表頭行...// 循環添加經歷行...wordMLPackage.getMainDocumentPart().addObject(table);// 添加分頁符wordMLPackage.getMainDocumentPart().addPageBreak();
}// 保存為 DOCX
wordMLPackage.save(new File("applicants.docx"));

四、優勢對比

方案優點缺點
Freemarker + XML完全控制模板,適合復雜需求需手動處理 DOCX 結構
docx4j開箱即用,支持高級功能學習曲線略陡
Apache POI無需額外依賴API 繁瑣,動態表格難實現

最終建議

  • 中小項目或快速原型 → Freemarker + XML
  • 企業級應用 → docx4j

五、總結

本文介紹了 Java 動態導出 Word 報名表的完整方案,重點解決了 多人員分頁動態表格行 的需求。通過對比不同技術棧,推薦:

  1. 靈活性優先 → Freemarker + XML 模板;
  2. 開發效率優先 → docx4j 庫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90446.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90446.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90446.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【element-ui el-table】多選表格勾選時默認勾選了全部,row-key綁定異常問題解決

項目場景&#xff1a; Element-UI的el-table組件row-key使用問題 同一個頁面使用了幾個table&#xff0c;這幾個table都使用了多選&#xff0c;row-key屬性&#xff0c;其中row-key的綁定方式都是用的靜態綁定&#xff0c;row-key“username”或row-key“id”&#xff0c;可正常…

C#注釋技巧與基礎編程示例

以下是一個包含基礎注釋的 C# 程序示例&#xff0c;展示了 C# 中各類注釋的使用方法&#xff1a;using System;namespace BasicCSharpProgram {/// <summary>/// Program 類是應用程序的入口點/// 包含 Main 方法作為程序執行的起點/// </summary>public class Pro…

極客大挑戰2019-HTTP

涵蓋知識&#xff1a;UA頭偽造漏洞&#xff1a;全稱&#xff1a;User-Agent 這個部分包含我們所使用的操作系統版本&#xff0c;cpu&#xff0c;瀏覽器類型等。來源偽造漏洞&#xff1a;在http請求頭中會攜帶一個Referer&#xff0c;這個用來表示服務器用戶是從哪個地方來的X-F…

談談ArrayList與Vector的理解?

目錄 擴容機制 ArrayList擴容源碼 Vector擴容源碼 二者區別 擴展&#xff1a;stack(棧&#xff09; 1.創建stack對象 2. 入棧(先進后出&#xff09; 3.出棧 擴展&#xff1a;舉個例子&#xff1a;實現下字符串逆置&#xff0c;利用stack棧來實現。 從接口實現上&#xff…

【Linux庖丁解牛】— 多線程同步 !

1. 什么是線程同步為什么會有線程同步&#xff0c;那一定是有了新問題。互斥可以解決臨界資源被同時訪問的問題&#xff0c;但是純互斥也會帶來新的問題。由于當前被執行的線程離cpu最近【其他線程被阻塞掛起還要被喚醒】&#xff0c;所以&#xff0c;當前進程對于競爭鎖天然就…

基于arduino uno r3主控的環境監測系統設計-1

準備設計arduino uno r3為主控的環境監測系統&#xff0c;通過傳感器采集TVOC&#xff08;總揮發性有機物&#xff09;、HCHO&#xff08;甲醛&#xff09;和eCO2&#xff08;等效二氧化碳&#xff09;數據&#xff0c;并顯示在LCD屏幕上&#xff0c;同時支持數據記錄到SD卡&am…

ITIL 4:云計算與微服務對組織架構的影響

這幾年&#xff0c;很多組織在推進數字化轉型時遇到一個共同的問題&#xff1a;業務節奏越來越快&#xff0c;但內部協作的“架構”卻越來越跟不上節奏。技術架構的變革&#xff0c;必須同步推動組織架構的重塑。特別是隨著云計算和微服務架構的廣泛應用&#xff0c;這種影響愈…

【Android】xml和Java兩種方式實現發送郵件頁面

三三要成為安卓糕手 一&#xff1a;xml中LinearLayout布局參數的使用 1&#xff1a;xml代碼 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http:/…

美林數據用大模型重構電能質量評估,讓隱蔽合規問題無所遁形

在“雙碳”目標驅動下&#xff0c;電網企業正加速推進數字化轉型&#xff0c;電能質量評估作為電力系統安全運行的核心環節&#xff0c;其合規性與效率直接影響著電網智能化水平。然而&#xff0c;傳統人工審核模式已難以應對海量報告與復雜標準——單份報告需20-30人天核對、關…

前端基礎 JS Vue3 Ajax

一、JSalert( .... ) //彈出框console.log( ....... ) //輸出到控制臺瀏覽器JS引入方式&#xff1a;1、內部腳本&#xff1a;將JS代碼定義在HTML頁面中位于<script></script>標簽之間2、外部腳本&#xff1a;將JS代碼寫在外部JS文件中&#xff0c;在HTML頁面中使用…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘notebook’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘notebook’問題 一、摘要 在使用 PyCharm 進行 Python 開發時&#xff0c;常常需要通過 pip install 安裝第三方包。但有時即便已經安裝成功&#xff0c;運行代…

一、Vue概述以及快速入門

什么是VueVue的快速入門代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Vue快速入門</title><script src"js/vue.js"></script> </head> <bod…

模型的存儲、加載和部署

定義損失函數并以此訓練和評估模型 存儲模型可以只存儲state_dict或模型參數&#xff0c;每當需要部署經過訓練的模型時&#xff0c;創建模型的對象并從文件中加載參數&#xff0c;這是 Pytorch 創建者推薦的方法。 目錄 模型的存儲、加載 模型的部署 模型的存儲、加載 承接…

Java學習第七十部分——微服務架構

目錄 一、前言提要 二、核心優勢 三、核心技術棧 四、構建步驟 五、困難挑戰 六、總結歸納 一、前言提要 Java 微服務架構是一種使用 Java 技術棧構建分布式系統的方法論&#xff0c;它將單一的大型應用程序分解為一組小型、獨立、松耦合、可獨立部署和擴展的服務。每個服…

六邊形滾動機器人cad【7張】三維圖+設計書明說

摘 要 機械制造業是國家的重要產業,隨著時代的發展,智能化越來越在生活中變得普遍,工業的發展深深的影響著一個國家的經濟發展。全球經濟的發展帶領著機械工業在不斷的進步。隨著國外先進技術在我國的傳播,也影響著我國技術的發展,在全球經濟的大環境的推動下,大型四邊形…

人形機器人加快先進AI機器人開發

物理AI的新時代通用人形機器人專為快速適應現有的以人類為中心的城市和工業工作空間而構建&#xff0c;用以承擔枯燥、重復性或對體力要求高的工作任務。這些機器人正在從工廠車間走向醫療健康機構&#xff0c;通過自動化幫助人類工作&#xff0c;緩解勞動力短缺問題。但是&…

AI 驅動開發效能躍升:企業級智能開發全流程優化方案?

企業軟件開發正面臨 “三高困境”&#xff1a;需求變更頻率高、人力成本占比高、線上故障風險高。破解這些難題的核心在于構建 AI 驅動的全流程智能開發體系&#xff0c;通過系統化效能優化實現開發能力升級。? 需求分析作為開發起點&#xff0c;常因理解偏差導致后期返工。A…

時序數據庫 TDengine × Ontop:三步構建你的時序知識圖譜

在做設備預測性維護或能源管理分析時&#xff0c;你是否也曾思考過&#xff1a;如何才能讓機器“理解”我們收集的大量時序數據&#xff1f;工業現場的數據是結構化的&#xff0c;而語義分析、知識推理卻往往需要 RDF 等圖譜格式。換句話說&#xff0c;“會說話”的數據更聰明&…

Android啟動圖不拉伸且寬占滿屏幕

Android啟動圖不拉伸且寬占滿屏幕 一般啟動圖的做法&#xff1a; start_app_bg.xml <?xml version"1.0" encoding"utf-8"?> <layer-list xmlns:android"http://schemas.android.com/apk/res/android"><item><shape>&l…

rust-方法語法

方法語法 方法類似于函數&#xff1a;我們用 fn 關鍵字和一個名稱來聲明它們&#xff0c;它們可以有參數和返回值&#xff0c;并且包含一些在從其他地方調用該方法時運行的代碼。與函數不同&#xff0c;方法是在結構體&#xff08;或枚舉、trait 對象&#xff0c;分別在第6章和…