使用 Apache POI + Jsoup (最常用、最推荐)
这是最经典和灵活的组合。Jsoup 用于解析 HTML,Apache POI 用于生成 Excel 文件,两者都是 Java 领域的顶级开源库,功能强大且社区活跃。

(图片来源网络,侵删)
原理
- 使用 Jsoup 读取 HTML 字符串或文件,解析成一个
Document对象。 - 遍历 DOM 树,定位到
<table>- 遍历
<table>中的<tr>(行) 标签。- 在每个
<tr>中,遍历<td>(单元格) 或<th>(表头单元格) 标签。- 使用 Apache POI,创建一个
XSSFWorkbook(对应.xlsx格式)。- 创建一个
Sheet(工作表)。- 将从 HTML 中提取的文本数据逐行逐列地写入到
Sheet中。- 最后将
Workbook对象写入到输出流(如文件流)中。 - 遍历
依赖 (Maven)
在你的 pom.xml 文件中添加以下依赖:
<!-- Jsoup: 用于解析 HTML -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version> <!-- 使用最新稳定版 -->
</dependency>
<!-- Apache POI: 用于操作 Excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.5</version> <!-- 使用最新稳定版 -->
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.5</version> <!-- 必须依赖此包以支持 .xlsx 格式 -->
</dependency>
代码示例
假设我们有以下 HTML 内容:
<!DOCTYPE html>
<html>
<head>产品列表</title>
</head>
<body>
<h1>产品信息</h1>
<table border="1">
<thead>
<tr>
<th>产品名称</th>
<th>价格</th>
<th>库存</th>
</tr>
</thead>
<tbody>
<tr>
<td>笔记本电脑</td>
<td>¥5999</td>
<td>100</td>
</tr>
<tr>
<td>无线鼠标</td>
<td>¥99</td>
<td>500</td>
</tr>
<tr>
<td>机械键盘</td>
<td>¥399</td>
<td>250</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.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class HtmlToExcelConverter {
public static void main(String[] args) {
String htmlContent = "<!DOCTYPE html>...</html>"; // 将上面的HTML内容粘贴到这里
String outputPath = "products.xlsx";
try {
convertHtmlToExcel(htmlContent, outputPath);
System.out.println("Excel 文件已成功生成: " + outputPath);
} catch (IOException e) {
System.err.println("转换过程中发生错误: " + e.getMessage());
e.printStackTrace();
}
}
public static void convertHtmlToExcel(String html, String filePath) throws IOException {
// 1. 使用 Jsoup 解析 HTML
Document doc = Jsoup.parse(html);
// 2. 找到所有的 table 元素
// 注意:一个 HTML 页面可能包含多个表格,这里我们只取第一个
Element table = doc.select("table").first();
if (table == null) {
throw new IllegalArgumentException("HTML 中未找到 table 标签。");
}
// 3. 创建 Excel 工作簿和工作表
try (Workbook workbook = new XSSFWorkbook()) {
Sheet sheet = workbook.createSheet("产品数据");
// 4. 遍历表格的行 (tr)
Elements rows = table.select("tr");
int rowNum = 0;
for (Element row : rows) {
// 创建 Excel 行
Row excelRow = sheet.createRow(rowNum++);
// 5. 遍历行的单元格 (td 或 th)
Elements cells = row.select("td, th");
int colNum = 0;
for (Element cell : cells) {
// 创建 Excel 单元格
Cell excelCell = excelRow.createCell(colNum++);
// 获取单元格文本内容并设置
excelCell.setCellValue(cell.text());
}
}
// 6. 自动调整列宽以适应内容
for (int i = 0; i < rowNum; i++) {
sheet.autoSizeColumn(i);
}
// 7. 将工作簿写入文件
try (OutputStream fileOut = new FileOutputStream(filePath)) {
workbook.write(fileOut);
}
}
}
}
使用 Apache POI 直接解析 (仅限极简单 HTML)
HTML 文件极其简单,并且严格遵循 <table><tr><td>...</td></tr></table> 的结构,没有额外的标签和复杂的样式,Apache POI 本身也提供了一种非常直接的方法。

