基于java处理.docx格式的word合并

如下实例是将 2.docx和3.docx合并,写到empty.docx中,不适用于.doc格式,

public static void main(String[] args) {    File file1 = new File("D:\\empty.docx");    List<File> targetFile1 = new ArrayList<>();    targetFile1.add(new File("D:\\2.docx"));    targetFile1.add(new File("D:\\3.docx"));    appendDocx(file1, targetFile1);}

/** * 把多个docx文件合并成一个 * * @param outfile    输出文件 * @param targetFile 目标文件 */public static void appendDocx(File outfile, List<File> targetFile) {    try {        OutputStream dest = new FileOutputStream(outfile);        ArrayList<XWPFDocument> documentList = new ArrayList<>();        XWPFDocument doc = null;        for (int i = 0; i < targetFile.size(); i++) {            FileInputStream in = new FileInputStream(targetFile.get(i).getPath());            OPCPackage open = OPCPackage.open(in);            XWPFDocument document = new XWPFDocument(open);            documentList.add(document);        }        for (int i = 0; i < documentList.size(); i++) {            doc = documentList.get(0);            if (i != 0) {               /* if (i != documentList.size() - 1) {                    documentList.get(i).createParagraph().setPageBreak(true);                }*/

                appendBody(doc, documentList.get(i));            }        }        //doc.createParagraph().setPageBreak(true);        doc.write(dest);    } catch (Exception e) {        e.printStackTrace();    }}

public static void appendBody(XWPFDocument src, XWPFDocument append) throws Exception {    CTBody src1Body = src.getDocument().getBody();    CTBody src2Body = append.getDocument().getBody();

    List<XWPFPictureData> allPictures = append.getAllPictures();    // 记录图片合并前及合并后的ID    Map<String, String> 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);    }

    appendBody(src1Body, src2Body, map);

}

private static void appendBody(CTBody src, CTBody append, Map<String, String> 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("<"));//下面这部分可以去掉,我加上的原因是合并的时候,有时候出现打不开的情况,对照document.xml将某些标签去掉就可以正常打开了    addPart = addPart.replaceAll("w14:paraId=\"[A-Za-z0-9]{1,10}\"", "");    addPart = addPart.replaceAll("w14:textId=\"[A-Za-z0-9]{1,10}\"", "");    addPart = addPart.replaceAll("w:rsidP=\"[A-Za-z0-9]{1,10}\"", "");    addPart = addPart.replaceAll("w:rsidRPr=\"[A-Za-z0-9]{1,10}\"", "");    addPart = addPart.replace("<w:headerReference r:id=\"rId8\" w:type=\"default\"/>","");    addPart = addPart.replace("<w:footerReference r:id=\"rId9\" w:type=\"default\"/>","");    addPart = addPart.replace("xsi:nil=\"true\"","");

    if (map != null && !map.isEmpty()) {        //对xml字符串中图片ID进行替换        for (Map.Entry<String, String> set : map.entrySet()) {            addPart = addPart.replace(set.getKey(), set.getValue());        }    }    //将两个文档的xml内容进行拼接    CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart + sufix);

    src.set(makeBody);}

原文地址:https://www.cnblogs.com/muliu/p/12166092.html

时间: 2024-08-07 11:00:32

基于java处理.docx格式的word合并的相关文章

合并.doc和docx格式的Word文件

注:摘录自 https://www.cnblogs.com/shenzhouyh/articles/7243805.html 之前用过jacob 合并.doc,但是这种只能在windows环境使用,所以弃用了,下面这种方法打开word是html格式的 我遇到的问题是下载并合并附件,这里的附件大多是doc文件,也包含少量的docx文件,但是文件路径是从数据库中读取出来的,均不带后缀名,传统的xwpfdocument和hwpfdocument不能完全解决我的问题:尤其是将文件合并,不能轻易办到,需要

Lucene:基于Java的全文检索引擎简介 (zhuan)

http://www.chedong.com/tech/lucene.html ********************************************** Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基于词库和自动切分词算法的比较 具体的安装和使用简介:系统结构介绍和演示 Hacking Lucene:简化的查询分析器,删除的

Lucene:基于Java的全文检索引擎简介

Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基于词库和自动切分词算法的比较 具体的安装和使用简介:系统结构介绍和演示 Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展 从Lucene我们还可以学到什么 另外,如果是在选择全文引擎,现在也许是试试 Sphinx的时候了:相比Lucene速度更快, 有中文分词的

这里整理了基于java平台的常用资源

这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.thanks. 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化的方式进行配置,所以维护起来相当困难. Gradle:Gradle采用增量构建.Gra

Python:读取 .doc、.docx 两种 Word 文件简述及“Word 未能引发事件”错误

Python 中可以读取 word 文件的库有 python-docx 和 pywin32.   优点 缺点 python-docx 跨平台 只能处理 .docx 格式,不能处理.doc格式 pywin32 仅限 windows 平台 .doc 和 .docx 都能处理 pywin32 这个库很强大,不仅仅可以读取 word,但是网上介绍用 pywin32 读取 .doc 的文章真不多,因为,真心不好用. 以下是 pywin32 读取 .doc 的代码示例,但是读取表格有问题,输出全是空,原因不

2020_1课程设计—基于BC的证书格式转换工具的设计与实现—Week1

2020_1课程设计-基于BC的证书格式转换工具的设计与实现-Week1 目录 2020_1课程设计-基于BC的证书格式转换工具的设计与实现-Week1 任务要求 Week1 任务安排 实践过程 学习证书格式的相关知识 学习OpenSSL的使用方法 安装OpenSSL 使用OpenSSL查看证书,并实现证书格式转换 创建根证书CA 颁发证书 证书格式转换 遇到问题 参考链接 任务要求 清楚.pem .pfx /.keystore .crt .cer .der 这些格式的文件用openssl如何产

CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据

本文参考链接详细介绍如何使用Jsoup包抓取HTML数据,是一个纯java工程,并将其打包成jar包.希望了解如何用java语言爬虫网页的可以看下. 杂家前文就又介绍用HTTP访问百度主页得到html的string字符串,但html的文本数据如果不经过处理就是个文本字符串没有任何效果的.所谓的浏览器就是负责将文本的html"翻译"成看到的界面.在前文有介绍,这个csdn的客户端app分首页.业界.移动.研发.程序员.云计算五大类.以业界为例,http://news.csdn.net/ 

POI加dom4j将数据库的数据按一定格式生成word文档

一:需求:将从数据库查处来的数据,生成word文档,并有固定的格式.(dom4j的jar包+poi的jar包) 二:解决:(1)先建立固定格式的word文档(2007版本以上),另存成为xml文件,作为模板.(修改xml节点,添加属性,用于标示要填固定数据的节点) (2)dom4j解析模板xml文件,将文件读入内存,并把数据库数据写入内存的xml模型中 (3)利用poi将内存中的含有数据库内容的xml模型转换成word内存模型,利用输出流输出word文档 三:DEMO [1]模板的word文档

最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)

打算记录一下基于FFmpeg的封装格式处理方面的例子.包括了视音频分离,复用,封装格式转换.这是第3篇. 本文记录一个基于FFmpeg的视音频复用器(Simplest FFmpeg muxer).视音频复用器(Muxer)即是将视频压缩数据(例如H.264)和音频压缩数据(例如AAC)合并到一个封装格式数据(例如MKV)中去.如图所示.在这个过程中并不涉及到编码和解码. 本文记录的程序将一个H.264编码的视频码流文件和一个MP3编码的音频码流文件,合成为一个MP4封装格式的文件. 流程 程序的