java实现将多个word文档合并

大概流程是:

1、使用OPCPackage将每一个文档打开并且存储起来

2、将其转成字符串合并

3、再将字符串转换成对应得XWPFDocument 对象写出即可

代码如下:

/**
     * 合并docx文件
     *
     * @param srcDocxs 需要合并的目标docx文件
     * @param destDocx 合并后的docx输出文件
     */
    public static void mergeDoc(List<String> srcDocxs, String destDocx) {
        OutputStream dest = null;
        List<OPCPackage> opcpList = new ArrayList<OPCPackage>();
        int length = null == srcDocxs ? 0 : srcDocxs.size();
        /**
         * 循环获取每个docx文件的OPCPackage对象
         */
        for (int i = 0; i < length; i++) {
            String doc = srcDocxs.get(i);
            OPCPackage srcPackage = null;
            try {
                srcPackage = OPCPackage.open(doc);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (null != srcPackage) {
                opcpList.add(srcPackage);
            }
        }
        int opcpSize = opcpList.size();
        //获取的OPCPackage对象大于0时,执行合并操作
        if (opcpSize > 0) {
            try {
                dest = new FileOutputStream(destDocx);
                XWPFDocument src1Document = new XWPFDocument(opcpList.get(0));
                CTBody src1Body = src1Document.getDocument().getBody();
                //OPCPackage大于1的部分执行合并操作
                if (opcpSize > 1) {
                    for (int i = 1; i < opcpSize; i++) {
                        OPCPackage src2Package = opcpList.get(i);
                        XWPFDocument src2Document = new XWPFDocument(src2Package);
                        CTBody src2Body = src2Document.getDocument().getBody();
                        appendBody(src1Body, src2Body);
                    }
                }
                //将合并的文档写入目标文件中
                src1Document.write(dest);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭流
                IOUtils.closeQuietly(dest);
            }
        }
    }

    /**
     * 合并文档内容
     *
     * @param src    目标文档
     * @param append 要合并的文档
     * @throws Exception
     */
    private static void appendBody(CTBody src, CTBody append) throws Exception {
        XmlOptions optionsOuter = new XmlOptions();
        optionsOuter.setSaveOuter();
        String appendString = append.xmlText(optionsOuter);
        //替换word中得空行、根据自己需求来选择需不需要
        //word文档其实是由xml文件合成得,一下替换得是作者对应得xml文件中得空行标签
        appendString = appendString.replaceAll("<w:p><w:pPr><w:spacing w:line=\\\"360\\\" w:lineRule=\\\"auto\\\"/><w:jc w:val=\\\"right\\\"/><w:rPr><w:rFonts w:ascii=\\\"仿宋\\\" w:eastAsia=\\\"仿宋\\\" w:hAnsi=\\\"仿宋\\\"/><w:sz w:val=\\\"24\\\"/></w:rPr></w:pPr></w:p>","");
        appendString = appendString.replaceAll("<w:p><w:pPr xsi:nil=\\\"true\\\" xmlns:xsi=\\\"xsi\\\"/></w:p>","");
        appendString = appendString.replaceAll("<w:p><w:pPr><w:ind w:firstLineChars=\\\"200\\\" w:firstLine=\\\"600\\\"/><w:jc w:val=\\\"right\\\"/><w:rPr><w:rFonts w:ascii=\\\"仿宋\\\" w:eastAsia=\\\"仿宋\\\" w:hAnsi=\\\"仿宋\\\"/><w:sz w:val=\\\"30\\\"/><w:szCs w:val=\\\"30\\\"/></w:rPr></w:pPr></w:p>","");
        appendString = appendString.replaceAll("<w:spacing w:line=\\\"360\\\" w:lineRule=\\\"auto\\\"/>","");;
        String srcString = src.xmlText();
        srcString = srcString.replaceAll("<w:p><w:pPr><w:ind w:firstLineChars=\\\"200\\\" w:firstLine=\\\"600\\\"/><w:jc w:val=\\\"right\\\"/><w:rPr><w:rFonts w:ascii=\\\"仿宋\\\" w:eastAsia=\\\"仿宋\\\" w:hAnsi=\\\"仿宋\\\"/><w:sz w:val=\\\"30\\\"/><w:szCs w:val=\\\"30\\\"/></w:rPr></w:pPr></w:p>","");
        srcString = srcString.replaceAll("<w:spacing w:line=\\\"360\\\" w:lineRule=\\\"auto\\\"/>","");
        srcString = srcString.replaceAll("<w:p><w:pPr><w:spacing w:line=\\\"360\\\" w:lineRule=\\\"auto\\\"/><w:jc w:val=\\\"right\\\"/><w:rPr><w:rFonts w:ascii=\\\"仿宋\\\" w:eastAsia=\\\"仿宋\\\" w:hAnsi=\\\"仿宋\\\"/><w:sz w:val=\\\"24\\\"/></w:rPr></w:pPr></w:p>","");
        srcString = srcString.replaceAll("<w:p><w:pPr xsi:nil=\\\"true\\\" xmlns:xsi=\\\"xsi\\\"/></w:p>","");
        String prefix = srcString.substring(0, srcString.indexOf(">") + 1);
        String mainPart = srcString.substring(srcString.indexOf(">") + 1,
                srcString.lastIndexOf("<"));
        String sufix = srcString.substring(srcString.lastIndexOf("<"));
        String addPart = appendString.substring(appendString.indexOf(">") + 1,
                appendString.lastIndexOf("<"));
        CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart
                + sufix);
        src.set(makeBody);
    }

