Java读写Word文档:全面指南

Java读写Word文档:全面指南

在Java开发中,经常需要处理Word文档,例如生成报告、导入数据或解析文档内容。本文将深入探讨两种主流的Java库:Apache POI和Docx4j,并展示如何高效地读写Word文档。

1. 环境准备

首先,需要在项目中引入依赖。以Maven为例:

<!-- Apache POI for .doc and .docx -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>

<!-- Docx4j for .docx -->
<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
    <version>8.3.9</version>
</dependency>

注意:Apache POI支持旧版.doc和新版.docx,而Docx4j专精于.docx(Open XML格式)。

2. 使用Apache POI读写Word文档

2.1 读取Word文档

import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;

public class ReadDocx {
    public static void main(String[] args) throws Exception {
        try (FileInputStream fis = new FileInputStream("example.docx");
             XWPFDocument document = new XWPFDocument(fis)) {
            for (XWPFParagraph paragraph : document.getParagraphs()) {
                System.out.println(paragraph.getText());
            }
            for (XWPFTable table : document.getTables()) {
                for (XWPFTableRow row : table.getRows()) {
                    for (XWPFTableCell cell : row.getTableCells()) {
                        System.out.print(cell.getText() + "\t");
                    }
                    System.out.println();
                }
            }
        }
    }
}

2.2 创建Word文档

import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;

public class CreateDocx {
    public static void main(String[] args) throws Exception {
        try (XWPFDocument document = new XWPFDocument();
             FileOutputStream out = new FileOutputStream("created.docx")) {
            // 创建段落
            XWPFParagraph paragraph = document.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("Hello, World!");
            run.setBold(true);
            run.setFontSize(24);
            // 创建表格
            XWPFTable table = document.createTable(2, 3);
            table.getRow(0).getCell(0).setText("A1");
            table.getRow(0).getCell(1).setText("B1");
            document.write(out);
        }
    }
}

3. 使用Docx4j操作Word文档

3.1 读取Word文档

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

public class ReadDocx4j {
    public static void main(String[] args) throws Exception {
        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File("example.docx"));
        MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
        String text = documentPart.getContent().toString();
        System.out.println(text);
    }
}

3.2 创建Word文档

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.wml.ObjectFactory;
import org.docx4j.wml.P;
import org.docx4j.wml.R;
import org.docx4j.wml.Text;
import java.io.File;

public class CreateDocx4j {
    public static void main(String[] args) throws Exception {
        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
        ObjectFactory factory = new ObjectFactory();
        P paragraph = factory.createP();
        R run = factory.createR();
        Text text = factory.createText();
        text.setValue("Hello from Docx4j!");
        run.getContent().add(text);
        paragraph.getContent().add(run);
        wordMLPackage.getMainDocumentPart().getContent().add(paragraph);
        wordMLPackage.save(new File("created_docx4j.docx"));
    }
}

4. 高级操作与注意事项

  • 样式与格式化:POI通过XWPFRun设置字体、颜色、加粗等;Docx4j需操作WML对象。
  • 图片与嵌入对象:POI使用XWPFRun.addPicture();Docx4j需要添加关系并创建绘图元素。
  • 模板替换:Docx4j适合邮件合并,POI可配合XWPFParagraphgetRuns()进行文本替换。
  • 性能对比:POI社区活跃,支持较全;Docx4j在复杂文档结构上更强大,但学习曲线稍陡。

5. 总结

本文介绍了使用Java读写Word文档的两种主流方案。Apache POI适合快速开发和兼容性要求高的场景,而Docx4j则更适合需要精细控制文档结构和内容替换的复杂应用。根据项目需求选择合适的工具,可大幅提高开发效率。