说明:公司用的是poi-tl替换的,参考地址:Poi-tl Documentation
主要的类是XWPFTemplate
我本地用的是poi,主要的类是XWPFDocument
package com.nanjing.cmsservice.controller;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* 通过word模板生成新的word工具类
* @author yimo
* @version 1.0
* @date 2022/10/9 14:56
*/
public class WordUtil {
/*如果遇到poi读取例如{name}不能识别为一个整体,可以使用word的域操作,
如果不太清楚域的使用,可以这么操作,先在text文档中写好,例如{name},
然后再整个复制到word中,不要一个一个在word中敲,不然有可能不会被poi识别为一个整体
作者:TryCatch菌
链接:https://www.jianshu.com/p/6603b1ea3ad1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如果想要把${title}作为一个整体,也是同样的做法,下面代码的判断要改成String key = "${"+textSet.getKey()+"}";
*/
/**
* 根据模板生成新word文档
* 判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入
* @param textMap 需要替换的信息集合
* @return 成功返回true,失败返回false
*/
public static void changWord(InputStream inputStream, Map<String, String> textMap,int height,int width) {
InputStream in = null;
try {
//1.获取word文档解析对象
XWPFDocument document = new XWPFDocument(inputStream);
//解析替换文本段落对象
WordUtil.changeText(document, textMap);
//解析替换表格对象
WordUtil.changeTable(document, textMap);
//替换文本中的图片
WordUtil.changePicture(document,textMap,height,width);
//将文档转为输入流
/*ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write("D:\\a.docx".getBytes());
//文档写入流
document.write(baos);*/
//上面代码有问题,用下面这个
//5.生成新的word
FileOutputStream outputStream = new FileOutputStream("D:\\a.docx");
document.write(outputStream);
outputStream.flush();
outputStream.close();
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 替换段落文本
* @param document docx解析对象
* @param textMap 需要替换的信息集合
*/