Xdocreport實現根據模板導出word

只使用freemaker生成簡單的word文檔很容易,但是當word文檔需要插入動態圖片,帶循環數據,且含有富文本時解決起來相對比較復雜,但是使用Xdocreport可以輕易解決。
Xdocreport既可以實現文檔填充也可以實現文檔轉換,此處只介紹其文檔填充功能。

步驟:
1.制作模板


以以下文檔為例

?會議內容為一段富文本
我們需要在變量替換的位置通過快捷鍵Ctrl+F9 或 工具欄“插入”->“文檔部件或文本”->“域”

遇到需要循環的位置
在第一列的里

1.在第一個單元格設置域 "@before-row[#list userList as user]"
2.緊接著后面繼續設置域 @after-row[/#list]
3.在1和2兩個域之間設置普通的list里的元素的域

注意:

1.創建一個普通域值后,可以直接復制,但是需要右鍵編輯域修改域的名字.

2.word里有的域值,但是我代碼里直接沒傳,代碼運行就會報錯,代碼給這個域值傳null,運行也會報錯.

3.word里沒有的域值,我代碼里傳了,word僅僅是不會顯示這個值,并不會報錯.

4.測試得知:如果想要在List里一個單元格里填兩個變量,那么你在單元格里創建完一個變量域后,這個單元格的第二個變量域來源必須是復制第一個變量域, 不能自己再新建一個域, 會報錯的.

5.在List里創建完一個單元格里的變量域,再創建第二個單元格里的變量域時,你復制第一個單元格的變量域也好,還是自己再新建一個變量域也好,都可以,都不會報錯.


遇到圖片,先插入一張圖片,再為圖片添加書簽

?這樣模板就制作完成,不需要保存為xml,ftl。直接使用doc或者docx后綴即可


2.代碼實現
引入依賴

  <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.1</version></dependency><dependency><groupId>org.jxls</groupId><artifactId>jxls</artifactId><version>2.6.0</version><exclusions><exclusion><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.jxls</groupId><artifactId>jxls-poi</artifactId><version>1.2.0</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.core</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.document</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.template</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.document.docx</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId><version>2.0.2</version></dependency>

上代碼

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private String xh;private String bumen;private String name;private String age;private ByteArrayImageProvider touxiang;}
@RestController
@RequestMapping("order/")
@Slf4j
public class OneController {@GetMapping("/bb")public void createXdocreport(HttpServletResponse response) throws IOException {InputStream inputStream = null;ServletOutputStream outputStream = response.getOutputStream();try {//讀取模板       inputStream = new FileInputStream("F:\\Desktop\\aa.docx");//注冊xdocreport實例并加載FreeMarker模版引擎IXDocReport report = XDocReportRegistry.getRegistry().loadReport(inputStream, TemplateEngineKind.Freemarker);// 設置特殊字段FieldsMetadata metadata = report.createFieldsMetadata();metadata.addFieldAsTextStyling("content", SyntaxKind.Html);//富文本metadata.addFieldAsImage("touxiang", "user.touxiang", NullImageBehaviour.RemoveImageTemplate);//圖片metadata.addFieldAsImage("xiangzheng","xiangzheng", NullImageBehaviour.RemoveImageTemplate);//圖片report.setFieldsMetadata(metadata);// 創建內容-text為模版中對應都變量名稱String content = "&#x3c;p&#x3e;我在這里放了一段富文本&#x3c;/p&#x3e;" +"&#x3c;p&#x3e;我準備測試富文本的處理&#x3c;/p&#x3e;";content = HtmlUtils.htmlUnescape(content);IContext context = report.createContext();//放普通字段context.put("name", "年終總結大會");context.put("time", "2021年3月26日");//放富文本context.put("content", content);//放list內容,其中包括放入圖片流InputStream p1 = new FileInputStream(new File("F:\\Desktop\\風靈月影.png"));InputStream p2 = new FileInputStream(new File("F:\\Desktop\\孤島5.png"));List<User> users = Arrays.asList(new User("1", "市場部", "張三", "33", new ByteArrayImageProvider(p1)),new User("2", "設計部", "李四", "40", new ByteArrayImageProvider(p2)));context.put("userList", users);//放入單獨的圖片File file = new File("F:\\Desktop\\孤島6.png");FileImageProvider xiangzheng = new FileImageProvider(file);context.put("xiangzheng",xiangzheng);// 生成文件,瀏覽器訪問可以直接下載.response.setCharacterEncoding("utf-8");response.setContentType("application/msword");String fileName = "warning_task.docx";response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));report.process(context, outputStream);} catch (Exception e) {log.info("生成紀要文件發生異常:<{}>", e.getMessage());}finally {if(inputStream != null){inputStream.close();}}}}

?最后瀏覽器下載的結果

完成

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

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

相關文章

VMware Fusion Pro/Player 在 macOS 上的完整安裝與使用指南

VMware Fusion Pro/Player 在 macOS 上的完整安裝與使用指南—目錄 一、VMware 產品說明二、下載 VMware Fusion三、安裝前準備四、安裝 VMware Fusion步驟 1&#xff1a;安裝程序步驟 2&#xff1a;首次啟動配置步驟 3&#xff1a;輸入許可證 五、創建虛擬機步驟 1&#xff1a…

Redis常用數據結構和應用場景

一、前言 Redis提供了多種數據結構&#xff0c;每種結構對應不同的應用場景。本文對部分常用的核心數據結構和典型使用場景作出介紹。 二、String&#xff08;字符串&#xff09; 特點&#xff1a;二進制安全&#xff0c;可存儲文本、數字、序列化對象等。場景&#xff1a; 緩…

spring security oauth2.0的四種模式

OAuth 2.0 定義了 4 種授權模式&#xff08;Grant Type&#xff09;&#xff0c;用于不同場景下的令牌獲取。以下是每種模式的詳細說明、適用場景和對比&#xff1a; 一、授權碼模式&#xff08;Authorization Code Grant&#xff09; 適用場景 ? Web 應用&#xff08;有后端…

Oracle 排除交集數據 MINUS

MINUS 是 Oracle 數據庫中的一種集合操作符&#xff0c;用于返回第一個查詢結果中存在但第二個查詢結果中 不存在 的 唯一行。其核心功能是 排除交集數據&#xff0c;常用于數據差異分析或過濾特定記錄 一、核心功能 排除交集&#xff1a;返回第一個查詢結果中 不在第二個查詢結…

WiFi那些事兒(四)

目錄 一、IEEE 802.11ah標準簡介 二、IEEE 802.11ah信道特點 三、IEEE 802.11ah傳輸模式 在WiFi通信領域&#xff0c;信號繞射能力一直是一個關鍵問題。常規的WiFi設備多工作在2.4GHz和5GHz頻段&#xff0c;這些頻段的電磁波波長通常小于障礙物尺寸&#xff0c;受電磁波本身…

C++在Linux上生成動態庫并調用接口測試

加減乘除demo代碼 項目結構 CPP/ ├── calculator.cpp ├── calculator.h ├── main.cpp 頭文件 #ifndef CALCULATOR_H #define CALCULATOR_H#ifdef __cplusplus extern "C" {#endifdouble add(double a, double b);double subtract(double a, double b…

離線密碼生成器:安全可靠的密碼管理解決方案

離線密碼生成器&#xff1a;安全可靠的密碼管理解決方案 在當今數字時代&#xff0c;我們每天都需要使用各種網站和應用程序&#xff0c;每個賬戶都需要一個強密碼來保護我們的個人信息和隱私。然而&#xff0c;記住多個復雜的密碼幾乎是不可能的任務。今天&#xff0c;我要向…

ChatRex: Taming Multimodal LLM for Joint Perception and Understanding 論文理解和翻譯

一、TL&#xff1b;DR MLLM在感知方面存在不足&#xff08;遠遠比不上專家模型&#xff09;&#xff0c;比如Qwen2-VL在coco上recall只有43.9%提出了ChatRex&#xff0c;旨在從模型設計和數據開發兩個角度來填補這一感知能力的缺口ChatRex通過proposal邊界框輸入到LLM中將其轉…

自動駕駛技術-相機_IMU時空標定

自動駕駛技術-相機_IMU時空標定 時間延遲 時間延遲 參考鏈接1、2 相機主要分為全局和卷簾快門相機&#xff0c;從觸發到成像的過程包括&#xff1a;復位時間、AE()曝光時間、讀出時間 全局快門如下圖所示 卷簾快門如下圖所示 相機錄制視頻時&#xff0c;為了保持固定頻率&am…

Vue3 + Vite + TS,使用 Web Worker,web worker進階 hooks

worker 具體通訊方式 1.由 web page 發送消息- worker.postMessage(發送數據) 2.web worker 接收消息并執行相關邏輯- onmessage (e) > { 接收數據并處理邏輯postMessage(傳遞處理后的數據)} 3.由 web page 監聽 worker 消息&#xff0c;包括&#xff1a;- 處理數據的監聽…

AIDD-人工智能藥物設計-AI 精準預測蛋白質變構位點

Allo-PED: AI 精準預測蛋白質變構位點 目錄 Allo-PED 框架融合蛋白質語言模型與結構特征,顯著提高了變構位點預測的準確性和泛化能力。EcoFoldDB 利用蛋白質結構信息,為宏基因組提供了精確且可擴展的生態功能注釋新方法,顯著提升了對未知微生物功能的認知。上下文分子適配(…

1558 找素數

1558 找素數 ??難度&#xff1a;中等 &#x1f31f;考點&#xff1a;質數 &#x1f4d6; &#x1f4da; import java.util.Scanner; import java.util.Arrays;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int a sc.…

Nacos 提供了哪些服務的保護機制?

當面試官問這個問題時&#xff0c;大家一定要保持頭腦清醒&#xff0c;不要被帶跑偏了&#xff0c;Nacos 本身的核心定位是服務發現和配置管理中心&#xff0c;它并不直接提供像服務熔斷、服務限流、服務降級、請求重試 這類完整的、開箱即用的客戶端/網關級服務保護&#xff0…

【家政平臺開發(38)】解鎖家政平臺國際化密碼:多語言支持開發實戰

> 本【家政平臺開發】專欄聚焦家政平臺從 0 到 1 的全流程打造。從前期需求分析,剖析家政行業現狀、挖掘用戶需求與梳理功能要點,到系統設計階段的架構選型、數據庫構建,再到開發階段各模塊逐一實現。涵蓋移動與 PC 端設計、接口開發及性能優化,測試階段多維度保障平臺質…

DirectX12 - 基本知識 - 圖形驅動的本質

這里是SunshineBooming&#xff0c;GPU公司一枚小小的Driver工程師&#xff0c;主要工作是寫DirectX12 Driver&#xff0c;我會持續更新這個DX12 Spec系列&#xff0c;可能比較冷門&#xff0c;但是都是干貨和工作中的心得體會&#xff0c;有任何GPU相關的問題都可以在評論區互…

selenium元素獲取

from selenium import webdriver from selenium.webdriver.common.by import Bydriver webdriver.Chrome()driver.maximize_window()#最大化窗口 #隱式等待 driver.implicitly_wait(10)#打開網頁 driver.get("https://www.zhipin.com/beijing/?kacity-sites-101010100&q…

生物化學筆記:醫學免疫學原理15 超敏反應過敏反應(I型[蚊蟲叮咬]+II型[新生兒溶血癥、突眼型甲亢]+III型+IV型)

超敏反應 每個人都可能發生的過敏問題&#xff1a;被蚊子咬后起包 I型超敏反應 II型超敏反應 新生兒溶血癥分為Rh血型不合和ABO血型不合兩種情況。Rh血型不合通常從第二胎開始更容易發病&#xff0c;因為母體初次接觸Rh陽性胎兒的紅細胞后會產生抗D抗體&#xff0c;而這個致敏…

【android bluetooth 框架分析 02】【Module詳解 2】【gd_shim_module 模塊介紹】

1. 背景 上一章節 我們介紹了 module_t 的 大體框架 &#xff0c;本節內容我們就選擇 我們的 gd_shim_module 模塊為例子&#xff0c;具體剖析一下&#xff0c;它里面的邏輯。 static const char GD_SHIM_MODULE[] "gd_shim_module";// system/main/shim/shim.cc …

【包管理器】主流包管理器_對比_應用場景

不定期更新&#xff0c;建議關注收藏點贊。 鏈接&#xff1a; npm專題 目錄 主流包管理器簡介對比 主流包管理器簡介 主流的包管理器其實有不少&#xff0c;不同語言和平臺都有各自的一套系統。 前端&#xff08;JavaScript/TypeScript&#xff09; 名稱簡介開發者特點npmNo…

參照Spring Boot后端框架實現序列化工具類

本文參照Jackson實現序列化工具類&#xff0c;旨在于簡化開發 JacksonUtil.class public class JacksonUtil {private JacksonUtil() {}/*** 單例*/private final static ObjectMapper OBJECT_MAPPER;static {OBJECT_MAPPER new ObjectMapper();}private static ObjectMappe…