杰瑞科技汇

Java如何将HTML表格转换为Excel文件?

使用 Apache POI + Jsoup (最常用、最推荐)

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

Java如何将HTML表格转换为Excel文件?-图1
(图片来源网络,侵删)

原理

  1. 使用 Jsoup 读取 HTML 字符串或文件,解析成一个 Document 对象。
  2. 遍历 DOM 树,定位到 <table>
  3. 遍历 <table> 中的 <tr> (行) 标签。
  4. 在每个 <tr> 中,遍历 <td> (单元格) 或 <th> (表头单元格) 标签。
  5. 使用 Apache POI,创建一个 XSSFWorkbook (对应 .xlsx 格式)。
  6. 创建一个 Sheet (工作表)。
  7. 将从 HTML 中提取的文本数据逐行逐列地写入到 Sheet 中。
  8. 最后将 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 本身也提供了一种非常直接的方法。

Java如何将HTML表格转换为Excel文件?-图2
(图片来源网络,侵删)

原理

利用 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 提供了 HtmlLoadOptionsWorkbook 类来简化这个过程。

Java如何将HTML表格转换为Excel文件?-图3
(图片来源网络,侵删)
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)或类似商业库是你的最佳选择,能为你节省大量的开发和维护时间。
分享:
扫描分享到社交APP
上一篇
下一篇