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; // 没有找到匹配的段落
    }
}
相关推荐
それども11 分钟前
Spring Bean 的name可以相同吗
java·后端·spring
上进小菜猪13 分钟前
基于深度学习的农业虫害自动识别系统:YOLOv8 的完整工程
后端
FAQEW1 小时前
若依(RuoYi-Vue)单体架构实战手册:自定义业务模块全流程开发指南
前端·后端·架构·若依二开
qq_12498707532 小时前
基于微信小程序的电子元器件商城(源码+论文+部署+安装)
java·spring boot·spring·微信小程序·小程序·毕业设计
a努力。2 小时前
美团Java面试被问:Redis集群模式的工作原理
java·redis·后端·面试
资生算法程序员_畅想家_剑魔2 小时前
Java常见技术分享-11-责任链模式
java·spring boot·责任链模式
计算机程序设计小李同学3 小时前
动漫之家系统设计与实现
java·spring boot·后端·web安全
布列瑟农的星空3 小时前
SSE与流式传输(Streamable HTTP)
前端·后端
开心就好20253 小时前
使用 HBuilder 上架 iOS 应用时常见的问题与应对方式
后端
开心猴爷3 小时前
Swift IPA 混淆在工程实践中的方式,分析仅依赖源码层混淆的局限性
后端