(图片来源网络,侵删)
原理
利用 POI 的 XSSFHtmlParser 类,它会尝试将 HTML 标签直接映射到 Excel 的样式和结构。
代码示例
import org.apache.poi.xssf.usermodel.XSSFHtmlParser;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class SimpleHtmlToExcelWithPoi {
public static void main(String[] args) {
String simpleHtml = "<table><tr><td>姓名</td><td>年龄</td></tr><tr><td>张三</td><td>30</td></tr></table>";
String outputPath = "simple_output.xlsx";
try (XSSFWorkbook workbook = new XSSFWorkbook()) {
// 创建一个工作表
workbook.createSheet("Sheet1");
// 使用 XSSFHtmlParser 进行转换
// 注意:这个方法对复杂的HTML支持很差
XSSFHtmlParser.parse(simpleHtml, workbook.getSheetAt(0));
// 写入文件
try (FileOutputStream fileOut = new FileOutputStream(outputPath)) {
workbook.write(fileOut);
}
System.out.println("简单Excel文件已生成: " + outputPath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
⚠️ 警告: XSSFHtmlParser 功能非常有限,不推荐在生产环境中使用,它无法处理嵌套表格、复杂的表头、合并单元格等常见情况。
使用商业库 (如 Aspose.Cells)
如果项目预算允许,商业库通常是功能最强大、最稳定的选择,它们能处理极其复杂的 HTML 场景,包括样式、图片、公式等。
优点
- 高保真度转换:能最大程度地保留 HTML 的样式(字体、颜色、边框、背景等)。
- 功能强大:支持复杂的 HTML 结构,如嵌套表格、合并单元格、CSS 样式等。
- 易于使用:API 设计直观,通常只需要几行代码就能完成转换。
- 稳定性和性能:经过严格测试,性能和稳定性有保障。
代码示例 (Aspose.Cells)
Aspose.Cells 提供了 HtmlLoadOptions 和 Workbook 类来简化这个过程。

(图片来源网络,侵删)
import com.aspose.cells.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class HtmlToExcelWithAspose {
public static void main(String[] args) {
String htmlContent = "<!DOCTYPE html>...</html>"; // 将上面的HTML内容粘贴到这里
String outputPath = "products_aspose.xlsx";
// 1. 创建一个 LoadOptions 对象,指定输入格式为 HTML
HtmlLoadOptions loadOptions = new HtmlLoadOptions();
// 2. 创建一个 Workbook 对象,直接从 HTML 字符串加载
// 注意:Aspose.Cells 可以直接从字符串加载
Workbook workbook = new Workbook(htmlContent, loadOptions);
// 3. 获取第一个工作表
Worksheet worksheet = workbook.getWorksheets().get(0);
// 4. (可选) 调整列宽
worksheet.autoFitColumns();
// 5. 保存为 Excel 文件
try {
workbook.save(outputPath, SaveFormat.XLSX);
System.out.println("Aspose.Cells Excel 文件已成功生成: " + outputPath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意: 使用 Aspose.Cells 需要购买许可证,但通常会提供免费的试用版。
总结与对比
| 特性 | 方法一: Jsoup + Apache POI | 方法二: Apache POI 直接解析 | 方法三: Aspose.Cells (商业库) |
|---|---|---|---|
| 易用性 | 中等,需要理解两个库的API | 非常简单 | 非常简单 |
| 灵活性 | 非常高,可以完全控制转换逻辑 | 极低,仅限最简单的HTML | 非常高,封装了所有复杂性 |
| 功能 | 强大,但需手动实现样式、合并单元格等 | 非常弱,基本不支持样式和复杂结构 | 最强大,支持样式、图片、公式等高保真转换 |
| 成本 | 免费 | 免费 | 付费 |
| 适用场景 | 大多数开源项目,需要精细控制转换过程 | 快速处理极简单、无样式的表格 | 对转换质量要求高的企业级应用,有预算支持 |
最终建议
- 对于绝大多数 Java 开发者:强烈推荐使用方法一(Jsoup + Apache POI),它免费、灵活、强大,并且社区资源丰富,你可以根据需要轻松地扩展功能,比如处理合并单元格、保留样式等。
- 如果你的 HTML 结构极其简单:可以尝试方法二,但要清楚它的局限性。
- 如果你的项目有充足的预算,并且需要“一键式”的高保真转换:那么方法三(Aspose.Cells)或类似商业库是你的最佳选择,能为你节省大量的开发和维护时间。
