java根據Word模板實現動態填充導出

最近項目中需要導出Word,根據不同的信息導出不同的內容,包含文本、列表、圖片等,本文使用poi-tl實現在次做以記錄。

  • 添加依賴
<!-- word導出 -->
<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.7.3</version>
</dependency>
<!--  上面需要的依賴-->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version>
</dependency>

如果項目功能簡單只是使用Word導出功能,只添加poi-tl包就可以,我這里添加的包多是因為還有其他功能,相互之間有影響,升級的話又牽扯太多,所以你懂的~

  • 制作模板

文本標簽:使用{{屬性名}}做處理
圖片

列表集合:列表中集合使用{{集合名}},列表屬性用[屬性名]處理
圖片

圖片列表:集合處理方式都一樣{{集合名}},圖片屬性增加@[@屬性名]
圖片

  • 編寫代碼

數據構建

/*** 填充數據源* 其中data存放的key值與模板中的文本域值相對應*/
public static Map<String, Object> newData() {Map<String, Object> data = new HashMap<String, Object>();//key要與模板中的別名一一對應data.put("custNo", "bb2");data.put("custCnName", "特特我");data.put("productCategory", "官方的");data.put("orgKey", "4433");data.put("riskLevel", "1001");List<Map<String,Object>> list = new ArrayList<>();Map<String,Object> job ;int num = 1;while (num<3){job = new HashMap<>();job.put("id",num);job.put("reviewStatusName","aaa");job.put("reviewAdvice","bbb");job.put("controlWay","ccc");job.put("reviewUser","ddd");job.put("reviewDate",LocalDateTime.now());job.put("fileName","zipfile.zip");list.add(job);num++;}data.put("approvals", list);List<Map<String,Object>> maps1 = new ArrayList<>();for (int i = 1; i <= 5; i++) {Map<String,Object> m = new HashMap<>();if(i%2==0){// 讀取本地磁盤圖片m.put("pho", new PictureRenderData(50, 50, "D:\\timg.jpg"));}else {// 讀取本地磁盤圖片m.put("pho", new PictureRenderData(30, 30, "D:\\bug2.png"));}m.put("date",LocalDateTime.now());m.put("text", "共" + 5 + "張圖片,當前為第" + (i) + "張");maps1.add(m);}data.put("imgCollection", maps1);data.put("img", new PictureRenderData(100, 100, "D:\\需求1.png"));return data;
}

數據處理

