教你如何用Java替換Word中帶有${}的內(nèi)容
一、概述
1、因?yàn)橛行┬枨螅枰褀ord文檔里面的特定數(shù)據(jù),設(shè)置成可變的;所以需要某種方式,把可變量用標(biāo)簽(如${變量名})替換,通過(guò)后端賦值此變量名,重新生成的Word就能根據(jù)后端設(shè)置的內(nèi)容變化。
2、替換方法:準(zhǔn)備一份word模板文檔,如:word_mode.doc(或 word_mode.docx) 文件,把可變內(nèi)容,用標(biāo)簽${變量名}替換(如圖1姓名:${name})

3、轉(zhuǎn)成可讀模板:全部設(shè)置完變量標(biāo)簽后,對(duì)此word文檔進(jìn)行另存為xml格式的文檔(圖2),保存后的文件名:word_mode.xml(即用戶信息.xml)。再通過(guò)修改后綴名,最終生成模板(用于替換標(biāo)簽的):word_mode.ftl

4、word_mode.ftl文件中,生成的標(biāo)簽名可能被樣式隔開(kāi),需要手工處理下,如圖3(處理前),圖4(處理后)

5、對(duì)于生成的ftl文件,使用Notepad++進(jìn)行xml格式化下,有利于處理EL表達(dá)式標(biāo)簽分開(kāi)的問(wèn)題。如果有圖片的話,格式化后,無(wú)法正常顯示,可以看看圖片的BASE64碼最后面與標(biāo)簽是否隔開(kāi),如果是可去掉空格。
如果還不行的話,找格式化之前的BASE64內(nèi)容替換格式化后的圖片BASE64的內(nèi)容,這應(yīng)該就沒(méi)有問(wèn)題。

二、處理含List的內(nèi)容
2.1概述
有多個(gè)用戶信息,需要顯示出來(lái),如圖所示,word文檔處理可變內(nèi)容。

2.2處理方式
因?yàn)榈谝恍惺亲侄握f(shuō)明不可變,第二行是可變參數(shù),根據(jù)List的多少而改變的,可在word_mode.ftl中添加<#list></#list>標(biāo)簽,如圖5(開(kāi)頭),圖6(結(jié)尾)

三、程序處理
3.1引入pom.xml
<!-- 導(dǎo)出word文檔 --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency>
3.2實(shí)體bean:UserBean
public class UserBean {
private String username;
private String userAge;
private String userHigh;
private String userSex;
public UserBean(String username, String userAge, String userHigh, String userSex) {
this.username = username;
this.userAge = userAge;
this.userHigh = userHigh;
this.userSex = userSex;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserAge() {
return userAge;
}
public void setUserAge(String userAge) {
this.userAge = userAge;
}
public String getUserHigh() {
return userHigh;
}
public void setUserHigh(String userHigh) {
this.userHigh = userHigh;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
}
3.3替換工具類:WordUtils
package com.jtr.hutool.main;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jtr.hutool.bean.UserBean;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.Version;
public class WordUtils {
/** 設(shè)置使用的編碼格式 */
private static final String CHARSET = "UTF-8";
/** 設(shè)置使用的版本 */
private static final String VERSION = "2.3.0";
public static void main(String[] args) {
downloadWord("C:\\Users\\Think\\Desktop\\temp\\", "word_mode.ftl");
}
public static void downloadWord(String wordModePath, String wordModeFile) {
try {
// 1. 獲取替換參數(shù)
Map<String, Object> wordData = initWordMap();
// 2. 設(shè)置配置內(nèi)容
// 設(shè)置版本
Configuration configuration = new Configuration(new Version(VERSION));
// 指定加載Word模板的路徑
configuration.setDirectoryForTemplateLoading(new File(wordModePath));
// 以UTF-8的編碼格式,讀取模板文檔
Template template = configuration.getTemplate(wordModeFile, CHARSET);
// 3. 輸出文檔路徑及名稱
File outFile = new File(wordModePath + wordData.get("username") + "_員工信息.doc");
Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), CHARSET), 10240);
// 輸出
template.process(wordData, writer);
writer.flush();
writer.close();
System.out.println("員工信息導(dǎo)出已完成");
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static Map<String, Object> initWordMap() {
List<UserBean> userList = new ArrayList<UserBean>();
userList.add(new UserBean("用戶1", "10", "171", "男"));
userList.add(new UserBean("用戶2", "20", "172", "女"));
userList.add(new UserBean("用戶3", "30", "173", "男"));
userList.add(new UserBean("用戶4", "40", "174", "女"));
userList.add(new UserBean("用戶3", "50", "175", "男"));
Map<String, Object> wordData = new HashMap<String, Object>();
wordData.put("name", "作者1");
wordData.put("age", "60");
wordData.put("high", "177");
wordData.put("userList", userList);
return wordData;
}
到此這篇關(guān)于教你如何用Java替換Word中帶有${}的內(nèi)容的文章就介紹到這了,更多相關(guān)java替換Word中帶有${}的內(nèi)容內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
帶你了解mybatis如何實(shí)現(xiàn)讀寫(xiě)分離
本篇文章主要介紹了MyBatis實(shí)現(xiàn)數(shù)據(jù)讀寫(xiě)分離的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來(lái)幫助2021-08-08
使用Thrift實(shí)現(xiàn)跨語(yǔ)言RPC的調(diào)用
Thrift最大的優(yōu)勢(shì)就是可以實(shí)現(xiàn)跨語(yǔ)言RPC調(diào)用,尤其在一些大廠,微服務(wù)各模塊之間使用不同的語(yǔ)言是很常見(jiàn)的,本文就將使用java作為服務(wù)端,用python作為客戶端,實(shí)現(xiàn)不同語(yǔ)言之間的RPC調(diào)用,需要的可以參考下2023-10-10
分享幾個(gè)寫(xiě)簡(jiǎn)潔java代碼的小技巧
成為一個(gè)優(yōu)秀的Java程序員,有著良好的代碼編寫(xiě)習(xí)慣是必不可少的,下面這篇文章主要給大家介紹了關(guān)于寫(xiě)java代碼的小技巧,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
帶大家認(rèn)識(shí)Java語(yǔ)法之泛型與通配符
使用泛型的目的是利用Java編譯機(jī)制,在編譯過(guò)程中幫我們檢測(cè)代碼中不規(guī)范的有可能導(dǎo)致程序錯(cuò)誤的代碼,下面這篇文章主要給大家介紹了關(guān)于Java泛型與通配符的相關(guān)資料,需要的朋友可以參考下2022-03-03
Java根據(jù)正整數(shù)的位數(shù)并逆序打印出各位數(shù)字
給一個(gè)不多于5位的正整數(shù),要求:一、求它是幾位數(shù),二、逆序打印出各位數(shù)字,需要的朋友可以參考下2017-02-02
深入探究一下Java中不同的線程間數(shù)據(jù)通信方式
這篇文章主要來(lái)和大家一起深入探究一下Java中不同的線程間數(shù)據(jù)通信方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-04-04
Spring Boot集成Spring Cloud Eureka進(jìn)行服務(wù)治理的方法
本文通過(guò)詳細(xì)的步驟和代碼示例,介紹了如何在Spring Boot中集成Spring Cloud Eureka進(jìn)行服務(wù)治理,通過(guò)這種方式,可以有效地管理和維護(hù)微服務(wù)架構(gòu)中的服務(wù),感興趣的朋友跟隨小編一起看看吧2024-11-11

