杰瑞科技汇

Java如何将HTML高效转换为Excel?

使用 Apache POI (推荐,最灵活)

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

Java如何将HTML高效转换为Excel?-图1
(图片来源网络,侵删)

核心思想:

  1. 使用一个 HTML 解析器(如 Jsoup)读取 HTML 文件,提取出 <table>, <tr>, <th>, <td> 等标签。
  2. 遍历这些标签,将表格数据映射到 Apache POI 的 Sheet, Row, Cell 对象中。
  3. 最后使用 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:编写转换代码

Java如何将HTML高效转换为Excel?-图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 中提取数据。

核心思想:

  1. 使用 Selenium 启动一个浏览器实例。
  2. 打开 HTML 文件(或 URL)。
  3. 等待页面完全加载(包括 JavaScript 渲染)。
  4. 浏览器会渲染出最终的 HTML 结构,然后你可以使用 Selenium 的定位器(如 By.tagName("table"))来获取表格数据。
  5. 将获取的数据用 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 的场景。

最终建议:

  1. 从方法一开始:90% 的场景下,使用 Apache POI + Jsoup 就足够了,并且它是最高效、最可靠的方案。
  2. 如果方法一失败:如果你的 HTML 文件无法被 Jsoup 正确解析(你用浏览器开发者工具查看到的 DOM 结构和源码完全不同),再考虑使用 Selenium
  3. 关于样式:如果你需要保留 HTML 中的样式(如颜色、字体),你需要扩展 POI + Jsoup 的代码,在创建 POI 的 CellStyle 时,手动解析 HTML 的 style 属性并应用到 Excel 单元格上,这会增加代码的复杂性。
分享:
扫描分享到社交APP
上一篇
下一篇