poi-tl 在一个word里写入另一个word,保持word内容无变化

根据poi-tl做的,场景是,有些需要套红文件,需要把一个word内容,插入到另一个word中,这种写法,只支持docx,因为poi的xwpf写法,只能读取xml,而docx解析出来的是xml,doc就得是另一种写法了。

但对于编号的识别不是太友好,有时候识别出来就变成%1的情况了,也许是我用的版本不是最新的,但,因为对编号的需求比较高,所以这种方法也就没再继续研究下去,后来使aspose.words做了

java 复制代码
 public static void main(String[] args) throws IOException {
            // 主文档路径
            String mainDocPath = "D:\\test\\aa.docx";
            // 要嵌入的文档路径
            String embedDocPath = "D:\\test\\oc.docx";
            // 输出文件路径
            String outputDocPath = "D:\\test\\out2.docx";

            // 读取主文档
            try (FileInputStream fis = new FileInputStream(mainDocPath);
                 XWPFDocument mainDoc = new XWPFDocument(fis)) {

                // 读取嵌入文档
                try (FileInputStream fisEmbed = new FileInputStream(embedDocPath);
                     XWPFDocument embedDoc = new XWPFDocument(fisEmbed)) {

                    // 获取主文档中的所有段落
                    List<XWPFParagraph> paragraphs = mainDoc.getParagraphs();

                    // 确定插入位置,例如第7行(索引6)
                    int insertIndex = 6;
                    if (insertIndex < paragraphs.size()) {
                        // 在目标位置插入嵌入文档的内容
                        XWPFParagraph targetParagraph = paragraphs.get(insertIndex);

//                        // 将嵌入文档中的每一段插入到目标文档中
//                        for (XWPFParagraph paragraph : embedDoc.getParagraphs()) {
//                            XWPFRun newRun = targetParagraph.createRun();
//                            newRun.setText(paragraph.getText());
//                            newRun.addBreak();
//                        }
                        // 遍历嵌入文档中的段落并复制格式和内容
                        for (XWPFParagraph paragraph : embedDoc.getParagraphs()) {
                            // 创建一个新的段落
                            XWPFParagraph newParagraph = mainDoc.insertNewParagraph(targetParagraph.getCTP().newCursor());
//                            XWPFParagraph newParagraph = mainDoc.createParagraph();
                            copyParagraphFormatting(paragraph, newParagraph);

                            // 复制每个Run的内容和格式
                            for (XWPFRun run : paragraph.getRuns()) {
                                XWPFRun newRun = newParagraph.createRun();
                                copyRunFormatting(run, newRun);
                                newRun.setText(run.getText(0));
                            }
                            newParagraph.setSpacingAfter(200); // 添加段落之间的间距
                        }
                    }

                    // 将合并后的文档保存到输出文件
                    try (FileOutputStream out = new FileOutputStream(outputDocPath)) {
                        mainDoc.write(out);
                    }
                }
            }

            System.out.println("Document saved successfully.");
        }

    // 复制段落的格式
    private static void copyParagraphFormatting(XWPFParagraph srcParagraph, XWPFParagraph destParagraph) {
        // 将源段落的对齐方式设置到目标段落
        destParagraph.setAlignment(srcParagraph.getAlignment());
        // 将源段落的垂直对齐方式设置到目标段落
        destParagraph.setVerticalAlignment(srcParagraph.getVerticalAlignment());
        // 设置目标段落在源段落之后的间距(段落间距)
        destParagraph.setSpacingAfter(srcParagraph.getSpacingAfter());
        // 设置目标段落在源段落之前的间距
        destParagraph.setSpacingBefore(srcParagraph.getSpacingBefore());
        // 设置目标段落的行间距(段落内部行与行之间的距离)
        destParagraph.setSpacingBetween(srcParagraph.getSpacingBetween());
//        // 设置目标段落的首行缩进量
        destParagraph.setIndentationFirstLine(srcParagraph.getIndentationFirstLine());
//        // 设置目标段落的悬挂缩进量
//        destParagraph.setIndentationHanging(srcParagraph.getIndentationHanging());
        // 设置目标段落的左边缩进量
        destParagraph.setIndentationLeft(srcParagraph.getIndentationLeft());
        // 设置目标段落的右边缩进量
        destParagraph.setIndentationRight(srcParagraph.getIndentationRight());
        // 将多行倍距调整为1
        destParagraph.setSpacingBetween(1.0);

        if (srcParagraph.getNumFmt() != null){
            String numLevelText = srcParagraph.getNumLevelText();
            BigInteger numID = srcParagraph.getNumID();
            BigInteger numIlvl = srcParagraph.getNumIlvl();

            destParagraph.setNumID(numID);
            destParagraph.setNumILvl(numIlvl);

            // 创建新的运行并设置编号文本
            XWPFRun run = destParagraph.createRun();
            // 将编号文本设置为运行的内容
            run.setText(numLevelText);
        }
    }

    // 复制Run的格式
    private static void copyRunFormatting(XWPFRun srcRun, XWPFRun destRun) {
        // 设置目标文本是否为粗体,与源文本相同
        destRun.setBold(srcRun.isBold());
        // 设置目标文本是否为斜体,与源文本相同
        destRun.setItalic(srcRun.isItalic());
        // 设置目标文本的下划线样式,与源文本相同
        destRun.setUnderline(srcRun.getUnderline());
        // 设置目标文本是否为删除线,与源文本相同
        destRun.setStrike(srcRun.isStrike());
        // 设置目标文本的字体类型,与源文本相同
        destRun.setFontFamily(srcRun.getFontFamily());
        // 设置目标文本的字体大小,与源文本相同
        destRun.setFontSize(srcRun.getFontSize());
        // 设置目标文本的字体颜色,与源文本相同
        destRun.setColor(srcRun.getColor());
        // 设置目标文本的下标状态,与源文本相同
        destRun.setSubscript(srcRun.getSubscript());
        // 设置目标文本的垂直位置,与源文本相同
        destRun.setTextPosition(srcRun.getTextPosition());
        if (srcRun.getCTR() != null) {
            if (srcRun.getCTR().isSetRPr()) {
                if (srcRun.getCTR().getRPr().isSetB()) {
                    destRun.setBold(srcRun.isBold());
                }
                if (srcRun.getCTR().getRPr().isSetI()) {
                    destRun.setItalic(srcRun.isItalic());
                }
                if (srcRun.getCTR().getRPr().isSetStrike()) {
                    destRun.setStrike(srcRun.isStrike());
                }
                if (srcRun.getCTR().getRPr().isSetColor()) {
                    destRun.setColor(srcRun.getColor());
                }
                if (srcRun.getCTR().getRPr().isSetSz()) {
                    destRun.setFontSize(srcRun.getFontSize());
                }
                if (srcRun.getCTR().getRPr().isSetRFonts()) {
                    destRun.setFontFamily(srcRun.getFontFamily());
                }
            }
        }
    }
相关推荐
mit6.8242 小时前
[C# starter-kit] 命令/查询职责分离CQRS | MediatR |
java·数据库·c#
诸神缄默不语2 小时前
Maven用户设置文件(settings.xml)配置指南
xml·java·maven
任子菲阳2 小时前
学Java第三十四天-----抽象类和抽象方法
java·开发语言
学Linux的语莫3 小时前
机器学习数据处理
java·算法·机器学习
找不到、了3 小时前
JVM的即时编译JIT的介绍
java·jvm
西瓜er3 小时前
JAVA:Spring Boot 集成 FFmpeg 实现多媒体处理
java·spring boot·ffmpeg
你总是一副不开心的样子(´ . .̫ .3 小时前
一、十天速通Java面试(第三天)
java·面试·职场和发展·java面试
迎風吹頭髮4 小时前
UNIX下C语言编程与实践63-UNIX 并发 Socket 编程:非阻塞套接字与轮询模型
java·c语言·unix
我是华为OD~HR~栗栗呀4 小时前
23届考研-Java面经(华为OD)
java·c++·python·华为od·华为·面试
Javatutouhouduan4 小时前
Java程序员如何深入学习JVM底层原理?
java·jvm·java面试·后端开发·java架构师·java程序员·互联网大厂