如何通过Java程序合并Word文档

Posted Gia-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过Java程序合并Word文档相关的知识,希望对你有一定的参考价值。

合并Word文档是指将多个Word文档的内容、样式和格式合并成一个新的Word文档。这个功能通常在需要整合多个文档内容时使用,比如在对多个人员提交的文档进行汇总、审阅或编辑时。通过合并Word文档,可以大大提高工作效率,减少手动复制粘贴等繁琐操作,同时保留原始文档的格式和样式,使得最终生成的合并文档看起来更加规范、美观。本文将介绍如何通过Free Spire.Doc for Java组件来合并Word文档。下面是具体方法和示例代码。

程序环境:

IntelliJ IDEA 2018 (jdk 1.8.0)

在进行操作之前先导入jar包,请参考以下两种导入方式:

方法一:如果使用的是 maven,可以添加以下代码到项目的 pom.xml 文件中。

<repositories>

    <repository>

        <id>com.e-iceblue</id>

        <name>e-iceblue</name>

        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>

    </repository>

</repositories>

<dependencies>

    <dependency>

        <groupId>e-iceblue</groupId>

        <artifactId>spire.doc.free</artifactId>

        <version>5.2.0</version>

    </dependency>

</dependencies>

方法二如果没有使用 maven,则可以从此链接下载Free Spire.Doc for Java,找到lib文件夹下的Spire.doc.jar并进行解压;然后在IDEA中创建一个新项目,依次点击“文件”(File),“项目结构”(Project Structure),“组件”(Modules),“依赖项”(Dependencies),再点击右方绿色“+”下的第一个选项“jar文件或路径”(JARs or Directories),找到解压后的Spire.doc.jar 文件,点击确认,将其导入到项目中。

通过插入文档来合并文档

这一方法是指在文档最后,新起一页插入另外的文档。

方法步骤:

  • 创建Document类的对象并加载一个示例文档。
  • 使用 Document.insertTextFromFile()方法将另一个 Word 文档完全插入到加载的该文档。
  • 使用Document.saveToFile()方法保存结果文档。

示例代码:

import com.spire.doc.*;

public class merge 
    public static void main(String[] args) 
        //创建Document对象并加载一个示例文档
        Document document = new Document("sample1.docx");

        //将另一个Word文档完全插入到文档中
        document.insertTextFromFile("sample2.docx", FileFormat.Docx_2013);

        //保存结果文档
        document.saveToFile("result1.docx", FileFormat.Docx_2013);
    

通过复制内容来合并文档

这一方法是指将文档内容插入到指定文档最后,不另起一页。

方法步骤:

  • 创建两个Document对象并加载两个示例文档。
  • 遍历第二个文档,通过Document.getSections()方法获取所有节。
  • 遍历所有节,通过Section.getBod().getChildObjects()方法以获取其子对象。
  • 使用 Document.getLastSection()方法获取第一个文档的最后一节。
  • 使用Body.getChildObjects().add()方法将子对象添加到第一个文档的最后一节中。
  • 使用Document.saveToFile()方法保存结果文档。

示例代码:

import com.spire.doc.*;

public class mergeDocuments 
    public static void main(String[] args)
        //创建两个Document对象并加载两个示例文档
        Document document1 = new Document("sample1.docx");
        Document document2 = new Document("sample2.docx");

        //遍历第二个文档,获取所有节
        for (Object sectionObj : (Iterable) document2.getSections()) 
            Section sec=(Section)sectionObj;
            //遍历第二个文档的所有节,获取其子对象
            for (Object docObj :(Iterable ) sec.getBody().getChildObjects()) 
                DocumentObject obj=(DocumentObject)docObj;

                //获取第一个文档的最后一节
                Section lastSection = document1.getLastSection();

                //将子对象添加到第一个文档的最后一节中
                Body body = lastSection.getBody();
                body.getChildObjects().add(obj.deepClone());
            
        

        //保存结果文档
        document1.saveToFile("result2.docx", FileFormat.Docx_2013);
    

[原创]java合并word文件

需求背景

  在互联网教育行业,做内容相关的项目经常碰到的一个问题就是如何动态生成一张word试卷。事先把题库中的每一道试题都已经保存成一个独立的word文件了,但是在选择了部分试题生成一张word试卷的时候,如果不能通过java程序来合并已经选择了的word试题文件,那么就只能通过手动录入和拷贝的方式来合并word内容,效率低下,而且人工成本和录入出错率都较高。

问题难点

  使用POI来实现word合并需要面对的困难主要有以下几个方面:

  • word 结构问题 —— word不开源,且含有很多非文本内容,比如图表、图片,而已知的常规方法只能解析纯文本内容,所以如果不知道word内部层级结构,解析将难以进行。
  • word 版本问题 —— 目前word有docx和doc两种文档格式,解析是否要全部兼容?当然,前提是已经成功解析一种类型。
  • word 规范问题 —— 有些word可能是早期制作的,返工代价太大,所以格式内容多样化。而且就算制定word格式规范,新制作的word也无法保证格式一定正确。

  使用Jacob来实现word文档合并要面对的问题:

  • 服务器必须是Windows操作系统 —— 目前之所以web项目多用Java开发,就是因为服务器可以是Linux、Unix等非Windows的系统来降低项目的成本。
  • 服务器上必须安装Office —— Jacob的意思就是: Java COM Bridge,java中调用office提供的com接口来实现对Office文件的操作。
  • 并发问题 —— 如果多用户同时在线生成word文件就必须处理此并发问题,稍有不慎,就会在服务器端产生Office的死进程,死锁服务器的内存资源。

解决方案

  问题研究一段时间后,进展缓慢,在反复百度的过程中发现PageOffice提供了很好的解决方案,并且在PageOffice的示例程序中就有相关的演示,只不过PageOffice的演示示例是把word文件以二进制流的形式保存在数据库中,只需要在自己的项目中改为用磁盘文件的方式保存word文件就可以了。PageOffice方案采用了调用客户端Office接口进行word文档合并,这样就同时解决了word格式问题、版本问题、规范问题和多用户的并发问题,对服务器端也没有任何要求,堪称完美。

  PageOffice for Java的开发包下载地址:http://www.zhuozhengsoft.com/dowm/ ,拷贝解压出来的 Samples4 文 件 夹 到 Tomcat 的 Webapps 目 录 下 , 访 问 : http://localhost:8080/Samples4/index.html,查看综合演示: 三、2、在Word文档中动态生成一张试卷

  

  

  

以上是关于如何通过Java程序合并Word文档的主要内容,如果未能解决你的问题,请参考以下文章

Java 合并Word文档

如何通过AsposeWords合并两个word文档

[原创]java合并word文件

如何通过Java代码向Word文档添加文档属性

[java,2017-05-04] 合并word文档

Java 打印Word文档