package com.product.file.service; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.tomcat.util.http.fileupload.IOUtils; import org.apache.xmlbeans.XmlOptions; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody; import java.io.*; import java.util.ArrayList; import java.util.List; /** * 合并word */ public class MergeDoc { /** * 合并docx文件 * * @param srcDocxs 需要合并的目标docx文件 * @param response 合并后的docx输出文件 */ public static File mergeDoc(List srcDocxs, String tempFilePath) { OutputStream dest = null; List opcpList = new ArrayList<>(); int length = null == srcDocxs ? 0 : srcDocxs.size(); /** * 循环获取每个docx文件的OPCPackage对象 */ for (int i = 0; i < length; i++) { File 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(tempFilePath); 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); return new File(tempFilePath); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { //关闭流 IOUtils.closeQuietly(dest); } } return null; } /** * 合并文档内容 * * @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("",""); // appendString = appendString.replaceAll("",""); // appendString = appendString.replaceAll("",""); // appendString = appendString.replaceAll("","");; String srcString = src.xmlText(); // srcString = srcString.replaceAll("",""); // srcString = srcString.replaceAll("",""); // srcString = srcString.replaceAll("",""); // srcString = srcString.replaceAll("",""); 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); } }