Java POI 操作Word文档:复制内容和书签

本文介绍如何使用Apache POI库在Java中操作Word文档,涵盖以下内容:

  • 复制整个Word文档的内容
  • 复制指定书签范围内的Word文档内容
  • 解决java.lang.NoClassDefFoundError: org/apache/xmlbeans/impl/schema/DocumentFactory错误

1. 复制整个Word文档的内容

以下代码片段演示了如何使用POI库将一个Word文档的内容复制到另一个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 java.io.FileInputStream;
import java.io.FileOutputStream;

public class WordCopyContent {
    public static void main(String[] args) {
        try {
            // 打开输入文档
            XWPFDocument inputDoc = new XWPFDocument(new FileInputStream('input.docx'));

            // 创建输出文档
            XWPFDocument outputDoc = new XWPFDocument();

            // 复制输入文档的内容到输出文档
            copyDocumentContent(inputDoc, outputDoc);

            // 保存输出文档
            FileOutputStream out = new FileOutputStream('output.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());
            }
        }
    }
}

2. 复制指定书签范围内的Word文档内容

以下代码片段演示了如何复制Word文档中指定书签范围内的内容:

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
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 WordCopyBookmarkContent {
    public static void main(String[] args) {
        try {
            // 打开输入文档
            XWPFDocument inputDoc = new XWPFDocument(new FileInputStream('input.docx'));

            // 创建输出文档
            XWPFDocument outputDoc = new XWPFDocument();

            // 复制指定书签的内容到输出文档
            copyBookmarkContent('书签名称', inputDoc, outputDoc);

            // 保存输出文档
            FileOutputStream out = new FileOutputStream('output.docx');
            outputDoc.write(out);
            out.close();

            System.out.println('复制完成');
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 复制书签内容
    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.getDomNode().getParentNode();
                            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;
                }
            }
        }
    }
}

3. 解决java.lang.NoClassDefFoundError: org/apache/xmlbeans/impl/schema/DocumentFactory错误

这个错误是由于缺少Apache XMLBeans库引起的。要解决这个问题,您需要将Apache XMLBeans库添加到您的项目中。

您可以从Apache XMLBeans的官方网站(https://xmlbeans.apache.org/)下载库文件。然后将下载的JAR文件添加到您的项目中。

如果您使用的是Maven项目,可以在pom.xml文件中添加以下依赖项:

<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>3.1.0</version>
</dependency>

如果您使用的是Gradle项目,可以在build.gradle文件中添加以下依赖项:

implementation 'org.apache.xmlbeans:xmlbeans:3.1.0'

然后重新编译和运行您的程序,应该就不会再出现NoClassDefFoundError错误了。

Java POI 操作Word文档:复制内容和书签

原文地址: https://www.cveoy.top/t/topic/fK24 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录