合并效果:

1. 引入maven依赖

   <dependencies><!-- springboot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>RELEASE</version></dependency><!-- poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.7</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.7</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.7</version></dependency></dependencies>

2. 实现代码

package com.java.util;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.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;/*** Created by 周壮*/
public class MergeDoc {/*** 合并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);}}

3. 测试

//测试代码如下:public static void main(String[] args){List<String> srcs = new ArrayList<String>();srcs.add("C:\\input1.docx");srcs.add("C:\\input2.docx");mergeDoc(srcs, "C:\\output.docx");}

java word合并(亲测)相关推荐

  1. jquery将html转换word,HTML代码转word!亲测!可用!!!

    现在项目中遇到一个需求,就是一个富文本编辑区中,有echars表格.用户点击保存按钮,需要导出为word文档. 因为现在接手的项目,是基于上一个项目的框架.两个项目功能点差不多.但是在导出word这块 ...

  2. HTML代码转word!亲测!可用!!!

    现在项目中遇到一个需求,就是一个富文本编辑区中,有echars表格.用户点击保存按钮,需要导出为word文档. 因为现在接手的项目,是基于上一个项目的框架.两个项目功能点差不多.但是在导出word这块 ...

  3. 微信小程序码的生成(JAVA完整版) 亲测可用

    JAVA生成小程序码(太阳码) 首先准备工具类,这里我使用的是QrUtil;废话不多说,上工具类; 工具类是获取token使用; appid = 小程序appID secret = 小程序秘钥 /** ...

  4. java word合并单元格_java使用freemarker模板导出word(带有合并单元格)文档

    前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并单元格的,可是查了好久都没有自己想要的.研究了几天其实挺简单的,在这儿我就简单的介绍一下吧!(此方法只是一种思路,借鉴者还有 ...

  5. java 存储png文件_vue图片上传及java存储图片(亲测可用)

    1.前言 在使用elementui的upload组件时,我一直无法做到上传的图片和其他数据一起提交.单纯的上传文件,java的存储图片的方式也有局限性. 我知道的后端保存图片有两种方式:一种是直接存储 ...

  6. matlab 调用java 代码(亲测可用)

    注意选择合适的版本,我的用matlab2016a ,myeclipse 导出jar文件(jdk1.7) matlab有多重方法可以实现对Java类的调用,如将java类编译成class文件放入matl ...

  7. Excel多Sheet拆分与合并 - 亲测可用

    Excel多Sheet拆分与合并 文章目录 Excel多Sheet拆分与合并 一.Excel多个Sheet拆分 二.多个Excel合并成一个Excel(每个Sheet则是一个原Excel) 一.Exc ...

  8. 银联支付-java版(亲测OK)

    一.前提 先参考:https://blog.csdn.net/sunroyi666/article/details/71107228 二.废话不多说直接上代码 https://github.com/P ...

  9. 7号电单车java怎么样_亲测7号电单车 适合10公里内出行

    在过去一年多的时间里,共享单车成为一个尽人皆知的新词,而在共享经济的助推之下,共享电单车也开始出现了街头. 以北京为例来说,目前已经出现了很多的共享电单车品牌,比如推出较早的7号电单车.那么与共享单车 ...

最新文章

  1. 2.1.4 进程通信
  2. 延时消息_手把手实现一条延时消息
  3. C#实现缩放和剪裁图片的方法示例
  4. nssl1191,P2700-逐个击破(平津战役)【并查集】
  5. iOS开发 之 可穿戴设备 蓝牙4.0 BLE 开发
  6. scala之Akka的Actor模型(上)
  7. ZT:【搞笑】某大学生毕业自我鉴定
  8. Spring Validation的校验顺序问题解决方案(建议读到最后,有大坑)
  9. 全基因组组装,注释与评估软件
  10. linux一次三行显示文件内容,Linux 命令合集(二):查看文件及内容处理命令
  11. Hannah荣获第六季完美童模全球总决赛全球人气总冠军
  12. 61-Java-分布式开发框架Dubbo
  13. 基于vue的仿饿了么webapp
  14. graphpad做图如何加星号_如何用R画分组柱状图并且添加标准差和显著性标记(星号)?...
  15. element表格里面放图片_Element ui表格展示图片问题
  16. 新升级,新格局 |2022(第三届)全球数字经济产业大会9月盛大来袭!
  17. 高斯过程的matlab程序实现及其参数优化
  18. 年终工作总结ppt模板怎么做? 工作总结ppt制作的方法
  19. 【前端】组件基础使用
  20. 多年iOS开发经验总结(转)

热门文章

  1. 谷歌紧急修复今年已遭利用的第9个0day
  2. 怎么将CAD图纸旋转角度后查看
  3. 如何构建语音识别能力?有哪些语音数据集?
  4. 【干货分享】最新WHQL徽标认证申请流程
  5. R数据分析:扫盲贴,什么是多重插补
  6. win7无线手柄测试软件,win7系统设置和调试游戏手柄的方法
  7. Windows10系统关闭这个设置提升电脑30%的运行速度!
  8. 学校的计算机考试系统,南昊校园在线考试系统电脑阅卷系统
  9. 东华大学概率论第三次作业
  10. R语言统计分析:bootstrap方法