//测试代码如下:

 public static void main(String[] args){
        List<String> srcs = new ArrayList<>();
        for(int i = 0 ; i <= 23 ; i++){
            if(i != 1) {
                srcs.add("E:\\workIreport\\" + i + ".doc");
            }
        }
        mergeDoc(srcs, "E:\\workIreport\\test.doc");
    }
很抱歉,我并不是一个可以浏览文档的程序,也没有能力打开网页查找相关信息。但是,我可以告诉你如何使用Java多个Word文档合并为一个Word文档。 可以使用Apache POI库来操作Word文档。以下是将多个Word文档合并为一个Word文档的示例代码: ``` import java.io.*; import org.apache.poi.xwpf.usermodel.*; public class MergeWordDocuments { public static void main(String[] args) throws Exception { String[] files = {"doc1.docx", "doc2.docx", "doc3.docx"}; XWPFDocument finalDoc = new XWPFDocument(); for (String file : files) { XWPFDocument doc = new XWPFDocument(new FileInputStream(file)); for (XWPFParagraph para : doc.getParagraphs()) { XWPFParagraph newPara = finalDoc.createParagraph(); newPara.createRun().setText(para.getText()); } for (XWPFTable tbl : doc.getTables()) { XWPFTable newTbl = finalDoc.createTable(); newTbl.getCTTbl().setTblPr(tbl.getCTTbl().getTblPr()); for (int i = 0; i < tbl.getRows().size(); i++) { XWPFTableRow row = newTbl.getRow(i); if (row == null) row = newTbl.createRow(); for (int j = 0; j < tbl.getRow(i).getTableCells().size(); j++) { XWPFTableCell cell = row.getCell(j); if (cell == null) cell = row.createCell(); cell.getCTTc().setTcPr(tbl.getRow(i).getCell(j).getCTTc().getTcPr()); for (XWPFParagraph para : tbl.getRow(i).getCell(j).getParagraphs()) { XWPFParagraph newPara = cell.addParagraph(); newPara.createRun().setText(para.getText()); } } } } } FileOutputStream out = new FileOutputStream("finalDoc.docx"); finalDoc.write(out); out.close(); finalDoc.close(); } } ``` 上述代码将会把 `doc1.docx`,`doc2.docx` 和 `doc3.docx` 合并为 `finalDoc.docx` 文件。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿文_ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值