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; // 没有找到匹配的段落
    }
}
相关推荐
IT_陈寒16 分钟前
Python的GIL锁让我把多线程代码全重写了!
前端·人工智能·后端
光依旧43 分钟前
MCP实战手记(九):生产化MCP Server的6层安全防护
java·人工智能·spring boot·安全·网络安全·ai agent·mcp
马剑威(威哥爱编程)1 小时前
【AI全栈后端12-04】Spring Boot 用结构化输出自动解析简历:让模型按你的 POJO 输出
java·人工智能·spring boot·后端
我的xiaodoujiao2 小时前
Django 基础知识详细图文教程 12-Django 模型定义与使用 2
后端·python·django
孙启超3 小时前
【AI开发之Rust】第 22 课:一键多平台与工程收尾 —— CI、发布检查与结课
开发语言·后端·rust
xcl09257 小时前
北京24小时自助健身房系统软件开发实战:从架构到部署全流程指南
java·spring boot·架构
一 乐9 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
一条小小yu10 小时前
Spring IoC的理解
java·后端·spring
旺仔学长 哈哈10 小时前
springboot钓鱼爱好者交流平台APP设计与实现
java·spring boot·mysql·充电桩管理系统
茉莉玫瑰花茶11 小时前
GO [ 方法 ]
开发语言·后端·golang