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());
                }
            }
        }
    }
相关推荐
华仔啊1 小时前
3行注解干掉30行日志代码!Spring AOP实战全程复盘
java·spring boot·后端
Fireworkitte1 小时前
Tomcat 的核心脚本catalina.sh 和 startup.sh的关系
java·tomcat
风吹落叶32571 小时前
深入解析JVM内存管理与垃圾回收机制
java·开发语言·jvm
叶~璃1 小时前
人工智能驱动的开发变革
java
悟能不能悟2 小时前
排查Redis数据倾斜引发的性能瓶颈
java·数据库·redis
Derek_Smart2 小时前
Java线程死亡螺旋:解析与预防策略
java·spring·性能优化
翁正存2 小时前
IDEA测试代码报java file outset source root异常
java·ide·intellij-idea
励志五个月成为嵌入式糕手2 小时前
0819 使用IP多路复用实现TCP并发服务器
java·服务器·tcp/ip
Mi_Manchikkk2 小时前
Java高级面试实战:Spring Boot微服务与Redis缓存整合案例解析
java·spring boot·redis·缓存·微服务·面试
呼啦啦啦啦啦啦啦啦10 小时前
常见的排序算法
java·算法·排序算法