1,pom类引入依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>5.1.1</version>
</dependency>
2,加载源文档和目标文档
// 加载源文档和目标文档
FileInputStream sourceFile = new FileInputStream(sourcePathStr);
FileInputStream targetFile = new FileInputStream(targetPathStr);
XWPFDocument sourceDoc = new XWPFDocument(sourceFile);
XWPFDocument targetDoc = new XWPFDocument(targetFile);
3,查找目标文档中的特定位置(例如段落文本内容)
targetParagraphText = "查找的内容"; // 目标文档中你想插入到的段落的文本内容
int insertIndex = findParagraphIndex(targetDoc, targetParagraphText);
4,复制源文档的段落到目标文档
// 复制源文档的段落到目标文档
for (XWPFParagraph paragraph : paragraphs) {
XWPFParagraph newParagraph = targetDoc.createParagraph();
newParagraph.getCTP().set(paragraph.getCTP()); // 复制段落的内容
}
5,将目标文档中的段落按顺序移动,以便在特定位置插入
List<XWPFParagraph> targetParagraphsNew = new ArrayList<>();
int size = targetParagraphs.size();
for (int i = insertIndex+1; i < size; i++) {
// XWPFParagraph remove = targetParagraphs.remove(insertIndex+d);
XWPFParagraph xwpfParagraph = targetParagraphs.get(i);
targetParagraphsNew.add(xwpfParagraph);
}
6,移除标志后面的段落
//移除标志后面的段落
for (int e = insertIndex; e < size; e++) {
boolean b = targetDoc.removeBodyElement(insertIndex);
}
后面重新写入文档即可
完成的代码如下
package com.lz.app.util;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class WordContentFormatCopy{
public static void copyWordContentFormat(String sourcePathStr, String targetPathStr, String outPathStr, String targetParagraphText){
try {
// 加载源文档和目标文档
FileInputStream sourceFile = new FileInputStream(sourcePathStr);
FileInputStream targetFile = new FileInputStream(targetPathStr);
XWPFDocument sourceDoc = new XWPFDocument(sourceFile);
XWPFDocument targetDoc = new XWPFDocument(targetFile);
// 查找目标文档中的特定位置(例如段落文本内容)
targetParagraphText = "*****"; // 目标文档中你想插入到的段落的文本内容
int insertIndex = findParagraphIndex(targetDoc, targetParagraphText);
if (insertIndex != -1) {
// 复制源文档中的所有段落到目标文档的特定位置
List<XWPFParagraph> paragraphs = sourceDoc.getParagraphs();
// 将目标文档中的段落转为 ArrayList 以便修改
List<XWPFParagraph> targetParagraphs = new ArrayList<>(targetDoc.getParagraphs());
// 复制源文档的段落到目标文档
for (XWPFParagraph paragraph : paragraphs) {
XWPFParagraph newParagraph = targetDoc.createParagraph();
newParagraph.getCTP().set(paragraph.getCTP()); // 复制段落的内容
}
// 将目标文档中的段落按顺序移动,以便在特定位置插入
List<XWPFParagraph> targetParagraphsNew = new ArrayList<>();
int size = targetParagraphs.size();
for (int i = insertIndex+1; i < size; i++) {
// XWPFParagraph remove = targetParagraphs.remove(insertIndex+d);
XWPFParagraph xwpfParagraph = targetParagraphs.get(i);
targetParagraphsNew.add(xwpfParagraph);
}
// 将修改后的段落重新设置到目标文档
for (XWPFParagraph p : targetParagraphsNew) {
targetDoc.createParagraph().getCTP().set(p.getCTP());
}
//移除标志后面的段落
for (int e = insertIndex; e < size; e++) {
boolean b = targetDoc.removeBodyElement(insertIndex);
}
// 重新写入文档
FileOutputStream out = new FileOutputStream(outPathStr);
targetDoc.write(out);
out.close();
} else {
System.out.println("未找到指定的目标段落");
}
// 关闭文件流
sourceFile.close();
targetFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 查找目标文档中特定段落的位置
private static int findParagraphIndex(XWPFDocument doc, String text) {
List<XWPFParagraph> paragraphs = doc.getParagraphs();
for (int i = 0; i < paragraphs.size(); i++) {
if (paragraphs.get(i).getText().contains(text)) {
return i; // 返回段落索引
}
}
return -1; // 没有找到匹配的段落
}
}