import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.xmlbeans.XmlCursor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import java.io.*;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
@Slf4j
public class PoiWordUtil {
/**
* 添加标题和表格
*
* @param key 需要替换的key
* @param document 文档
* @param tableTreeMap TreeMap<标题, List<List<内容>>>
* @param titleStyle 标题格式
* @param tableStyle 内容格式
*/
public static void addTitleTable(String key, XWPFDocument document, TreeMap<String, List<List<String>>> tableTreeMap, FontStyle titleStyle, FontStyle tableStyle) {
log.info("tableTreeMap:{}", JSONUtilPlus.parseToString(tableTreeMap));
List<String> tableKeyList = new ArrayList<>(tableTreeMap.keySet());
CollectionUtilPlus.reverse(tableKeyList);
List<XWPFParagraph> paragraphList = document.getParagraphs();
if (paragraphList != null && paragraphList.size() > 0) {
for (int l = 0; l < paragraphList.size(); l++) {
XWPFParagraph paragraph = paragraphList.get(l);
List<XWPFRun> runs = paragraph.getRuns();
for (int i = 0; i < runs.size(); i++) {
// String text = runs.get(i).getText(0).trim();
String text = null;
if (runs.get(i) != null && StringUtilPlus.isNotBlank(runs.get(i).getText(0))) {
text = runs.get(i).getText(0).trim();
}
if (text != null) {
if (text.indexOf(key) >= 0) {
runs.get(i).setText(text.replace(key, ""), 0);
// 在指定游标位置插入表格
for (String name : tableKeyList) {
//填文字
XmlCursor cursor111 = paragraph.getCTP().newCursor();
XWPFParagraph xwpfParagraph = document.insertNewParagraph(cursor111);
XWPFRun run = xwpfParagraph.createRun();
run.addCarriageReturn();
run.setText(name);
addRunStyle(run, titleStyle);
//填表格
XmlCursor cursor = paragraph.getCTP().newCursor();
XWPFTable table = document.insertNewTbl(cursor);
CTTblPr tablePr = table.getCTTbl().getTblPr();
CTTblWidth width = tablePr.addNewTblW();
width.setW(BigInteger.valueOf(8500));
List<List<String>> listListString = tableTreeMap.get(name);
insertInfo(table, listListString, tableStyle);
}
break;
}
}
}
}
}
}
/**
* 添加格式
*
* @param run run
* @param titleStyle 样式
*/
private static void addRunStyle(XWPFRun run, FontStyle titleStyle) {
if (titleStyle.getFontFamily() != null) {
run.setFontFamily(titleStyle.getFontFamily().getValue());
}
if (titleStyle.getFontSize() != null) {
run.setFontSize(titleStyle.getFontSize());
}
}
/**
* 添加表格
*
* @param table 表格
* @param listListString 数据
* @param tableStyle 样式
*/
private static void insertInfo(XWPFTable table, List<List<String>> listListString, FontStyle tableStyle) {
if (listListString.size() < 1) {
return;
}
//创建表
XWPFTable tab = table;
tab.setWidthType(TableWidthType.PCT);
for (int i = 0; i < listListString.size(); i++) {
List<String> lieList = listListString.get(i);
XWPFTableRow row;
if (i == 0) {
row = tab.getRow(0);
} else {
row = tab.createRow();
}
for (int j = 0; j < lieList.size(); j++) {
//只有第一列需要加列,且第一列的第一个是存在的
if (!((i == 0 && j == 0) || i > 0)) {
row.addNewTableCell();
}
XWPFTableCell cell = row.getCell(j);
CTP ctP = (cell.getCTTc().sizeOfPArray() == 0) ? cell.getCTTc().addNewP() : cell.getCTTc().getPArray(0);
XWPFParagraph p = cell.getParagraph(ctP);
XWPFRun headRun0 = p.createRun();
headRun0.setText(lieList.get(j));
//水平居中
p.setAlignment(ParagraphAlignment.CENTER);
//字体样式
addRunStyle(headRun0, tableStyle);
CTTc cttc = cell.getCTTc();
CTTcPr ctPr = cttc.addNewTcPr();
ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
}
}
mergeCellsVertically(tab, 0, 1, listListString.size() - 1);
}
/**
* 跨行合并
* table要合并单元格的表格
* col要合并哪一列的单元格
* fromRow从哪一行开始合并单元格
* toRow合并到哪一个行
*/
public static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
if (rowIndex == fromRow) {
// The first merged cell is set with RESTART merge value
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
} else {
// Cells which join (merge) the first one, are set with CONTINUE
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
}
// cell.setText("测试");
//将单元格中的数据上下左右居中
CTTc cttc = cell.getCTTc();
CTTcPr ctPr = cttc.addNewTcPr();
ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
XWPFParagraph cellParagraph = cell.getParagraphArray(0);
cellParagraph.setVerticalAlignment(TextAlignment.CENTER);
}
}
public static void main(String[] args) throws IOException {
List<List<String>> listListString1 = new ArrayList<>();
List<String> strings = CollectionUtilPlus.asList("姓名", "序号", "省份", "分数", "评估方式");
List<String> strings1 = CollectionUtilPlus.asList("一眼真", "1", "妈妈省", "100", "唱");
List<String> strings2 = CollectionUtilPlus.asList("丁假", "2", "妈妈省", "100", "跳");
List<String> strings3 = CollectionUtilPlus.asList("蔡怅眺", "3", "妈妈省", "100", "rap");
List<String> strings4 = CollectionUtilPlus.asList("肖黑子", "4", "妈妈省", "98", "篮球");
listListString1.add(strings);
listListString1.add(strings1);
listListString1.add(strings2);
listListString1.add(strings3);
listListString1.add(strings4);
TreeMap<String, List<List<String>>> tableTreeMap = new TreeMap<>();
tableTreeMap.put("韩专家", listListString1);
tableTreeMap.put("陈专家", listListString1);
tableTreeMap.put("郝专家", listListString1);
tableTreeMap.put("爱新觉罗专家", listListString1);
InputStream is = new FileInputStream("D:\\测试.docx");
XWPFDocument doc = new XWPFDocument(is);
FontStyle fontStyle = new FontStyle();
fontStyle.setFontFamily(FontFamily.FANG_SONG);
fontStyle.setFontSize(16);
/**
* 此处在word中的某处输入与key相同的字符串
*/
addTitleTable("请在word中输入您想替换的文字", doc, tableTreeMap, fontStyle, fontStyle);
FileOutputStream out = new FileOutputStream(new File("D:\\替换1.docx"));
doc.write(out);
out.flush();
out.close();
}
}
加plus的去掉就可以了,然后在word中加入自己想替换的文字