核心思路
无论使用哪种库,基本流程都相似:

- 引入依赖:将你选择的库添加到你的项目中(如 Maven 或 Gradle)。
- 加载 Word 文档:使用库提供的 API 读取
.doc或.docx文件。 - 转换并保存:调用转换方法,将内容保存为
.html文件。
使用 Apache POI (推荐,功能最强大)
Apache POI 是 Java 操作 Office 文档最著名的库,它本身不直接提供 Word 到 HTML 的转换,但可以与另一个库 JSoup 结合使用,通过解析 Word 的 XML 结构(针对 .docx)来实现转换。
优点:
- 完全免费和开源:Apache 2.0 许可证。
- 功能极其强大:不仅可以读取,还可以创建、修改 Word 文档的几乎所有元素(段落、表格、图片、样式等)。
- 社区活跃:遇到问题很容易找到解决方案。
缺点:
- 对于纯
.doc(旧格式) 的支持不如.docx(新格式) 好。 - 转换逻辑需要自己编写,不如商业库“一键式”方便。
实现步骤 (针对 .docx)
添加 Maven 依赖

<dependencies>
<!-- Apache POI for .docx files -->
<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>
<!-- JSoup for HTML parsing and generation -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.3</version>
</dependency>
</dependencies>
编写转换代码
下面是一个完整的示例,它将遍历 .docx 文档中的所有段落、表格和图片,并生成一个结构良好的 HTML 文件。
import org.apache.poi.xwpf.usermodel.*;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.*;
import java.util.List;
public class WordToHtmlConverter {
public static void main(String[] args) {
// 输入的 Word 文件路径 (请确保你的文件存在)
String inputFilePath = "input.docx";
// 输出的 HTML 文件路径
String outputFilePath = "output.html";
try {
convertDocxToHtml(inputFilePath, outputFilePath);
System.out.println("转换成功!HTML 文件已保存到: " + outputFilePath);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void convertDocxToHtml(String docxPath, String htmlPath) throws IOException {
// 1. 加载 Word 文档
XWPFDocument document = new XWPFDocument(new FileInputStream(docxPath));
// 2. 使用 JSoup 创建一个 HTML 文档对象
Document htmlDoc = Jsoup.parse("<html><head><meta charset=\"UTF-8\"></head><body></body></html>");
Element body = htmlDoc.body();
// 3. 遍历文档中的所有元素
for (IBodyElement element : document.getBodyElements()) {
switch (element.getElementType()) {
case PARAGRAPH:
// 处理段落
XWPFParagraph paragraph = (XWPFParagraph) element;
Element p = body.appendElement("p");
// 将段落内容(包括富文本)转换为 HTML 字符串
p.append(paragraph.getParagraphText());
break;
case TABLE:
// 处理表格
XWPFTable table = (XWPFTable) element;
Element htmlTable = body.appendElement("table");
for (XWPFTableRow row : table.getRows()) {
Element htmlRow = htmlTable.appendElement("tr");
for (XWPFTableCell cell : row.getTableCells()) {
Element htmlCell = htmlRow.appendElement("td");
// 递归处理单元格内的段落和表格
for (XWPFParagraph cellParagraph : cell.getParagraphs()) {
htmlCell.append(cellParagraph.getParagraphText());
}
}
}
break;
case CONTENTCONTROL:
// 可以处理其他内容类型,如内容控件
break;
}
}
// 4. 保存 HTML 文件
try (PrintedWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(htmlPath), "UTF-8"))) {
out.println(htmlDoc.outerHtml());
}
// 5. 关闭 Word 文档
document.close();
}
}
代码解释:
XWPFDocument: 代表一个.docx文档。IBodyElement: Word 文档正文中的元素(段落、表格等)的通用接口。Jsoup.parse(): 创建一个空的 HTML 框架,方便我们用 Java 代码构建它。- 代码通过
switch语句判断元素类型,并分别用<p>和<table>标签来构建 HTML 结构。 - 注意:这个简单的示例保留了文本内容,但会丢失大部分格式(如加粗、斜体、字体大小等),要保留格式,需要更复杂的逻辑,通过
paragraph.getRuns()来获取每个文本块的样式信息,并应用相应的 HTML 标签(如<b>,<i>,<span style="...">)。
使用 docx4j (功能强大,专注于 OOXML)
docx4j 是另一个专门处理 Office Open XML 格式(即 .docx, .xlsx, .pptx)的强大库,它内置了转换器,使用起来更直接。

