使用 Apache POI (推荐,最灵活)
这是最常用、最灵活的方法,它不依赖于浏览器,而是通过解析 HTML 的 DOM 结构来构建 Excel 表格,Apache POI 是处理 Office 文件(如 XLS, XLSX)的 Java 库。

核心思想:
- 使用一个 HTML 解析器(如 Jsoup)读取 HTML 文件,提取出
<table>,<tr>,<th>,<td>等标签。 - 遍历这些标签,将表格数据映射到 Apache POI 的
Sheet,Row,Cell对象中。 - 最后使用 POI 将数据写入
.xlsx文件。
步骤 1:添加 Maven 依赖
在你的 pom.xml 文件中添加以下依赖:
<!-- 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>
步骤 2:编写转换代码

假设你有一个名为 sample.html 的文件,内容如下:
<!DOCTYPE html>
<html>
<head>Sample Table</title>
</head>
<body>
<h1>员工信息表</h1>
<table border="1">
<thead>
<tr>
<th>姓名</th>
<th>职位</th>
<th>入职日期</th>
</tr>
</thead>
<tbody>
<tr>
<td>张三</td>
<td>软件工程师</td>
<td>2025-01-15</td>
</tr>
<tr>
<td>李四</td>
<td>产品经理</td>
<td>2025-05-20</td>
</tr>
<tr>
<td>王五</td>
<td>测试工程师</td>
<td>2025-10-10</td>
</tr>
</tbody>
</table>
</body>
</html>
我们编写 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 = "sample.html";
String excelFilePath = "output.xlsx";
try {
convertHtmlToExcel(htmlFilePath, excelFilePath);
System.out.println("HTML 文件已成功转换为 Excel 文件: " + excelFilePath);
} catch (IOException e) {
System.err.println("转换过程中发生错误: " + e.getMessage());
e.printStackTrace();
}
}
public static void convertHtmlToExcel(String htmlFilePath, String excelFilePath) throws IOException {
// 1. 使用 Jsoup 解析 HTML 文件
Document doc = Jsoup.parse(new File(htmlFilePath), "UTF-8");
// 2. 查找第一个 <table> 元素
Element table = doc.select("table").first();
if (table == null) {
throw new RuntimeException("HTML 文件中未找到 <table> 标签。");
}
// 3. 创建一个新的 Excel 工作簿
Workbook workbook = new XSSFWorkbook(); // 使用 .xlsx 格式
Sheet sheet = workbook.createSheet("Sheet1");
// 4. 获取表头和表体行
Elements headerRows = table.select("thead tr");
Elements bodyRows = table.select("tbody tr");
int rowIndex = 0;
// 5. 处理表头
for (Element headerRow : headerRows) {
Row row = sheet.createRow(rowIndex++);
Elements headerCells = headerRow.select("th, td");
int colIndex = 0;
for (Element cell : headerCells) {
row.createCell(colIndex++).setCellValue(cell.text());
}
}
// 6. 处理表体数据
for (Element bodyRow : bodyRows) {
Row row = sheet.createRow(rowIndex++);
Elements cells = bodyRow.select("td");
int colIndex = 0;
for (Element cell : cells) {
row.createCell(colIndex++).setCellValue(cell.text());
}
}
// 7. 自动调整列宽以适应内容
for (int i = 0; i < rowIndex; i++) {
sheet.autoSizeColumn(i);
}
// 8. 将 Excel 工作簿写入文件
try (FileOutputStream fileOut = new FileOutputStream(excelFilePath)) {
workbook.write(fileOut);
}
// 9. 关闭工作簿
workbook.close();
}
}
优点:
- 纯 Java 实现:不依赖任何外部环境(如浏览器)。
- 高度可控:你可以精确地控制哪些 HTML 元素被转换,如何处理样式(虽然 POI 对样式的支持有限)。
- 性能较好:对于结构良好的 HTML,转换速度很快。
缺点:
- 处理复杂 HTML 困难:HTML 结构非常复杂(如嵌套表格、复杂的 CSS 布局),解析逻辑会变得很复杂。
- 样式丢失:这种方法无法保留 HTML 中的 CSS 样式(如背景色、字体加粗等),你需要手动使用 POI 的样式 API 来添加。
使用 Selenium (适用于复杂或动态 HTML)
如果你的 HTML 是通过 JavaScript 动态生成的,或者页面结构非常复杂,使用 Jsoup 解析会很困难,这时,Selenium 是一个更好的选择,Selenium 可以驱动真实的浏览器(如 Chrome, Firefox)来加载页面,然后从渲染后的 DOM 中提取数据。
核心思想:
- 使用 Selenium 启动一个浏览器实例。
- 打开 HTML 文件(或 URL)。
- 等待页面完全加载(包括 JavaScript 渲染)。
- 浏览器会渲染出最终的 HTML 结构,然后你可以使用 Selenium 的定位器(如
By.tagName("table"))来获取表格数据。 - 将获取的数据用 Apache POI 写入 Excel 文件(Selenium 本身不负责生成 Excel)。
步骤 1:添加 Maven 依赖
<!-- Selenium WebDriver -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.8.1</version>
</dependency>
<!-- WebDriver Manager (推荐,自动管理浏览器驱动) -->
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.3.2</version>
</dependency>
<!-- Apache POI (同上) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
步骤 2:编写转换代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import io.github.bonigarcia.wdm.WebDriverManager;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
public class SeleniumHtmlToExcelConverter {
public static void main(String[] args) {
String htmlFilePath = "file:///C:/path/to/your/sample.html"; // 使用 file:// 协议
String excelFilePath = "selenium_output.xlsx";
WebDriver driver = null;
try {
// 1. 设置 WebDriver (WebDriverManager 会自动下载并配置)
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
// 2. 打开 HTML 文件
driver.get(htmlFilePath);
// 3. 查找表格元素
WebElement table = driver.findElement(By.tagName("table"));
List<WebElement> rows = table.findElements(By.tagName("tr"));
// 4. 创建 Excel 工作簿
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
int rowIndex = 0;
// 5. 遍历表格行
for (WebElement row : rows) {
List<WebElement> cells = row.findElements(By.tagName("th"));
if (cells.isEmpty()) {
cells = row.findElements(By.tagName("td"));
}
Row excelRow = sheet.createRow(rowIndex++);
int colIndex = 0;
for (WebElement cell : cells) {
excelRow.createCell(colIndex++).setCellValue(cell.getText());
}
}
// 6. 自动调整列宽
for (int i = 0; i < rowIndex; i++) {
sheet.autoSizeColumn(i);
}
// 7. 写入文件
try (FileOutputStream fileOut = new FileOutputStream(excelFilePath)) {
workbook.write(fileOut);
}
workbook.close();
System.out.println("使用 Selenium 成功转换为 Excel 文件: " + excelFilePath);
} catch (Exception e) {
System.err.println("转换过程中发生错误: " + e.getMessage());
e.printStackTrace();
} finally {
// 8. 关闭浏览器
if (driver != null) {
driver.quit();
}
}
}
}
优点:
- 处理动态内容:可以完美处理由 JavaScript 动态生成或修改的 HTML。
- 所见即所得:获取的是浏览器最终渲染的 DOM,更贴近用户看到的结果。
缺点:
- 依赖浏览器:必须在目标机器上安装浏览器和对应的 WebDriver。
- 性能开销大:启动浏览器非常耗时,消耗大量内存,不适合批量或高性能场景。
- 不稳定:浏览器 UI 可能会干扰自动化脚本。
使用第三方库 (如 Flying Saucer / iText)
这种方法比较特殊,它主要用于将 HTML 转换为 PDF,但也可以借助一些技巧间接生成 Excel,Flying Saucer 是一个 XHTML 渲染器,它可以将 HTML 渲染成图片或 PDF,但这对于生成结构化的 Excel 表格数据来说,是“杀鸡用牛刀”,不推荐。
总结与选择建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Apache POI + Jsoup | 轻量、快速、纯 Java、高度可控 | 处理复杂/动态 HTML 困难,样式丢失 | 首选方案,适用于大多数静态、结构良好的 HTML 表格转换。 |
| Selenium + POI | 能处理任何复杂的、动态的 HTML | 依赖浏览器、性能差、资源消耗大 | 当 HTML 是通过 JS 动态生成,且结构极其复杂,无法用 Jsoup 解析时。 |
| 第三方库 | 功能强大(如转PDF) | 间接、笨重、不直接支持转Excel | 不推荐用于 HTML 转 Excel 的场景。 |
最终建议:
- 从方法一开始:90% 的场景下,使用 Apache POI + Jsoup 就足够了,并且它是最高效、最可靠的方案。
- 如果方法一失败:如果你的 HTML 文件无法被 Jsoup 正确解析(你用浏览器开发者工具查看到的 DOM 结构和源码完全不同),再考虑使用 Selenium。
- 关于样式:如果你需要保留 HTML 中的样式(如颜色、字体),你需要扩展 POI + Jsoup 的代码,在创建 POI 的
CellStyle时,手动解析 HTML 的style属性并应用到 Excel 单元格上,这会增加代码的复杂性。
