Apcache-poi对模板处理
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import org.apache.poi.xwpf.usermodel.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WordTemplate {
private XWPFDocument document;
public XWPFDocument getDocument() {
return document;
}
public void setDocument(XWPFDocument document) {
this.document = document;
}
public WordTemplate(InputStream inputStream) throws IOException {
document = new XWPFDocument(inputStream);
}
public void write(OutputStream outputStream) throws IOException {
document.write(outputStream);
}
public void replaceDocument(Map<String, Object> dataMap) {
if (!dataMap.containsKey("parametersMap")) {
System.out.println("数据源错误--数据源(parametersMap)缺失");
return;
}
@SuppressWarnings("unchecked")
Map<String, Object> parametersMap = (Map<String, Object>) dataMap
.get("parametersMap");
List<IBodyElement> bodyElements = document.getBodyElements();
int templateBodySize = bodyElements.size();
int curT = 0;
int curP = 0;
for (int a = 0; a < templateBodySize; a++) {
IBodyElement body = bodyElements.get(a);
if (BodyElementType.TABLE.equals(body.getElementType())) {
XWPFTable table = body.getBody().getTableArray(curT);
List<XWPFTable> tables = body.getBody().getTables();
table = tables.get(curT);
if (table != null) {
List<XWPFTableCell> tableCells = table.getRows().get(1).getTableCells();
String tableText = table.getText();
if (tableText.indexOf("{") > -1) {
String tableType = tableCells.get(0).getText();
String dataSource = tableCells.get(1).getText();
System.out.println("读取到数据源:" + dataSource);
String substring = subStr(tableType,":",".");
if (!dataMap.containsKey(substring)) {
System.out.println("文档中第" + (curT + 1) + "个表格模板数据源缺失");
return;
}
@SuppressWarnings("unchecked")
List<Map<String, Object>> tableDataList = (List<Map<String, Object>>) dataMap
.get(substring);
if ("##{foreachTable}##".equals(tableType)) {
addTableInDocFooter(table, tableDataList, parametersMap, 1, null);
} else if (tableType.contains(substring)) {
addTableInDocFooter(table, tableDataList, parametersMap, 2,substring);
}
} else if (tableText.indexOf("{") > -1) {
addTableInDocFooter(table, null, parametersMap, 3, null);
} else {
addTableInDocFooter(table, null, null, 0, null);
}
curT++;
}
} else if (BodyElementType.PARAGRAPH.equals(body.getElementType())) {
XWPFParagraph ph = body.getBody().getParagraphArray(curP);
if (ph != null) {
addParagraphInDocFooter(ph, null, parametersMap, 0);
curP++;
}
}
}
for (int a = 0; a < templateBodySize; a++) {
document.removeBodyElement(0);
}
}
private static String subStr(String tableType, String s, String string) {
int firstDelimiterIndex = tableType.indexOf(s);
int lastDelimiterIndex = tableType.lastIndexOf(string);
String substring = tableType.substring(firstDelimiterIndex + 1, lastDelimiterIndex);
return substring;
}
public void addTableInDocFooter(XWPFTable templateTable, List<Map<String, Object>> list,
Map<String, Object> parametersMap, int flag, String substring) {
if (flag == 1) {
for (Map<String, Object> map : list) {
List<XWPFTableRow> templateTableRows = templateTable.getRows();
XWPFTable newCreateTable = document.createTable();
for (int i = 1; i < templateTableRows.size(); i++) {
XWPFTableRow newCreateRow = newCreateTable.createRow();
CopyTableRow(newCreateRow, templateTableRows.get(i));
}
newCreateTable.removeRow(0);
document.createParagraph();
replaceTable(newCreateTable, map);
}
} else if (flag == 2) {
XWPFTable newCreateTable = document.createTable();
List<XWPFTableRow> TempTableRows = templateTable.getRows();
int tagRowsIndex = 0;
for (int i = 0, size = TempTableRows.size(); i < size; i++) {
String rowText = TempTableRows.get(i).getCell(0).getText();
if (rowText.indexOf("{") > -1) {
tagRowsIndex = i;
break;
}
}
for (int i = 0; i < tagRowsIndex; i++) {
XWPFTableRow newCreateRow = newCreateTable.createRow();
CopyTableRow(newCreateRow, TempTableRows.get(i));
replaceTableRow(newCreateRow, parametersMap);
}
XWPFTableRow tempRow = TempTableRows.get(tagRowsIndex);
for (int i = 0; i < list.size(); i++) {
XWPFTableRow newCreateRow = newCreateTable.createRow();
CopyTableRow(newCreateRow, tempRow);
replaceTableRow(newCreateRow, list.get(i));
}
for (int i = tagRowsIndex + 2; i < TempTableRows.size(); i++) {
XWPFTableRow newCreateRow = newCreateTable.createRow();
CopyTableRow(newCreateRow, TempTableRows.get(i));
replaceTableRow(newCreateRow, parametersMap);
}
newCreateTable.removeRow(0);
document.createParagraph();
} else if (flag == 3) {
List<XWPFTableRow> templateTableRows = templateTable.getRows();
XWPFTable newCreateTable = document.createTable();
for (int i = 0; i < templateTableRows.size(); i++) {
XWPFTableRow newCreateRow = newCreateTable.createRow();
CopyTableRow(newCreateRow, templateTableRows.get(i));
}
newCreateTable.removeRow(0);
document.createParagraph();
replaceTable(newCreateTable, parametersMap);
} else if (flag == 0) {
List<XWPFTableRow> templateTableRows = templateTable.getRows();
XWPFTable newCreateTable = document.createTable();
for (int i = 0; i < templateTableRows.size(); i++) {
XWPFTableRow newCreateRow = newCreateTable.createRow();
CopyTableRow(newCreateRow, templateTableRows.get(i));
}
newCreateTable.removeRow(0);
document.createParagraph();
}
}
public void addParagraphInDocFooter(XWPFParagraph templateParagraph,
List<Map<String, String>> list, Map<String, Object> parametersMap, int flag) {
if (flag == 0) {
XWPFParagraph createParagraph = document.createParagraph();
createParagraph.getCTP().setPPr(templateParagraph.getCTP().getPPr());
for (int pos = 0; pos < createParagraph.getRuns().size(); pos++) {
createParagraph.removeRun(pos);
}
for (XWPFRun s : templateParagraph.getRuns()) {
XWPFRun targetrun = createParagraph.createRun();
CopyRun(targetrun, s);
}
replaceParagraph(createParagraph, parametersMap);
} else if (flag == 1) {
}
}
public void replaceParagraph(XWPFParagraph xWPFParagraph, Map<String, Object> parametersMap) {
List<XWPFRun> runs = xWPFParagraph.getRuns();
String xWPFParagraphText = xWPFParagraph.getText();
String regEx = "\\{.+?\\}";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(xWPFParagraphText);
if (matcher.find()) {
int beginRunIndex = xWPFParagraph.searchText("{", new PositionInParagraph()).getBeginRun();
int endRunIndex = xWPFParagraph.searchText("}", new PositionInParagraph()).getEndRun();
StringBuffer key = new StringBuffer();
if (beginRunIndex == endRunIndex) {
XWPFRun beginRun = runs.get(beginRunIndex);
String beginRunText = beginRun.text();
int beginIndex = beginRunText.indexOf("{");
int endIndex = beginRunText.indexOf("}");
int length = beginRunText.length();
if (beginIndex == 0 && endIndex == length - 1) {
XWPFRun insertNewRun = xWPFParagraph.insertNewRun(beginRunIndex);
insertNewRun.getCTR().setRPr(beginRun.getCTR().getRPr());
key.append(beginRunText.substring(1, endIndex));
insertNewRun.setText(getValueBykey(key.toString(), parametersMap));
xWPFParagraph.removeRun(beginRunIndex + 1);
} else {
XWPFRun insertNewRun = xWPFParagraph.insertNewRun(beginRunIndex);
insertNewRun.getCTR().setRPr(beginRun.getCTR().getRPr());
key.append(beginRunText.substring(beginRunText.indexOf("{") + 1, beginRunText.indexOf("}")));
String textString = beginRunText.substring(0, beginIndex) + getValueBykey(key.toString(), parametersMap)
+ beginRunText.substring(endIndex + 1);
insertNewRun.setText(textString);
xWPFParagraph.removeRun(beginRunIndex + 1);
}
} else {
XWPFRun beginRun = runs.get(beginRunIndex);
String beginRunText = beginRun.text();
int beginIndex = beginRunText.indexOf("{");
if (beginRunText.length() > 1) {
key.append(beginRunText.substring(beginIndex + 1));
}
ArrayList<Integer> removeRunList = new ArrayList<>();
for (int i = beginRunIndex + 1; i < endRunIndex; i++) {
XWPFRun run = runs.get(i);
String runText = run.text();
key.append(runText);
removeRunList.add(i);
}
XWPFRun endRun = runs.get(endRunIndex);
String endRunText = endRun.text();
int endIndex = endRunText.indexOf("}");
if (endRunText.length() > 1 && endIndex != 0) {
key.append(endRunText.substring(0, endIndex));
}
String temp = key.toString();
if (ObjectUtils.isNotEmpty(key)){
int indexOf = temp.indexOf(":");
if (indexOf != -1){
temp = temp.substring(indexOf + 1).trim();
}
int indexOf1 = temp.indexOf(":");
if (indexOf1 != -1){
temp = temp.substring(indexOf1 + 1).trim();
}
int i1 = temp.indexOf(".");
if (i1 != -1){
temp = temp.substring(i1 + 1).trim();
}
}
if (beginRunText.length() == 2) {
XWPFRun insertNewRun = xWPFParagraph.insertNewRun(beginRunIndex);
insertNewRun.getCTR().setRPr(beginRun.getCTR().getRPr());
insertNewRun.setText(getValueBykey(temp, parametersMap));
xWPFParagraph.removeRun(beginRunIndex + 1);
} else {
XWPFRun insertNewRun = xWPFParagraph.insertNewRun(beginRunIndex);
insertNewRun.getCTR().setRPr(beginRun.getCTR().getRPr());
String textString = beginRunText.substring(0, beginRunText.indexOf("{")) + getValueBykey(temp, parametersMap);
insertNewRun.setText(textString);
xWPFParagraph.removeRun(beginRunIndex + 1);
}
if (endRunText.length() == 1) {
XWPFRun insertNewRun = xWPFParagraph.insertNewRun(endRunIndex);
insertNewRun.getCTR().setRPr(endRun.getCTR().getRPr());
insertNewRun.setText("");
xWPFParagraph.removeRun(endRunIndex + 1);
} else {
XWPFRun insertNewRun = xWPFParagraph.insertNewRun(endRunIndex);
insertNewRun.getCTR().setRPr(endRun.getCTR().getRPr());
String textString = endRunText.substring(endRunText.indexOf("}") + 1);
insertNewRun.setText(textString);
xWPFParagraph.removeRun(endRunIndex + 1);
}
for (int i = 0; i < removeRunList.size(); i++) {
XWPFRun xWPFRun = runs.get(removeRunList.get(i));
XWPFRun insertNewRun = xWPFParagraph.insertNewRun(removeRunList.get(i));
insertNewRun.getCTR().setRPr(xWPFRun.getCTR().getRPr());
insertNewRun.setText("");
xWPFParagraph.removeRun(removeRunList.get(i) + 1);
}
}
replaceParagraph(xWPFParagraph, parametersMap);
}
}
private void CopyTableRow(XWPFTableRow target, XWPFTableRow source) {
int tempRowCellsize = source.getTableCells().size();
for (int i = 0; i < tempRowCellsize - 1; i++) {
target.addNewTableCell();
}
target.getCtRow().setTrPr(source.getCtRow().getTrPr());
for (int i = 0; i < target.getTableCells().size(); i++) {
copyTableCell(target.getCell(i), source.getCell(i));
}
}
private void copyTableCell(XWPFTableCell newTableCell, XWPFTableCell templateTableCell) {
newTableCell.getCTTc().setTcPr(templateTableCell.getCTTc().getTcPr());
for (int pos = 0; pos < newTableCell.getParagraphs().size(); pos++) {
newTableCell.removeParagraph(pos);
}
for (XWPFParagraph sp : templateTableCell.getParagraphs()) {
XWPFParagraph targetP = newTableCell.addParagraph();
copyParagraph(targetP, sp);
}
}
private void copyParagraph(XWPFParagraph newParagraph, XWPFParagraph templateParagraph) {
newParagraph.getCTP().setPPr(templateParagraph.getCTP().getPPr());
for (int pos = 0; pos < newParagraph.getRuns().size(); pos++) {
newParagraph.removeRun(pos);
}
for (XWPFRun s : templateParagraph.getRuns()) {
XWPFRun targetrun = newParagraph.createRun();
CopyRun(targetrun, s);
}
}
private void CopyRun(XWPFRun newRun, XWPFRun templateRun) {
newRun.getCTR().setRPr(templateRun.getCTR().getRPr());
newRun.setText(templateRun.text());
}
public void replaceTableRow(XWPFTableRow tableRow, Map<String, Object> parametersMap) {
List<XWPFTableCell> tableCells = tableRow.getTableCells();
for (XWPFTableCell xWPFTableCell : tableCells) {
List<XWPFParagraph> paragraphs = xWPFTableCell.getParagraphs();
for (XWPFParagraph xwpfParagraph : paragraphs) {
replaceParagraph(xwpfParagraph, parametersMap);
}
}
}
public void replaceTable(XWPFTable xwpfTable, Map<String, Object> parametersMap) {
List<XWPFTableRow> rows = xwpfTable.getRows();
for (XWPFTableRow xWPFTableRow : rows) {
List<XWPFTableCell> tableCells = xWPFTableRow.getTableCells();
for (XWPFTableCell xWPFTableCell : tableCells) {
List<XWPFParagraph> paragraphs2 = xWPFTableCell.getParagraphs();
for (XWPFParagraph xWPFParagraph : paragraphs2) {
replaceParagraph(xWPFParagraph, parametersMap);
}
}
}
}
private String getValueBykey(String key, Map<String, Object> map) {
String returnValue = "";
if (key != null) {
try {
returnValue = map.get(key) != null ? map.get(key).toString() : "";
} catch (Exception e) {
System.out.println("key:" + key + "***" + e);
returnValue = "";
}
}
return returnValue;
}
}
word模板示例:
成绩登记册
姓名: {field_1725964079798} 年龄: {field_1725964054090}
成绩单:
名字 分数
{名字:courseList.name} {分数:courseList.score}
成绩单2:
名字 分数
{名字:file_262578.class} {分数:file_262578.score}
姓名: {姓名:field_1725964079798}
年龄: {年龄:field_1725964054090}