Java Apache POI 合并 Word 文档并复制书签内容
Java Apache POI 合并 Word 文档并复制书签内容
使用 Java Apache POI 库,可以方便地合并两个 Word 文档,并从指定的文档中复制指定书签的内容到合并后的文档。
代码示例:
package word;
import org.apache.poi.xwpf.usermodel.IBodyElement;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTMarkupRange;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;
public class Word {
public static void main(String[] args) {
try {
// 打开输入文档1
XWPFDocument inputDoc1 = new XWPFDocument(new FileInputStream('input01.docx'));
// 打开输入文档2
XWPFDocument inputDoc2 = new XWPFDocument(new FileInputStream('input02.docx'));
// 创建输出文档
XWPFDocument outputDoc = new XWPFDocument();
// 复制输入文档1的内容到输出文档
copyDocumentContent(inputDoc1, outputDoc);
// 复制输入文档1中指定书签的内容到输出文档
copyBookmarkContent('应变计', inputDoc1, outputDoc);
// 复制输入文档2中指定书签的内容到输出文档
copyBookmarkContent('位移计', inputDoc2, outputDoc);
// 保存输出文档
FileOutputStream out = new FileOutputStream('input04.docx');
outputDoc.write(out);
out.close();
System.out.println('复制完成');
} catch (Exception e) {
e.printStackTrace();
}
}
// 复制文档内容
private static void copyDocumentContent(XWPFDocument sourceDoc, XWPFDocument targetDoc) {
for (IBodyElement element : sourceDoc.getBodyElements()) {
if (element instanceof XWPFParagraph paragraph) {
targetDoc.createParagraph().createRun().setText(paragraph.getText());
} else if (element instanceof XWPFTable table) {
targetDoc.createTable().getCTTbl().setTblPr(table.getCTTbl().getTblPr());
}
}
}
// 复制书签内容
private static void copyBookmarkContent(String bookmarkName, XWPFDocument sourceDoc, XWPFDocument targetDoc) {
List<XWPFParagraph> paragraphs = sourceDoc.getParagraphs();
for (int i = 0; i < paragraphs.size(); i++) {
XWPFParagraph paragraph = paragraphs.get(i);
List<CTBookmark> bookmarks = paragraph.getCTP().getBookmarkStartList();
for (CTBookmark bookmark : bookmarks) {
if (bookmark.getName().equals(bookmarkName)) {
int startIdx = i;
int endIdx = -1;
for (int j = i + 1; j < paragraphs.size(); j++) {
XWPFParagraph nextParagraph = paragraphs.get(j);
List<CTMarkupRange> nextBookmarks = nextParagraph.getCTP().getBookmarkEndList();
for (CTMarkupRange nextBookmark : nextBookmarks) {
CTBookmark parentBookmark = (CTBookmark) nextBookmark.getParent();
if (parentBookmark.getId().equals(bookmark.getId())) {
endIdx = j;
break;
}
}
if (endIdx != -1) {
break;
}
}
if (endIdx != -1) {
for (int k = startIdx; k <= endIdx; k++) {
XWPFParagraph targetParagraph = targetDoc.createParagraph();
targetParagraph.createRun().setText(paragraphs.get(k).getText());
}
}
break;
}
}
}
}
}
代码说明:
- 导入必要的类库,包括 Apache POI 和 OpenXML 的相关类。
- 创建三个 XWPFDocument 对象,分别代表输入文档 1、输入文档 2 和输出文档。
- 使用
copyDocumentContent()方法将输入文档 1 的内容复制到输出文档。 - 使用
copyBookmarkContent()方法将输入文档 1 中名为 '应变计' 的书签内容复制到输出文档。 - 使用
copyBookmarkContent()方法将输入文档 2 中名为 '位移计' 的书签内容复制到输出文档。 - 保存输出文档到指定路径。
方法说明:
copyDocumentContent()方法用于复制文档内容,包括段落和表格。copyBookmarkContent()方法用于复制指定书签的内容。该方法通过遍历所有段落,查找指定书签的开始和结束标记,并将标记之间的内容复制到输出文档。
注意:
- 确保输入文档中存在指定的书签。
- 可以根据实际情况修改输入文档路径、输出文档路径和书签名称。
错误解决:
代码中出现了 'java: 不兼容的类型: org.openxmlformats.schemas.wordprocessingml.x2006.main.CTMarkupRange无法转换为org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark' 的错误。
这是因为 CTMarkupRange 对象无法直接转换为 CTBookmark 对象。解决方法是通过获取 CTMarkupRange 对象的父元素来获取 CTBookmark 对象。修改后的代码已包含此修复。
总结:
以上代码实现了使用 Java Apache POI 库合并两个 Word 文档,并复制指定书签内容的功能。该方法简单易懂,易于扩展和修改,适用于各种 Word 文档处理需求。
原文地址: https://www.cveoy.top/t/topic/fKMz 著作权归作者所有。请勿转载和采集!