适用于有word模版,然后word里面进行字符串替换

工具类
BokeWordUtils
package com.ruoyi.web.controller.tool;
import com.ruoyi.common.utils.StringUtils;
import org.apache.poi.ooxml.POIXMLDocument;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.RoundingMode;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.NumberFormat;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class BokeWordUtils {
/**
* 根据模板生成新word文档
* 判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入
*
* @param inputUrl 模板存放地址
* @param file 新文档存放地址
* @param textMap 需要替换的信息集合
*/
public static boolean changWord(String inputUrl, File file, Map<String, String> textMap) {
//模板转换默认成功
boolean changeFlag = true;
try {
//获取docx解析对象
XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(inputUrl));
//解析替换文本段落对象
BokeWordUtils.changeText(document, textMap);
//解析替换表格对象
BokeWordUtils.changeTable(document, textMap, null);
//生成新的word
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream stream = new FileOutputStream(file);
document.write(stream);
stream.close();
System.out.println("成功生成!");
} catch (IOException e) {
e.printStackTrace();
changeFlag = false;
}
return changeFlag;
}
/**
* 替换段落文本
*
* @param document docx解析对象
* @param textMap 需要替换的信息集合
*/
public static void changeText(XWPFDocument document, Map<String, String> textMap) {
//获取段落集合
List<XWPFParagraph> paragraphs = document.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
//判断此段落时候需要进行替换
String text = paragraph.getText();
if (checkText(text)) {
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
//默认:宋体(wps)/等线(office2016) 5号 两端对齐 单倍间距
//run.setText("舜发于畎亩之中, 傅说举于版筑之间, 胶鬲举于鱼盐之中, 管夷吾举于士...");
run.setBold(true);//加粗
run.setCapitalized(false);//我也不知道这个属性做啥的
//runX.setCharacterSpacing(5);//这个属性报错
//run.setColor("BED4F1");//设置颜色--十六进制
run.setDoubleStrikethrough(false);//双删除线
run.setEmbossed(false);//浮雕字体----效果和印记(悬浮阴影)类似
//runX.setFontFamily("宋体");//字体
run.setFontFamily("方正粗黑宋简体", XWPFRun.FontCharRange.cs);//字体,范围----效果不详
run.setFontSize(11);//字体大小
run.setImprinted(false);//印迹(悬浮阴影)---效果和浮雕类似
run.setItalic(false);//斜体(字体倾斜)
//runX.setKerning(1);//字距调整----这个好像没有效果
run.setShadow(false);//阴影---稍微有点效果(阴影不明显)
//runX.setSmallCaps(true);//小型股------效果不清楚
//runX.setStrike(true);//单删除线(废弃)
run.setStrikeThrough(false);//单删除线(新的替换Strike)
//runX.setSubscript(VerticalAlign.SUBSCRIPT);//下标(吧当前这个run变成下标)---枚举
//runX.setTextPosition(20);//设置两行之间的行间距//runX.setUnderline(UnderlinePatterns.DASH_LONG);//各种类型的下划线(枚举)
//runX0.addBreak();//类似换行的操作(html的 br标签)
//runX0.addTab();//tab键