杰瑞科技汇

Java如何将Word文档转为HTML?

核心思路

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

Java如何将Word文档转为HTML?-图1
(图片来源网络,侵删)
  1. 引入依赖:将你选择的库添加到你的项目中(如 Maven 或 Gradle)。
  2. 加载 Word 文档:使用库提供的 API 读取 .doc.docx 文件。
  3. 转换并保存:调用转换方法,将内容保存为 .html 文件。

使用 Apache POI (推荐,功能最强大)

Apache POI 是 Java 操作 Office 文档最著名的库,它本身不直接提供 Word 到 HTML 的转换,但可以与另一个库 JSoup 结合使用,通过解析 Word 的 XML 结构(针对 .docx)来实现转换。

优点

  • 完全免费和开源:Apache 2.0 许可证。
  • 功能极其强大:不仅可以读取,还可以创建、修改 Word 文档的几乎所有元素(段落、表格、图片、样式等)。
  • 社区活跃:遇到问题很容易找到解决方案。

缺点

  • 对于纯 .doc (旧格式) 的支持不如 .docx (新格式) 好。
  • 转换逻辑需要自己编写,不如商业库“一键式”方便。

实现步骤 (针对 .docx)

添加 Maven 依赖

Java如何将Word文档转为HTML?-图2
(图片来源网络,侵删)
<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)的强大库,它内置了转换器,使用起来更直接。

Java如何将Word文档转为HTML?-图3
(图片来源网络,侵删)

优点

  • 专注于 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,它能为你节省大量的开发、测试和维护时间,其稳定性和高质量的输出是物有所值的,你可以先在他们的官网申请一个临时许可证来体验效果。
分享:
扫描分享到社交APP
上一篇
下一篇