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; // 没有找到匹配的段落
    }
}
相关推荐
阳光是sunny2 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
灯澜忆梦3 小时前
GO_并发编程---定时器
开发语言·后端·golang
阳光是sunny3 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
鱟鲥鳚3 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
皮皮林5513 小时前
开源实力派,给本地 AI 装上深度调研能力,一张 3090 跑到 95.7 分!
后端
努力的小雨4 小时前
把 Windows 桌面图标做成一个会自己运转的小世界
后端
武子康4 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
腾渊信息科技公司5 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
IT_陈寒6 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
段一凡-华北理工大学6 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化