优点:
- 专注于 OOXML,支持非常全面。
- 内置转换器,代码相对简单。
- 同样是开源免费的(LGPL 许可证)。
缺点:
- 依赖较多,包体积较大。
- 对于
.doc格式支持不佳。
添加 Maven 依赖
<dependencies>
<!-- docx4j core -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-core</artifactId>
<version>11.4.4</version>
</dependency>
<!-- 用于转换的包 -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-export-fo</artifactId>
<version>11.4.4</version>
</dependency>
<!-- 如果想转换成 HTML (通过 XHTML) -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
<version>11.4.4</version>
</dependency>
</dependencies>
编写转换代码
import org.docx4j.Docx4J;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.convert.in.xhtml.XHTMLImporterImpl;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class Docx4jConverter {
public static void main(String[] args) {
String inputFilePath = "input.docx";
String outputFilePath = "output_from_docx4j.html";
try {
convertDocxToHtmlWithDocx4j(inputFilePath, outputFilePath);
System.out.println("转换成功!HTML 文件已保存到: " + outputFilePath);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void convertDocxToHtmlWithDocx4j(String docxPath, String htmlPath) throws Exception {
// 1. 加载 Word 文档
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(docxPath));
// 2. 使用内置的转换器转换为 XHTML (与 HTML 高度兼容)
// 注意:docx4j 直接转换到 HTML 的方法可能已经过时或不稳定,
// 转换到 XHTML 是更推荐的做法。
String xhtml = Docx4J.convert(wordMLPackage, XHTMLImporterImpl.class);
// 3. 保存 XHTML 文件
try (OutputStream out = new FileOutputStream(htmlPath)) {
out.write(xhtml.getBytes("UTF-8"));
}
}
}
使用商业库 (如 Aspose.Words)
如果你的项目预算允许,商业库是最佳选择,它们通常以“开箱即用”的方式提供高质量的转换,并且对格式、布局的还原度极高。
优点:
- 转换质量极高:能最大程度地保留原始 Word 文档的格式、布局、字体、图片等。
- API 简单易用:通常一行代码就能完成转换。
- 支持全面:对
.doc和.docx都有很好的支持,还能处理更多复杂场景。 - 提供技术支持:遇到问题可以快速得到官方帮助。
缺点:
- 需要付费:根据使用量和功能类型购买许可证。
- 不开源:代码是黑盒的。
添加 Maven 依赖 (需要从官网下载 JAR)
Aspose.Words 的 JAR 文件需要从其官网下载并手动安装到你的本地仓库或项目中。
编写转换代码 (极其简单)
import com.aspose.words.*;
public class AsposeWordsConverter {
public static void main(String[] args) throws Exception {
// 如果没有许可证,转换后的文档会有水印
// License license = new License();
// license.setLicense("Aspose.Words.Java.lic");
String inputFilePath = "input.docx";
String outputFilePath = "output_from_aspose.html";
// 1. 加载文档
Document doc = new Document(inputFilePath);
// 2. 直接调用 save 方法,指定 SaveFormat.HTML
doc.save(outputFilePath, SaveFormat.HTML);
System.out.println("转换成功!HTML 文件已保存到: " + outputFilePath);
}
}
如你所见,代码非常简洁,这正是商业库的价值所在。
总结与如何选择
| 特性 | Apache POI + JSoup | docx4j | Aspose.Words (商业) |
|---|---|---|---|
| 成本 | 免费 | 免费 | 付费 |
| 易用性 | 中等,需自己编写转换逻辑 | 较简单,内置转换器 | 非常简单 |
| 转换质量 | 一般,需大量工作才能保留格式 | 良好,优于 POI | 优秀,近乎完美还原 |
| 格式支持 | .docx 为主,.doc 较弱 |
.docx 为主,.doc 较弱 |
.doc 和 .docx 都很好 |
| 适用场景 | 对成本敏感,且愿意投入时间进行二次开发的项目。 | 需要较好 OOXML 支持,且不想用商业库的项目。 | 企业级应用,对文档格式还原度有高要求,且预算充足的项目。 |
我的建议:
- 对于个人项目、学习或内部工具:如果你不想花钱,并且愿意深入研究,Apache POI + JSoup 是一个不错的选择,因为它能让你完全掌控转换过程。
- 对于需要快速实现且质量尚可的项目:可以尝试 docx4j,它的 API 比 POI 更直接。
- 对于任何商业项目或对质量有严格要求的应用:强烈推荐 Aspose.Words,它能为你节省大量的开发、测试和维护时间,其稳定性和高质量的输出是物有所值的,你可以先在他们的官网申请一个临时许可证来体验效果。
