springboot完成复制一个word内容包括格式到另外一个word

1,pom类引入依赖

bash 复制代码
      <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,加载源文档和目标文档

bash 复制代码
      // 加载源文档和目标文档
            FileInputStream sourceFile = new FileInputStream(sourcePathStr);
            FileInputStream targetFile = new FileInputStream(targetPathStr);

            XWPFDocument sourceDoc = new XWPFDocument(sourceFile);
            XWPFDocument targetDoc = new XWPFDocument(targetFile);

3,查找目标文档中的特定位置(例如段落文本内容)

bash 复制代码
			targetParagraphText = "查找的内容"; // 目标文档中你想插入到的段落的文本内容
            int insertIndex = findParagraphIndex(targetDoc, targetParagraphText);

4,复制源文档的段落到目标文档

bash 复制代码
                // 复制源文档的段落到目标文档
                for (XWPFParagraph paragraph : paragraphs) {
                    XWPFParagraph newParagraph = targetDoc.createParagraph();
                    newParagraph.getCTP().set(paragraph.getCTP());  // 复制段落的内容
                }

5,将目标文档中的段落按顺序移动,以便在特定位置插入

bash 复制代码
                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,移除标志后面的段落

bash 复制代码
                //移除标志后面的段落
                for (int e = insertIndex; e < size; e++) {
                    boolean b = targetDoc.removeBodyElement(insertIndex);
                }

后面重新写入文档即可

完成的代码如下

bash 复制代码
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; // 没有找到匹配的段落
    }
}
相关推荐
Nyarlathotep011311 分钟前
JUC工具(3):StampedLock的基础和原理
java·后端
aLTttY42 分钟前
Spring Boot + Redis 实现接口防抖与限流实战指南
spring boot·redis·junit
直奔標竿42 分钟前
Java开发者AI转型第二十二课!Spring AI 个人知识库实战(一)——架构搭建与核心契约落地
java·人工智能·后端·spring·架构
清汤饺子1 小时前
【译】我的 AI 进阶之路:从怀疑到深度整合
前端·javascript·后端
无厚1 小时前
Spring Boot中LLM流式交互的核心原理
后端·设计
叶落阁主2 小时前
Spring Boot 4 实战:Jackson 2.x 升级到 3.x 踩坑全记录
java·后端·架构
V+zmm101342 小时前
毕业设计:基于neo4j的知识图谱的智能问答系统(源码)
spring boot·毕业设计·知识图谱·课程设计·neo4j·智能问答·毕设
曹牧2 小时前
Spring WebService 的两种主流实现方式‌
java·后端·spring
用户327980567072 小时前
JDK9+日志Xlog的使用方式
后端