public static void main(String[] args) {try {String filePath = "G:\\產品詳情.docx";//模板路徑Map<String,Object> pdfMap = newData();log.info("響應信息:{}",pdfMap);String custCnName = pdfMap.get("custCnName")+"";String stt = "download" + File.separator + "產品詳情頁.docx";log.info("--------------{}----{}--------" , File.separator + "產品詳情頁.docx",stt);InputStream inputStream = new FileInputStream(filePath);String fileName = custCnName + "-產品風險查詢詳情";HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();Configure config = Configure.newBuilder().bind("approvals", policy).bind("imgCollection",policy).build();XWPFTemplate template = XWPFTemplate.compile(inputStream, config).render(pdfMap);String url = "G:\\"+fileName + ".docx";File file = new File(url);file.createNewFile();template.write(new FileOutputStream(file));template.close();} catch (Exception e) {log.error("導出異常:{}",e);}
}
  • 導出樣例
    ☆ 文本
    圖片

    ☆ 列表
    圖片

    ☆ 圖片
    圖片
    參考:文章 FC464782123

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

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

相關文章

mindie推理大語言模型問題及解決方法匯總

問題說明 使用功能mindie 1.0 RC2推理大語言模型&#xff0c;遇到不少問題&#xff0c;記錄下解決思路。 我的硬件是910B4。 問題及解決 問題1 在docker內啟動mindie時終端報錯 Fatal Python error: PyThreadState_Get: the function must be called with the GIL held, …

Selenium 全面指南

Selenium 是一個強大的 Web 自動化工具&#xff0c;支持多種瀏覽器和語言綁定。 1. Selenium 的基本概念 WebDriver&#xff1a;Selenium 提供的核心接口&#xff0c;用于控制瀏覽器操作。顯式等待&#xff1a;等待特定條件滿足后再執行操作。隱式等待&#xff1a;全局設置一個…

Go框架比較:goframe、beego、iris和gin

由于工作需要&#xff0c;這些年來也接觸了不少的開發框架&#xff0c;Golang的開發框架比較多&#xff0c;不過基本都是Web"框架"為主。這里稍微打了個引號&#xff0c;因為大部分"框架"從設計和功能定位上來講&#xff0c;充其量都只能算是一個組件&…

【華為OD-E卷-木板 100分(python、java、c++、js、c)】

【華為OD-E卷-木板 100分&#xff08;python、java、c、js、c&#xff09;】 題目 小明有 n 塊木板&#xff0c;第 i ( 1 ≤ i ≤ n ) 塊木板長度為 ai。 小明買了一塊長度為 m 的木料&#xff0c;這塊木料可以切割成任意塊&#xff0c;拼接到已有的木板上&#xff0c;用來加…

sqlserver臨時表來做表聯查復雜查詢

使用臨時表&#xff0c;先查詢出結果&#xff0c;在用于后面表的子查詢或者聯查 -- 刪除表1if EXISTS ( SELECT 1 FROM tempdb.sys.objects where name like #temp_PublishRecord% ) beginDROP TABLE #temp_PublishRecordprint 已刪除臨時表 #temp_PublishRecordend--創…

OMG DDS 規范漫談:分布式數據交互的演進之路

一、由來與起源脈絡 OMG DDS&#xff08;Object Management Group Data Distribution Service&#xff09;的發展是計算機科學和技術進步的一個縮影&#xff0c;它反映了對高效、可靠的數據共享需求的響應。DDS 的概念萌生于20世紀90年代末&#xff0c;當時分布式計算已經從理…

1.使用 Couchbase 數倉和 Temporal(一個分布式任務調度和編排框架)實現每 5 分鐘的增量任務

在使用 Couchbase 數倉和 Temporal&#xff08;一個分布式任務調度和編排框架&#xff09;實現每 5 分鐘的增量任務時&#xff0c;可以按照以下步驟實現&#xff0c;同時需要注意關鍵點。 實現方案 1. 數據層設計&#xff08;Couchbase 增量存儲與標記&#xff09; 在 Couchb…

Spring源碼分析之AOP-@EnableAspectJAutoProxy

前言 這篇文章之前我們說了Springboot的啟動流程,Bean對象怎么實現從無到有的一個過程還有一些接口的拓展的實現等等那么從這一篇文章開始的話我們就會開始說一說我們的常用的AOP它的底層實現原理所以大家一起加油加油&#xff01;&#xff01;&#xff01; AOP: 1.簡介: AOP的…

Linux(Centos 7.6)基本信息查看

1.服務器硬件信息查看 1.1.服務器廠商、產品名稱查看 dmidecode -s system-manufacturer&#xff1a;查看服務器廠商信息 dmidecode -s system-product-name&#xff1a;查看服務器產品名稱信息 1.Windows使用VMware安裝的Linux(Centos 7.6)后&#xff0c;服務器廠商、產品名…

多個圖片轉換為PDF文件

將多個圖片轉換為PDF文件在Python中可以通過多個庫來實現&#xff0c;其中最常用的庫之一是Pillow&#xff08;用于圖像處理&#xff09;和reportlab&#xff08;用于生成PDF&#xff09;。不過&#xff0c;對于直接圖片轉PDF的操作&#xff0c;更推薦使用Pillow配合PyMuPDF&am…

小程序app封裝公用頂部篩選區uv-drop-down

參考ui:DropDown 下拉篩選 | 我的資料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生態框架 樣式示例&#xff1a; 封裝公用文件代碼 dropDownTemplete <template><!-- 頂部下拉篩選區封裝公用組件 --><view><uv-drop-down ref&…

LeetCode:101. 對稱二叉樹

跟著carl學算法&#xff0c;本系列博客僅做個人記錄&#xff0c;建議大家都去看carl本人的博客&#xff0c;寫的真的很好的&#xff01; 代碼隨想錄 LeetCode&#xff1a;101. 對稱二叉樹 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 示例 1&#xff1a; 輸…

Docker-如何啟動docker

作者介紹&#xff1a;簡歷上沒有一個精通的運維工程師。希望大家多多關注作者&#xff0c;下面的思維導圖也是預計更新的內容和當前進度(不定時更新)。 我們在上一章&#xff0c;講了虛擬化&#xff0c;虛擬化是把硬件虛擬化&#xff0c;然后創建出來的虛擬機完全隔離&#xff…

COMSOL with Matlab

文章目錄 基本介紹COMSOL with MatlabCOMSOL主Matlab輔Matlab為主Comsol為輔 操作步驟常用指令mphopenmphgeommghmeshmphmeshstatsmphnavigatormphplot常用指令mphsavemphlaunchModelUtil.clear 實例教學自動另存新檔**把語法套用到邊界條件**把語法套用到另存新檔 函數及其微分…

游戲關卡設計方法的雜感

1、正規思路是&#xff1a;先寫設計文檔&#xff0c;畫平面圖&#xff0c;再做白模關卡&#xff0c;再做正規模型的關卡。 一步步擴大。 當然是有道理的&#xff0c;從小到大&#xff0c; 但實際上這需要很強的想象力&#xff0c;很多細節靠腦補&#xff0c;初學者很難做好。…

JVM系列(十二) -常用調優命令匯總

最近對 JVM 技術知識進行了重新整理&#xff0c;再次獻上 JVM系列文章合集索引&#xff0c;感興趣的小伙伴可以直接點擊如下地址快速閱讀。 JVM系列(一) -什么是虛擬機JVM系列(二) -類的加載過程JVM系列(三) -內存布局詳解JVM系列(四) -對象的創建過程JVM系列(五) -對象的內存分…

bmp390l傳感器的IIC命令通信(學習匯總)

參考鏈接&#xff1a; BMP390高精度壓力傳感器數據讀取與處理&#xff08;基于STM32&#xff09;-CSDN博客 https://blog.csdn.net/qq_43862401/article/details/106502397 利用usb轉iic模塊測試bmp390l傳感器采集當前環境的溫度和氣壓數據&#xff0c;下圖中reserved表示…

C/C++基礎知識復習(43)

1) 什么是運算符重載&#xff1f;如何在 C 中進行運算符重載&#xff1f; 運算符重載是指在 C 中為現有的運算符定義新的行為&#xff0c;使得它們能夠用于用戶定義的數據類型&#xff08;如類或結構體&#xff09;。通過運算符重載&#xff0c;可以讓自定義類型像內置數據類型…

Windows11 家庭版安裝配置 Docker

1. 安裝WSL WSL 是什么&#xff1a; WSL 是一個在 Windows 上運行 Linux 環境的輕量級工具&#xff0c;它可以讓用戶在 Windows 系統中運行 Linux 工具和應用程序。Docker 為什么需要 WSL&#xff1a; Docker 依賴 Linux 內核功能&#xff0c;WSL 2 提供了一個高性能、輕量級的…

2025系統架構師(一考就過):案例題之一:嵌入式架構、大數據架構、ISA

一、嵌入式系統架構 軟件脆弱性是軟件中存在的弱點(或缺陷)&#xff0c;利用它可以危害系統安全策略&#xff0c;導致信息丟失、系統價值和可用性降低。嵌入式系統軟件架構通常采用分層架構&#xff0c;它可以將問題分解為一系列相對獨立的子問題&#xff0c;局部化在每一層中…