maven仓库依赖如下:
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.13</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.13</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.13</version>
</dependency>
java后台测试代码如下:
@ResponseBody
@RequestMapping("/word")
public Object word() {
Map<String, String> mp = new HashMap<String, String>();
File f = new File("D:\\lic\\aa.doc");
mp.put("name", "Tom");
mp.put("tel", "187664034343");
mp.put("phone", "this is New phone");
try {
File ff = new File("D:\\lic\\i.docx");
System.out.println(ff.exists());
InputStream is = new FileInputStream("D:\\lic\\i.docx");
XWPFDocument doc = new XWPFDocument(is);
replaceInWord(mp,doc ,f);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mp;
}
private void replaceInWord(Map<String, String> replacements, XWPFDocument doc, File outfile) throws IOException {
long count1 = 0;
long count2 = 0;
List<XWPFParagraph> paragraphs = doc.getParagraphs();
List<XWPFTable> tables = doc.getTables();
count1 = replaceInParagraphs(replacements, paragraphs, false);
count2 = replaceInTables(replacements, tables);
doc.write(new FileOutputStream(outfile));
System.out.println("段落替换数量累计:" + count1);
System.out.println("表格替换数量累计:" + count2);
}
/**
* 1.替换段落中的文本
*
* @param replacements
* @param count
* @param paragraphs
* @return
*/
private long replaceInParagraphs(Map<String, String> replacements, List<XWPFParagraph> paragraphs, boolean flag) {
long count = 0;
String pString = flag ? "表格" + "段落清晰:" : "段落:";
for (XWPFParagraph paragraph : paragraphs) {
System.out.println(pString + paragraph.getText());
List<XWPFRun> runs = paragraph.getRuns();
for (Map.Entry<String, String> replPair : replacements.entrySet()) {
String oldText = replPair.getKey();
String newText = replPair.getValue();
// 获取文本段
TextSegement tSegement = paragraph.searchText(oldText, new PositionInParagraph());
if (tSegement != null) {
int beginRun = tSegement.getBeginRun();
int endRun = tSegement.getEndRun();
System.out.println(beginRun + " " + endRun);
count++;
if (beginRun == endRun) {
// whole search string is in one Run
XWPFRun run = runs.get(beginRun);
String runText = run.getText(0);
System.out.println("runText:" + runText);
String replaced = runText.replace(oldText, newText);
run.setText(replaced, 0);
} else {
// The search string spans over more than one Run
// Put the Strings together
StringBuilder b = new StringBuilder();
for (int runPos = beginRun; runPos <= endRun; runPos++) {
XWPFRun run = runs.get(runPos);
b.append(run.getText(0));
}
String connectedRuns = b.toString();
String replaced = connectedRuns.replace(oldText, newText);
// The first Run receives the replaced String of all
// connected Runs
XWPFRun partOne = runs.get(beginRun);
partOne.setText(replaced, 0);
// Removing the text in the other Runs.
for (int runPos = beginRun + 1; runPos <= endRun; runPos++) {
XWPFRun partNext = runs.get(runPos);
partNext.setText("", 0);
}
}
}
}
}
return count;
}
/**
* 1.替换表格中的文本
*
* @param replacements
* @param count
* @param paragraphs
* @return
*/
private long replaceInTables(Map<String, String> replacements, List<XWPFTable> tables) {
long count = 0;
for (XWPFTable table : tables) {
for (XWPFTableRow row : table.getRows()) {
for (XWPFTableCell cell : row.getTableCells()) {
List<XWPFParagraph> paragraphs = cell.getParagraphs();
count += replaceInParagraphs(replacements, paragraphs, true);
}
}
}
return count;
}
效果原图:
替换后效果图: