- 生成 Word 文档:从数据源(可能是数据库、API,甚至是 HTML 字符串)创建一个
.docx文件。 - 解析 Word 文档:读取
.docx文件中的内容,并将其转换为 HTML 或其他格式。
下面我将详细讲解这两个任务,并提供代码示例和主流库的对比。

核心概念
.docx文件:它本质上是一个 ZIP 压缩包,里面包含了 XML 文件、图片、样式等,了解这一点有助于理解为什么有些库可以操作它。- HTML 到 Word:HTML 本身就有很好的结构,可以比较容易地映射到 Word 的段落、表格、列表等元素,关键在于如何将 HTML 标签正确地转换为 Word 的对象模型。
- Word 到 HTML:需要解析 Word 复杂的内部结构(如样式、字体、页眉页脚、图片等),并将其映射到 HTML 标签,这是一个比反向转换更复杂的过程。
生成 Word 文档
根据你的需求,生成 Word 文档可以分为两种情况:
A. 从 HTML 字符串生成 Word 文档
这是最直接的需求,你有一个 HTML 片段,想把它直接变成一个 Word 文档。
推荐库:Apache POI + docx4j
这是一个非常强大的组合,可以让你像操作 XML 一样精确地控制 Word 文档。
添加 Maven 依赖

<dependencies>
<!-- Apache POI - 核心 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<!-- docx4j - 用于处理 WordML (OOXML) -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j</artifactId>
<version>11.4.4</version>
</dependency>
</dependencies>
Java 代码示例
这个例子将一个简单的 HTML 字符串写入到一个新的 Word 文档中。
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.*;
import java.io.File;
import java.math.BigInteger;
public class HtmlToDocx {
public static void main(String[] args) throws Exception {
// 1. 准备 HTML 内容
String htmlContent = "<h1>这是一个标题</h1>" +
"<p>这是一个段落,包含<strong>粗体</strong>和<em>斜体</em>文本。</p>" +
"<ul><li>列表项 1</li><li>列表项 2</li></ul>";
// 2. 创建一个空的 WordprocessingMLPackage (一个空的 .docx 文件)
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
// 3. 获取主文档部分
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
// 4. 将 HTML 内容转换为 WordML (OOXML) 并添加到文档中
// 注意:docx4j 的 HtmlUtil 可以进行转换,但功能有限,复杂 HTML 可能需要更专业的库或手动转换
// 这里我们手动构建一个简单的示例来展示原理
Object result = documentPart.convert(htmlContent);
if (result instanceof P) {
documentPart.addObject(result);
} else {
System.out.println("转换结果不是段落对象,可能需要更复杂的处理。");
// 对于更复杂的转换,可以使用 docx4j 的 HtmlUtil 或其他库
// documentPart.getContent().add(docx4j.utils.HtmlUtil.convert(htmlContent, wordMLPackage));
}
// 手动构建更复杂的 Word 内容 (比直接转换 HTML 更可控)
// 创建标题
P titleP = createStyledParagraph("这是一个标题", "Heading1");
documentPart.getContent().add(titleP);
// 创建段落
P paraP = createStyledParagraph("这是一个段落,包含粗体和斜体文本。", "Normal");
// 在段落中添加文本和运行
R run = paraP.addNewR();
run.addNewT().setValue("这是一个段落,包含");
R boldRun = paraP.addNewR();
boldRun.addNewRPr().addNewB();
boldRun.addNewT().setValue("粗体");
R italicRun = paraP.addNewR();
italicRun.addNewRPr().addNewI();
italicRun.addNewT().setValue("和斜体");
R normalRun = paraP.addNewR();
normalRun.addNewT().setValue("文本。");
documentPart.getContent().add(paraP);
// 5. 保存文档
File output = new File("D:\\temp\\output_from_html.docx");
wordMLPackage.save(output);
System.out.println("Word 文档已成功生成: " + output.getAbsolutePath());
}
/**
* 创建一个带样式的段落
* @param text 段落文本
* @param styleId 样式ID (如 "Heading1", "Normal")
* @return P 对象
*/
private static P createStyledParagraph(String text, String styleId) {
P p = new P();
PPr pPr = new PPr();
PStyle pStyle = new PStyle();
pStyle.setVal(styleId);
pPr.setPStyle(pStyle);
p.setPPr(pPr);
R run = p.addNewR();
run.addNewT().setValue(text);
return p;
}
}
更专业的 HTML 转换库
如果你需要更强大、更可靠的 HTML 到 Word 的转换,可以考虑商业库:

- Aspose.Words for Java:业界公认的非常强大的库,对 HTML、Word、PDF 等格式支持极好,转换效果非常接近原样,但它是商业软件,需要付费。
- iText (iText 7):也是一个强大的商业库,功能全面。
B. 从数据库/Java 对象生成 Word 报告
这种情况通常不是从 HTML 开始,而是从数据结构(如 Java 对象、数据库查询结果)开始,然后填充到 Word 模板中。
推荐库:Apache POI
添加 Maven 依赖
<dependencies>
<!-- Apache POI - 核心 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
</dependencies>
Java 代码示例
这个例子创建一个包含标题、表格和段落的 Word 文档。
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class GenerateWordReport {
public static void main(String[] args) throws IOException {
// 1. 创建一个新的 XWPFDocument 对象
try (XWPFDocument document = new XWPFDocument()) {
// 2. 创建标题
XWPFParagraph title = document.createParagraph();
title.setAlignment(ParagraphAlignment.CENTER); // 居中
XWPFRun titleRun = title.createRun();
titleRun.setText("月度销售报告");
titleRun.setBold(true);
titleRun.setFontSize(20);
titleRun.setColor("333333"); // 十六进制颜色
// 3. 创建一个表格
XWPFTable table = document.createTable();
table.setWidth(9000); // 设置表格宽度
// 创建表头行
XWPFTableRow headerRow = table.getRow(0);
headerRow.getCell(0).setText("产品名称");
headerRow.addNewTableCell().setText("销售数量");
headerRow.addNewTableCell().setText("销售额");
// 创建数据行
XWPFTableRow dataRow1 = table.createRow();
dataRow1.getCell(0).setText("笔记本电脑");
dataRow1.getCell(1).setText("120");
dataRow1.getCell(2).setText("¥1,200,000");
XWPFTableRow dataRow2 = table.createRow();
dataRow2.getCell(0).setText("智能手机");
dataRow2.getCell(1).setText("350");
dataRow2.getCell(2).setText("¥1,750,000");
// 4. 创建总结段落
XWPFParagraph summary = document.createParagraph();
XWPFRun summaryRun = summary.createRun();
summaryRun.setText("本月总销售额为 ¥2,950,000,较上月增长 15%。");
summaryRun.setItalic(true);
// 5. 将文档写入文件
try (FileOutputStream out = new FileOutputStream("D:\\temp\\sales_report.docx")) {
document.write(out);
}
}
System.out.println("Word 报告已成功生成: D:\\temp\\sales_report.docx");
}
}
解析 Word 文档为 HTML
将一个复杂的 .docx 文件转换为 HTML,需要处理样式、图片、表格等多种元素,这比生成要困难。
推荐库:Apache POI
Apache POI 提供了将 Word 转换为 HTML 的功能,虽然效果可能不是 100% 完美,但对于大多数场景已经足够。
添加 Maven 依赖
<dependencies>
<!-- Apache POI - 核心 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
</dependencies>
Java 代码示例
这个例子读取一个 Word 文件,并将其内容保存为 HTML 文件。注意:Word 文件中有图片,POI 会将图片提取出来,并生成一个与 HTML 文件同名的文件夹来存放图片。
import org.apache.poi.xwpf.converter.core.BasicURIResolver;
import org.apache.poi.xwpf.converter.core.FileImageExtractor;
import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import java.io.*;
public class WordToHtml {
public static void main(String[] args) throws Exception {
// 1. 源 Word 文件路径
String wordPath = "D:\\temp\\sales_report.docx";
// 2. 目标 HTML 文件路径
String htmlPath = "D:\\temp\\sales_report.html";
// 3. 图片输出目录
String imageDir = "D:\\temp\\images";
// 确保图片目录存在
new File(imageDir).mkdirs();
// 4. 加载 Word 文档
try (XWPFDocument document = new XWPFDocument(new FileInputStream(wordPath))) {
// 5. 设置转换选项
XHTMLOptions options = XHTMLOptions.create();
// 设置图片提取器,将图片保存到指定目录
options.setExtractor(new FileImageExtractor(new File(imageDir)));
// 设置 URI 解析器,用于在 HTML 中引用图片
options.URIResolver(new BasicURIResolver(imageDir));
// 6. 创建 HTML 输出流
try (OutputStream out = new FileOutputStream(htmlPath)) {
// 7. 执行转换
XHTMLConverter.getInstance().convert(document, out, options);
}
}
System.out.println("Word 文档已成功转换为 HTML: " + htmlPath);
System.out.println("图片已保存到目录: " + imageDir);
}
}
重要提示:上面的代码用到了 poi-xwpf-converter 这个子模块,它可能不在 poi-ooxml 的核心依赖中,如果你的 Maven 仓库中没有,你需要单独添加:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.2.3</version>
</dependency>
<!-- 或者更现代的转换器 -->
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.poi.xwpf.converter.xhtml</artifactId>
<version>2.0.3</version>
</dependency>
使用 fr.opensagres 的转换器通常效果更好,也是社区推荐的。
总结与对比
| 库名称 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Apache POI | 开源免费、社区活跃、功能全面(支持 Excel、Word、PPT)、从 Java 对象生成 Word 报告非常方便。 | API 相对底层,学习曲线较陡;HTML 到 Word 的转换功能有限;Word 到 HTML 的转换效果可能不完美。 | 从数据库/Java 对象生成结构化的 Word 报告。 解析 Word 文档内容(文本、表格)。 将 Word 文档转换为 HTML(基础功能)。 |
| docx4j | 开源免费、对 Word 的底层结构(OOXML)支持非常精细,可以精确控制文档的每一个细节。 | API 复杂,学习成本高;转换 HTML 的能力不如 POI 或商业库。 | 需要对 Word 文档进行底层、精细操作的复杂场景。 |
| Aspose.Words | 功能极其强大、转换效果最好(HTML -> Word, Word -> HTML)、API 设计优秀、文档齐全。 | 商业软件,价格昂贵。 | 对文档保真度要求极高的项目,如需要将复杂的 HTML 网页完美地转换为 Word 文档。 |
| iText | 功能强大、商业上非常成熟稳定、除了 Word 还能处理 PDF 等。 | 商业软件,价格昂贵。 | 需要在一个项目中同时处理多种文档格式(Word, PDF, HTML 等)的企业级应用。 |
给你的建议:
- 如果你是初学者或只是做简单的报告生成:从 Apache POI 开始,它足够强大且免费。
- 如果你的核心需求是把一个现成的、复杂的 HTML 网页或字符串变成一个一模一样的 Word 文档:可以考虑使用 Aspose.Words 的试用版,如果效果好再决定是否购买。
- 如果你需要做非常底层的 Word 文档定制:可以研究一下 docx4j。
希望这个详细的解释和代码示例能帮助你解决问题!
