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

- 解析 HTML:读取 HTML 文件或字符串,并定位到包含表格数据的
<table>元素。 - 提取数据:遍历
<table>中的<tr>(行) 和<td>/<th>(单元格),提取出文本内容。 - 写入 Excel:创建一个新的 Excel 文件,并将提取出的数据逐行逐列地写入到 Excel 的单元格中。
使用 Apache POI (纯 Java 方案)
Apache POI 是 Java 操作 Office 文件(如 Excel, Word)最权威、最强大的库,它不依赖任何外部工具,完全在 JVM 中运行,非常适合服务器端应用。
优点
- 功能强大:可以创建复杂的 Excel 文件,设置样式、公式、图表等。
- 纯 Java:无需安装额外软件,环境依赖简单。
- 社区活跃:文档丰富,问题容易找到解决方案。
缺点
- 代码量稍多:相比于一些封装好的库,需要写更多代码来完成 HTML 解析和 Excel 写入。
- HTML 解析需手动处理:你需要自己使用
Jsoup或其他 HTML 解析器来处理 HTML。
实现步骤
-
添加依赖:你需要同时添加
Apache POI和Jsoup(用于解析 HTML)的依赖。<!-- pom.xml --> <dependencies> <!-- Apache POI for Excel --> <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 --> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.15.3</version> </dependency> </dependencies> -
编写 Java 代码
import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class HtmlToExcelConverter { public static void main(String[] args) { String htmlFilePath = "path/to/your/input.html"; // 替换为你的HTML文件路径 String excelFilePath = "path/to/your/output.xlsx"; // 替换为你想要输出的Excel文件路径 try { convertHtmlTableToExcel(htmlFilePath, excelFilePath); System.out.println("Excel 文件生成成功: " + excelFilePath); } catch (IOException e) { System.err.println("转换过程中发生错误: " + e.getMessage()); e.printStackTrace(); } } public static void convertHtmlTableToExcel(String htmlPath, String excelPath) throws IOException { // 1. 使用 Jsoup 解析 HTML 文件 Document doc = Jsoup.parse(new File(htmlPath), "UTF-8"); // 假设我们要转换第一个 <table> 标签 Element table = doc.select("table").first(); if (table == null) { throw new RuntimeException("HTML 文件中未找到 <table> 标签。"); } // 2. 创建 Excel 工作簿和工作表 Workbook workbook = new XSSFWorkbook(); // 使用 .xlsx 格式 Sheet sheet = workbook.createSheet("Sheet1"); // 3. 提取表格数据并写入 Excel int rowNum = 0; // 获取所有的行 <tr> Elements rows = table.select("tr"); for (Element row : rows) { Row excelRow = sheet.createRow(rowNum++); // 获取所有的单元格 <td> 和 <th> Elements cells = row.select("td, th"); int colNum = 0; for (Element cell : cells) { Cell excelCell = excelRow.createCell(colNum++); // 获取单元格文本内容,并去除前后空格 excelCell.setCellValue(cell.text().trim()); } } // 4. 自动调整列宽以适应内容 for (int i = 0; i < rows.get(0).select("td, th").size(); i++) { sheet.autoSizeColumn(i); } // 5. 将工作簿写入文件 try (FileOutputStream fileOut = new FileOutputStream(excelPath)) { workbook.write(fileOut); } workbook.close(); } }
使用 Flying Saucer (XHTMLRenderer) + Apache POI
如果你的 HTML 内容比较复杂,包含 CSS 样式,并且希望这些样式能尽量保留在 Excel 中,可以使用 Flying Saucer 库,它可以将 XHTML (符合 XML 规范的 HTML) 渲染成图片,然后将图片插入到 Excel 中。

优点
- 保留样式:可以处理复杂的 CSS 布局和样式,将表格以图片形式完整呈现。
- 所见即所得:输出的是表格的快照,格式不会错乱。
缺点
- 数据不可检索:Excel 中的内容是图片,无法直接复制或进行数据分析。
- 性能开销大:渲染图片比提取文本要慢得多。
- 依赖字体和图片:需要确保服务器上安装了相应的字体。
实现步骤
-
添加依赖:
<!-- pom.xml --> <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> <!-- Flying Saucer --> <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf</artifactId> <version>9.1.22</version> </dependency> <!-- 或者使用 flying-saucer-image --> <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-image</artifactId> <version>9.1.22</version> </dependency> </dependencies> -
编写 Java 代码 (概念性)
这个方案更复杂,通常的流程是: a. 准备一个完整的 XHTML 文档,包含
<html>,<head>(内联 CSS),<body>(你的表格)。 b. 使用Flying Saucer将 XHTML 渲染成一个BufferedImage(图片)。 c. 使用Apache POI创建一个 Excel 文件,并使用WorkbookHelper或类似方法将生成的图片插入到指定单元格。由于代码较长且涉及图片处理,这里不给出完整示例,但其核心逻辑是:HTML -> 图片 -> Excel。
(图片来源网络,侵删)
使用现成的转换库 (html-to-excel)
有一些第三方库专门封装了上述逻辑,使用起来非常简单,几行代码就能搞定。
优点
- 极其简单:API 设计友好,代码量最少。
- 快速上手:适合快速实现功能,对底层细节不感兴趣的场景。
缺点
- 灵活性差:功能可能受限,难以处理特殊情况或进行深度定制。
- 维护性:社区可能不如 Apache POI 活跃,需要自行评估库的稳定性。
示例 (以 html-to-excel 为例)
-
添加依赖:
<!-- pom.xml --> <dependency> <groupId>com.github.romankh3</groupId> <artifactId>html-to-excel</artifactId> <version>1.0.3</version> </dependency> -
编写 Java 代码:
import com.romankh3.html2excel.Html2Excel; import com.romankh3.html2excel.Options; import java.io.File; import java.io.IOException; public class SimpleHtmlToExcelConverter { public static void main(String[] args) { String htmlFilePath = "path/to/your/input.html"; String excelFilePath = "path/to/your/output.xlsx"; try { // 创建选项对象,可以指定工作表名称 Options options = Options.builder().withSheetName("My Data").build(); // 一行代码完成转换 Html2Converter.fromFile(new File(htmlFilePath)) .toFile(new File(excelFilePath), options); System.out.println("Excel 文件生成成功: " + excelFilePath); } catch (IOException e) { System.err.println("转换过程中发生错误: " + e.getMessage()); e.printStackTrace(); } } }
使用 Selenium + Apache POI
如果你的 HTML 表格是通过 JavaScript 动态加载的,静态解析库(如 Jsoup)就无法获取到数据,这时,可以使用 Selenium 来驱动浏览器,等待页面加载完成后再获取 HTML 源码。
优点
- 处理动态内容:可以抓取由 JS 动态生成的表格数据。
- 模拟真实用户:可以处理复杂的交互和渲染逻辑。
缺点
- 性能极低:需要启动浏览器,非常耗时,不适合批量或高频任务。
- 环境依赖复杂:需要安装对应浏览器的 WebDriver。
实现步骤 (概念性)
-
添加依赖:
<!-- Selenium WebDriver --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.8.1</version> </dependency> -
编写 Java 代码 (概念性)
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.jsoup.Jsoup; // 复用 Jsoup import org.apache.poi.ss.usermodel.*; // 复用 POI // ... (省略 POI 和 Jsoup 的导入) public class SeleniumHtmlToExcelConverter { public static void main(String[] args) { // 1. 设置 WebDriver 路径 System.setProperty("webdriver.chrome.driver", "path/to/chromedriver"); // 2. 使用 Selenium 加载页面 WebDriver driver = new ChromeDriver(); driver.get("https://your-website.com/dynamic-table"); // 3. 获取渲染后的 HTML 源码 String pageSource = driver.getPageSource(); // 4. 关闭浏览器 driver.quit(); // 5. 使用 Jsoup 和 POI 转换 HTML (逻辑与方案一相同) // ... (调用方案一的 convertHtmlTableToExcel 方法) } }
总结与选择建议
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Apache POI + Jsoup | 功能强大、纯Java、灵活 | 代码量稍多,HTML解析需手动 | 首选方案,适用于绝大多数静态 HTML 表格转换,需要自定义格式和逻辑的服务器端应用。 |
| Flying Saucer + POI | 保留复杂CSS样式,所见即所得 | 数据不可检索,性能开销大 | 当表格样式非常复杂,且输出结果必须是图片格式时(如报表截图)。 |
| 现成转换库 | 极其简单,快速开发 | 灵活性差,依赖第三方库 | 快速原型开发或需求简单明确,不关心底层实现。 |
| Selenium + POI | 能处理动态加载的表格 | 性能极低,环境依赖复杂 | 最后手段,当表格数据完全由 JS 生成,且无法通过 API 获取时。 |
对于大多数 Java 方案一(Apache POI + Jsoup)是最佳实践,它在灵活性、性能和功能之间取得了最好的平衡。
