POI word文档合并

package com.*.*.util;

import java.io.*;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.apache.commons.compress.utils.IOUtils;

import org.apache.poi.openxml4j.opc.OPCPackage;

import org.apache.poi.xwpf.usermodel.Document;

import org.apache.poi.xwpf.usermodel.XWPFDocument;

import org.apache.poi.xwpf.usermodel.XWPFPictureData;

import org.apache.xmlbeans.XmlOptions;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;

/**

* 合并两个docx文档方法,对文档包含的图片无效

* @author laitong.ma

* @date 2019年10月17日

*/

public class POIMergeDocUtil {

//    public static void main(String[] args) throws Exception {

//

//        String[] srcDocxs = {"D:\\zzx项目\\vehicleCharge\\合并类测试\\安全生产会议0.docx", "D:\\zzx项目\\vehicleCharge\\合并类测试\\安全生产会议53.docx"};

//        String destDocx = "D:\\zzx项目\\vehicleCharge\\合并类测试\\合并后.docx";

//        mergeDoc(srcDocxs, destDocx);

//    }

/**

* 合并docx文件d

*

    * @param srcDocxs 需要合并的目标docx文件

    * @param destDocx 合并后的docx输出文件

*/

    public static int hebin (String[] srcDocxs,String destDocx){

if(srcDocxs ==null || srcDocxs.length<2){

//请传入多个word路径

            return 1;

}

OutputStream dest =null;

InputStream in1 =null;

try {

in1 =new FileInputStream(srcDocxs[0]);

dest =new FileOutputStream(destDocx);

OPCPackage src1Package = OPCPackage.open(in1);

XWPFDocument src1Document =new XWPFDocument(src1Package);

for (int i=1;i< srcDocxs.length;i++) {

InputStream item =new FileInputStream(srcDocxs[i]);

OPCPackage src2Package = OPCPackage.open(item);

XWPFDocument src2Document =new XWPFDocument(src2Package);

appendBody(src1Document, src2Document);

item.close();

src2Document.close();

}

src1Document.createNumbering();//操作_1

            src1Document.write(dest);

src1Document.close();

src1Package.close();

return 0;

}catch (Exception e) {

e.printStackTrace();

}finally {

if(in1!=null){

try {

in1.close();

}catch (IOException e) {

e.printStackTrace();

}

}

if(dest!=null){

try {

dest.close();

}catch (IOException e) {

e.printStackTrace();

}

}

}

return 1;

}

public static void appendBody(XWPFDocument src, XWPFDocument append)throws Exception {

CTBody src1Body = src.getDocument().getBody();

CTBody src2Body = append.getDocument().getBody();

List allPictures = append.getAllPictures();

// 记录图片合并前及合并后的ID

        Map map =new HashMap();

for (XWPFPictureData picture : allPictures) {

String before = append.getRelationId(picture);

//将原文档中的图片加入到目标文档中

            String after = src.addPictureData(picture.getData(), Document.PICTURE_TYPE_PNG);

map.put(before, after.replace("rId","myKey"));//操作_2

        }

appendBody(src1Body, src2Body,map);

}

private static void appendBody(CTBody src, CTBody append,Map map)throws Exception {

XmlOptions optionsOuter =new XmlOptions();

optionsOuter.setSaveOuter();

String appendString = append.xmlText(optionsOuter);

String srcString = src.xmlText();

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("<"));

if (map !=null && !map.isEmpty()) {

//对xml字符串中图片ID进行替换

            for (Map.Entry set : map.entrySet()) {

addPart = addPart.replace(set.getKey(), set.getValue());

}

addPart = addPart.replace("myKey","rId");//操作_3

        }

//将两个文档的xml内容进行拼接

        CTBody makeBody = CTBody.Factory.parse(prefix+mainPart+addPart+sufix);

src.set(makeBody);

}

}


传入word文档路径的集合srcDocxs 和需要最后合并后的路径url进行word文档合并

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容