Word模板内容替换
需求介绍
需要对Word文档中的内容做动态替换,其中包括图片、特殊符号,字符串,并且要求样式一直
解决思路
本方案采用spire.doc.free替换word书签的方式,word添加书签
- 将需要替换的内容加上书签
替换结果
引入依赖
<!-- word文档替换依赖 -->
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc.free</artifactId>
<version>3.9.0</version>
</dependency>
如果使用的是自己的私库,请在pom文件添加下面仓库地址
<!-- DOC依赖的仓库 -->
<repositories>
<repository>
<id>com.e-iceblue</id>
<url>http://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
创建Word文档的工具类
下面就是Word文档替换书签的工具类WordDocument.class
package com.cloud.office.service;
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.Section;
import com.spire.doc.documents.BookmarksNavigator;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.documents.TextBodyPart;
import com.spire.doc.fields.TextRange;
import org.apache.commons.lang.StringUtils;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* <p>
* word文档
* </p>
*
* @author Administrator
*/
public class WordDocument {
/**
* word
*/
private Document doc = new Document();
/**
* 书签
*/
private BookmarksNavigator bookmarkNavigator;
/**
* 字体大小
*/
public static float FONTSZIE6 = 6.5f;
/**
* 字体大小
*/
public static float FONTSZIE10 = 10.5f;
/**
* 字体大小
*/
public static float FONTSZIE12 = 12f;
/**
* 构造函数
*
* @param filePath 路径
*/
public WordDocument(String filePath) {
this.doc.loadFromFile(filePath);
bookmarkNavigator = new BookmarksNavigator(doc);
}
/**
* 替换word的文本内容
*
* @param bookSign 书签
* @param replaceText 替换内容
*/
public WordDocument replaceWordText(@NotBlank String bookSign, String replaceText) {
return replaceWordText(bookSign, replaceText, false);
}
/**
* 替换word的文本内容
*
* @param bookSign 书签
* @param replaceText 替换内容
* @param saveFormatting 是否保存格式
*/
public WordDocument replaceWordText(@NotBlank String bookSign, String replaceText, boolean saveFormatting) {
if (StringUtils.isBlank(bookSign)) {
return this;
}
if (StringUtils.isBlank(replaceText)) {
return this;
}
//定位书签
bookmarkNavigator.moveToBookmark(bookSign);
//用新的内容替换上下文
bookmarkNavigator.replaceBookmarkContent(replaceText, saveFormatting);
return this;
}
/**
* 替换word的图片
*
* @param bookSign 书签
* @param imagePath 替换内容
*/
public WordDocument replaceWordImage(@NotBlank String bookSign, @NotNull String imagePath) {
if (StringUtils.isBlank(bookSign)) {
return this;
}
if (StringUtils.isBlank(imagePath)) {
return this;
}
//添加图片,替换原有书签内容
bookmarkNavigator.moveToBookmark(bookSign);
Paragraph para = new Paragraph(doc);
para.appendPicture(imagePath);
TextBodyPart bodyPart = new TextBodyPart(doc);
bodyPart.getBodyItems().add(para);
bookmarkNavigator.replaceBookmarkContent(bodyPart);
return this;
}
/**
* 替换word的特殊符号
*
* @param bookSign 书签
* @param fontSzie 字体大小
*/
public WordDocument replaceWordCheck(@NotBlank String bookSign, float fontSzie) {
if (StringUtils.isBlank(bookSign)) {
return this;
}
bookmarkNavigator.moveToBookmark(bookSign);
// 样式 "\uF052 \uF0FE" ✓
Section sec = doc.addSection();
//在这个section上添加一个段落
Paragraph para = sec.addParagraph();
// para.appendText("这是一个打勾的复选框:");
//在段落之后追加一个打勾的复选框,这个符号的十六进制是"\u0052",
//也可以用十进制(char)82).ToString()来表示它。 打勾的复选框
TextRange textRange = para.appendText(String.valueOf(((char) 82)));
//设置字体,可以在word中查看对应的符号是什么字体,这里打勾的复选框是Wingdings2字体
textRange.getCharacterFormat().setFontName("Wingdings 2");
textRange.getCharacterFormat().setFontSize(fontSzie);
TextBodyPart bodyPart = new TextBodyPart(doc);
bodyPart.getBodyItems().add(para);
bookmarkNavigator.replaceBookmarkContent(bodyPart, false, false);
doc.getSections().remove(sec);
return this;
}
/**
* 替换word的图片
*
* @param filePath 保存路径
*/
public void saveToFile(@NotBlank String filePath) {
this.doc.saveToFile(filePath, FileFormat.Docx);
}
}
查看word文档特殊符号对应的字符代码
字符代码查看步骤
插入–>符号–>其他符号–>选择字体(Wingdings 2)–>选择自己的特殊符号–>字符代码
选择字体(Wingdings 2),选择自己特殊符号所在的字体,如图:
更多支持在官网e-iceblue-doc官网