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);
}
}
POI word文档合并
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 个人专题目录 Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。下...
- 转换流 输入字节流的转换流:InputStreamReader 是字节流通向字符流的桥InputStreamRea...