核心依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.9</version>
</dependency>
动态表格
测试类
package com.uncle.demo.poi;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.lang.System.out;
public class Test {
public static void main(String[] args){
Map<String, Object> data = new HashMap<String, Object>();
data.put("name", "维维豆奶粉");
Map<String,Object> mapList = new HashMap<String, Object>();
List<String[]> list01 = new ArrayList<String[]>();
list01.add(new String[]{"1","维修服务","1","6100333","2020/8/4","1、更换鼠标 \n" + "2、更换头托垫\n","设备运行正常","1.鼠标"});
list01.add(new String[]{"2","售后服务","2","6107986","2020/10/28","相关校正","设备运行正常","1.鼠标\n" + "2.头托垫\n"});
list01.add(new String[]{"3","售后服务","2","6100922","2020/11/15","1、更换鼠标 \n" + "2、更换头托垫\n","设备运行正常","1.鼠标"});
list01.add(new String[]{"4","回退服务","3","6100922","2020/11/15","1、更换鼠标 \n" + "2、更换头托垫\n","设备运行正常","1.鼠标"});
list01.add(new String[]{"5","回退服务","3","6100922","2020/11/15","1、更换鼠标 \n" + "2、更换头托垫\n","设备运行正常","1.鼠标"});
list01.add(new String[]{"6","回退服务","3","6100922","2020/11/15","1、更换鼠标 \n" + "2、更换头托垫\n","设备运行正常","1.鼠标"});
mapList.put("list01", list01);
CustomXWPFDocument doc = WorderToNewWordUtils.changWord("C:\\Users\\sunjinxin\\Downloads\\project-office-temp-tool\\project-office-temp-tool\\demo01\\src\\main\\resources\\templates\\test1.docx",data,mapList);
try (FileOutputStream fopts = new FileOutputStream("D:/呵呵.docx")) {
doc.write(fopts);
} catch (Exception e) {
e.printStackTrace();
}
out.println("成功!!!");
}
}
工具类
package com.uncle.demo.poi;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
public class WorderToNewWordUtils {
public static CustomXWPFDocument changWord(String inputUrl, Map<String, Object> textMap, Map<String, Object> mapList) {
CustomXWPFDocument document = null;
try {
document = new CustomXWPFDocument(POIXMLDocument.openPackage(inputUrl));
WorderToNewWordUtils.changeText(document, textMap);
WorderToNewWordUtils.changeTable(document, textMap, mapList);
} catch (IOException e) {
e.printStackTrace();
}
return document;
}
public static void changeText(CustomXWPFDocument document, Map<String, Object> textMap) {
List<XWPFParagraph> paragraphs = document.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
String text = paragraph.getText();
System.out.println(text);
if (checkText(text)) {
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
run.setFontSize(8);
Object ob = changeValue(run.toString(), textMap);
if (ob instanceof String) {
run.setText((String) ob, 0);
}
}
}
}
}
public static void changeTable(CustomXWPFDocument document, Map<String, Object> textMap, Map<String, Object> mapList) {
List<XWPFTable> tables = document.getTables();
for (int i = 0; i < tables.size(); i++) {
XWPFTable table = tables.get(i);
if (checkText(table.getText())) {
List<XWPFTableRow> rows = table.getRows();
eachTable(document, rows, textMap);
}
}
List<String[]> list01 = (List<String[]>) mapList.get("list01");
for (int i = 0; i < tables.size(); i++) {
XWPFTable table = tables.get(i);
if (null != list01 && 0 < list01.size() && i == 0) {
insertTable(table, null, list01, 2);
int initFlag = 1;
int mergeRowNum = initFlag;
String s1 = list01.get(0)[1];
for (int j = 0; j < list01.size(); j++) {
String s2 = list01.get(j)[1];
if (s1.equals(s2)) {
mergeRowNum++;
s1 = s2;
} else {
s1 = s2;
mergeCellVertically(table, 1, initFlag + 1, mergeRowNum);
mergeCellVertically(table, 2, initFlag + 1, mergeRowNum);
initFlag = mergeRowNum;
mergeRowNum = initFlag + 1;
}
if (j == list01.size() - 1) {
mergeCellVertically(table, 1, initFlag + 1, mergeRowNum);
mergeCellVertically(table, 2, initFlag + 1, mergeRowNum);
}
}
}
}
}
public static void eachTable(CustomXWPFDocument document, List<XWPFTableRow> rows, Map<String, Object> textMap) {
for (XWPFTableRow row : rows) {
List<XWPFTableCell> cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
if (checkText(cell.getText())) {
List<XWPFParagraph> paragraphs = cell.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
Object ob = changeValue(run.toString(), textMap);
if (ob instanceof String) {
run.setText((String) ob, 0);
} else if (ob instanceof Map) {
run.setText("", 0);
Map pic = (Map) ob;
int width = Integer.parseInt(pic.get("width").toString());
int height = Integer.parseInt(pic.get("height").toString());
int picType = getPictureType(pic.get("type").toString());
byte[] byteArray = (byte[]) pic.get("content");
ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);
try {
int ind = document.addPicture(byteInputStream, picType);
document.createPicture(ind, width, height, paragraph);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
}
}
public static void insertTable(XWPFTable table, List<String> tableList, List<String[]> daList, Integer type) {
if (2 == type) {
for (int i = 0; i < daList.size(); i++) {
XWPFTableRow row = table.insertNewTableRow(i+2);
for (int j = 0; j < daList.get(0).length; j++) {
row.createCell();
}
}
for (int i = 0; i < daList.size(); i++) {
List<XWPFTableCell> cells = table.getRow(i + 2).getTableCells();
for (int j = 0; j < cells.size(); j++) {
XWPFTableCell cell02 = cells.get(j);
cell02.setText(daList.get(i)[j]);
}
}
} else if (4 == type) {
for (int i = 0; i < tableList.size(); i++) {
XWPFTableRow row = table.createRow();
List<XWPFTableCell> cells = row.getTableCells();
cells.get(0).setText(tableList.get(i));
}
}
}
public static boolean checkText(String text) {
boolean check = false;
if (text.indexOf("$") != -1) {
check = true;
}
return check;
}
public static Object changeValue(String value, Map<String, Object> textMap) {
Set<Entry<String, Object>> textSets = textMap.entrySet();
Object valu = "";
for (Entry<String, Object> textSet : textSets) {
String key = textSet.getKey();
if (value.indexOf(key) != -1) {
valu = textSet.getValue();
}
}
return valu;
}
public static byte[] inputStream2ByteArray(InputStream in, boolean isClose) {
byte[] byteArray = null;
try {
int total = in.available();
byteArray = new byte[total];
in.read(byteArray);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (isClose) {
try {
in.close();
} catch (Exception e2) {
System.out.println("关闭流失败");
}
}
}
return byteArray;
}
private static int getPictureType(String picType) {
int res = CustomXWPFDocument.PICTURE_TYPE_PICT;
if (picType != null) {
if (picType.equalsIgnoreCase("png")) {
res = CustomXWPFDocument.PICTURE_TYPE_PNG;
} else if (picType.equalsIgnoreCase("dib")) {
res = CustomXWPFDocument.PICTURE_TYPE_DIB;
} else if (picType.equalsIgnoreCase("emf")) {
res = CustomXWPFDocument.PICTURE_TYPE_EMF;
} else if (picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")) {
res = CustomXWPFDocument.PICTURE_TYPE_JPEG;
} else if (picType.equalsIgnoreCase("wmf")) {
res = CustomXWPFDocument.PICTURE_TYPE_WMF;
}
}
return res;
}
public static void mergeCellVertically(XWPFTable table, int col, int fromRow, int toRow) {
for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
CTVMerge vmerge = CTVMerge.Factory.newInstance();
if (rowIndex == fromRow) {
vmerge.setVal(STMerge.RESTART);
} else {
vmerge.setVal(STMerge.CONTINUE);
}
XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
CTTcPr tcPr = cell.getCTTc().getTcPr();
if (tcPr != null) {
tcPr.setVMerge(vmerge);
} else {
tcPr = CTTcPr.Factory.newInstance();
tcPr.setVMerge(vmerge);
cell.getCTTc().setTcPr(tcPr);
}
}
}
public static void mergeCellHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
for (int colIndex = fromCol; colIndex <= toCol; colIndex++) {
CTHMerge hmerge = CTHMerge.Factory.newInstance();
if (colIndex == fromCol) {
hmerge.setVal(STMerge.RESTART);
} else {
hmerge.setVal(STMerge.CONTINUE);
}
XWPFTableCell cell = table.getRow(row).getCell(colIndex);
CTTcPr tcPr = cell.getCTTc().getTcPr();
if (tcPr != null) {
tcPr.setHMerge(hmerge);
} else {
tcPr = CTTcPr.Factory.newInstance();
tcPr.setHMerge(hmerge);
cell.getCTTc().setTcPr(tcPr);
}
}
}
public static List<Integer[]> startEnd(List<String[]> daList) {
List<Integer[]> indexList = new ArrayList<Integer[]>();
List<String> list = new ArrayList<String>();
for (int i = 0; i < daList.size(); i++) {
list.add(daList.get(i)[0]);
}
Map<Object, Integer> tm = new HashMap<Object, Integer>();
for (int i = 0; i < daList.size(); i++) {
if (!tm.containsKey(daList.get(i)[0])) {
tm.put(daList.get(i)[0], 1);
} else {
int count = tm.get(daList.get(i)[0]) + 1;
tm.put(daList.get(i)[0], count);
}
}
for (Map.Entry<Object, Integer> entry : tm.entrySet()) {
String key = entry.getKey().toString();
String value = entry.getValue().toString();
if (list.indexOf(key) != (-1)) {
Integer[] index = new Integer[2];
index[0] = list.indexOf(key);
index[1] = list.lastIndexOf(key);
indexList.add(index);
}
}
return indexList;
}
}
package com.uncle.demo.poi;
import java.io.IOException;
import java.io.InputStream;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlToken;
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
public class CustomXWPFDocument extends XWPFDocument {
public CustomXWPFDocument(InputStream in) throws IOException {
super(in);
}
public CustomXWPFDocument() {
super();
}
public CustomXWPFDocument(OPCPackage pkg) throws IOException {
super(pkg);
}
public void createPicture(int id, int width, int height,XWPFParagraph paragraph) {
final int EMU = 9525;
width *= EMU;
height *= EMU;
String blipId = getAllPictures().get(id).getPackageRelationship().getId();
CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();
System.out.println(blipId+":"+inline);
String picXml = ""
+ ""
+ " "
+ " "
+ " " + "
+ id
+ "\" name=\"Generated\"/>"
+ " "
+ " "
+ " "
+ "
+ blipId
+ "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
+ " "
+ " "
+ " "
+ " "
+ " "
+ " "
+ " "
+ "
+ width
+ "\" cy=\""
+ height
+ "\"/>"
+ " "
+ " "
+ " "
+ " "
+ " "
+ " "
+ " " + "";
inline.addNewGraphic().addNewGraphicData();
XmlToken xmlToken = null;
try {
xmlToken = XmlToken.Factory.parse(picXml);
} catch (XmlException xe) {
xe.printStackTrace();
}
inline.set(xmlToken);
inline.setDistT(0);
inline.setDistB(0);
inline.setDistL(0);
inline.setDistR(0);
CTPositiveSize2D extent = inline.addNewExtent();
extent.setCx(width);
extent.setCy(height);
CTNonVisualDrawingProps docPr = inline.addNewDocPr();
docPr.setId(id);
docPr.setName("图片" + id);
docPr.setDescr("测试");
}
}
动态数据
测试类
package com.hidata.tool;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test {
public static void main(String[] args) throws IOException {
Map<String, Object> wordDataMap = new HashMap<String, Object>();
Map<String, Object> parametersMap = new HashMap<String, Object>();
List<Map<String, Object>> table1 = new ArrayList<Map<String, Object>>();
Map<String, Object> map1=new HashMap();
map1.put("name", "张三");
map1.put("age", "23");
map1.put("email", "[email protected]");
Map<String, Object> map2=new HashMap();
map2.put("name", "李四");
map2.put("age", "45");
map2.put("email", "[email protected]");
Map<String, Object> map3=new HashMap();
map3.put("name", "Tom");
map3.put("age", "34");
map3.put("email", "[email protected]");
table1.add(map1);
table1.add(map2);
table1.add(map3);
List<Map<String, Object>> table2 = new ArrayList<Map<String, Object>>();
Map<String, Object> map4=new HashMap();
map4.put("name", "tom");
map4.put("number", "sd1234");
map4.put("address", "上海");
Map<String, Object> map5=new HashMap();
map5.put("name", "seven");
map5.put("number", "sd15678");
map5.put("address", "北京");
Map<String, Object> map6=new HashMap();
map6.put("name", "lisa");
map6.put("number", "sd9078");
map6.put("address", "广州");
table2.add(map4);
table2.add(map5);
table2.add(map6);
parametersMap.put("userName", "JUVENILESS");
parametersMap.put("time", "2018-03-24");
parametersMap.put("sum", "3");
wordDataMap.put("table1", table1);
wordDataMap.put("table2", table2);
wordDataMap.put("parametersMap", parametersMap);
File file = new File("C:\\Users\\sunjinxin\\Desktop\\time.docx");
FileInputStream fileInputStream = new FileInputStream(file);
WordTemplate template = new WordTemplate(fileInputStream);
template.replaceDocument(wordDataMap);
File outputFile=new File("C:\\Users\\sunjinxin\\Desktop\\输出.docx");
FileOutputStream fos = new FileOutputStream(outputFile);
template.getDocument().write(fos);
}
}
工具类
package com.hidata.tool;
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;
import org.apache.poi.xwpf.usermodel.BodyElementType;
import org.apache.poi.xwpf.usermodel.IBodyElement;
import org.apache.poi.xwpf.usermodel.PositionInParagraph;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
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(0).getTableCells();
String tableText = table.getText();
if (tableText.indexOf("##{foreach") > -1) {
if (tableCells.size() != 2
|| tableCells.get(0).getText().indexOf("##{foreach") < 0
|| tableCells.get(0).getText().trim().length() == 0) {
System.out.println("文档中第"
+ (curT + 1)
+ "个表格模板错误,模板表格第一行需要设置2个单元格,"
+ "第一个单元格存储表格类型(##{foreachTable}## 或者 ##{foreachTableRow}##),第二个单元格定义数据源。");
return;
}
String tableType = tableCells.get(0).getText();
String dataSource = tableCells.get(1).getText();
System.out.println("读取到数据源:"+dataSource);
if (!dataMap.containsKey(dataSource)) {
System.out.println("文档中第" + (curT + 1) + "个表格模板数据源缺失");
return;
}
@SuppressWarnings("unchecked")
List<Map<String, Object>> tableDataList = (List<Map<String, Object>>) dataMap
.get(dataSource);
if ("##{foreachTable}##".equals(tableType)) {
addTableInDocFooter(table, tableDataList, parametersMap, 1);
} else if ("##{foreachTableRow}##".equals(tableType)) {
addTableInDocFooter(table, tableDataList, parametersMap, 2);
}
} else if (tableText.indexOf("{") > -1) {
addTableInDocFooter(table, null, parametersMap, 3);
} else {
addTableInDocFooter(table, null, null, 0);
}
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);
}
}
public void addTableInDocFooter(XWPFTable templateTable, List<Map<String, Object>> list,
Map<String, Object> parametersMap, int flag) {
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("##{foreachRows}##") > -1) {
tagRowsIndex = i;
break;
}
}
for (int i = 1; i < tagRowsIndex; i++) {
XWPFTableRow newCreateRow = newCreateTable.createRow();
CopyTableRow(newCreateRow, TempTableRows.get(i));
replaceTableRow(newCreateRow, parametersMap);
}
XWPFTableRow tempRow = TempTableRows.get(tagRowsIndex + 1);
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));
}
if (beginRunText.length()==2 ) {
XWPFRun insertNewRun = xWPFParagraph.insertNewRun(beginRunIndex);
insertNewRun.getCTR().setRPr(beginRun.getCTR().getRPr());
insertNewRun.setText(getValueBykey(key.toString(),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(key.toString(),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;
}
}