Java合并Word文档的几种实用方法

概述

合并Word文档是办公自动化中的常见需求。Java生态中提供了多种库来操作Word文件,其中Apache POI和Docx4j最为常用。本文将分别介绍它们的使用方式,并对比优缺点。

方法一:使用Apache POI

Apache POI支持读写Microsoft Office格式,包括.doc(HWPF)和.docx(XWPF)。对于合并文档,推荐使用XWPF处理.docx格式。

合并.docx文件

import org.apache.poi.xwpf.usermodel.*;
import java.io.*;
import java.util.List;

public class MergeDocx {
    public static void main(String[] args) throws Exception {
        // 源文件列表
        String[] sources = {"file1.docx", "file2.docx"};
        XWPFDocument mergedDoc = new XWPFDocument();
        
        for (String src : sources) {
            try (FileInputStream fis = new FileInputStream(src)) {
                XWPFDocument srcDoc = new XWPFDocument(fis);
                // 追加段落
                for (XWPFParagraph para : srcDoc.getParagraphs()) {
                    XWPFParagraph newPara = mergedDoc.createParagraph();
                    newPara.getCTP().set(para.getCTP());
                }
                // 追加表格
                for (XWPFTable table : srcDoc.getTables()) {
                    mergedDoc.createTable().getCTTbl().set(table.getCTTbl());
                }
                srcDoc.close();
            }
        }
        
        // 保存合并后的文档
        try (FileOutputStream fos = new FileOutputStream("merged.docx")) {
            mergedDoc.write(fos);
        }
        mergedDoc.close();
    }
}

注意:直接拷贝段落和表格可以保留大部分样式,但可能丢失页眉页脚、图片等。更完善的方案需要深拷贝底层XML对象。

合并.doc文件

对于旧的.doc格式,使用HWPF:

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.*;
import java.io.*;

public class MergeDoc {
    public static void main(String[] args) throws Exception {
        HWPFDocument mergedDoc = new HWPFDocument();
        // 复制段落等内容...
        // 注意:HWPF的操作相对复杂,建议使用Apache POI的HWPFExtractor
    }
}

方法二:使用Docx4j

Docx4j是一个专门用于处理.docx文件的Java库,它基于Open XML标准,功能强大。

合并.docx

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import java.io.File;
import java.util.List;

public class MergeDocx4j {
    public static void main(String[] args) throws Exception {
        WordprocessingMLPackage mergedPackage = WordprocessingMLPackage.createPackage();
        MainDocumentPart mergedMain = mergedPackage.getMainDocumentPart();
        
        String[] files = {"file1.docx", "file2.docx"};
        for (String f : files) {
            WordprocessingMLPackage srcPackage = WordprocessingMLPackage.load(new File(f));
            MainDocumentPart srcMain = srcPackage.getMainDocumentPart();
            // 追加内容
            mergedMain.getContent().addAll(srcMain.getContent());
        }
        
        mergedPackage.save(new File("merged.docx"));
    }
}

这种方法简单直接,但需要注意:合并后文档的样式、图片等资源可能引用冲突。建议使用Docx4j提供的MergeDocx工具类进行深度合并。

方法三:使用iText(仅适合PDF思路)

iText主要用于PDF,虽然可以加载Word文档(通过其他方式转换),但一般不推荐直接用于Word合并。建议使用前两种方案。

注意事项

  • 格式兼容性:确保所有源文档格式一致(如都是.docx),否则可能出现样式错乱。
  • 资源管理:合并图片、页眉页脚等需要额外处理,建议使用专业库如Docx4j的AdvancedMerge。
  • 性能:对于大文件,注意内存占用,可考虑流式处理。

总结

本文介绍了使用Java合并Word文档的常用方法。Apache POI适合简单场景,Docx4j更适合对格式要求高的场景。根据实际需求选择合适的技术方案。