杰瑞科技汇

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

核心思路

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

Java如何将HTML表格转换为Excel文件?-图1
(图片来源网络,侵删)
  1. 解析 HTML:读取 HTML 文件或字符串,并定位到包含表格数据的 <table> 元素。
  2. 提取数据:遍历 <table> 中的 <tr> (行) 和 <td> / <th> (单元格),提取出文本内容。
  3. 写入 Excel:创建一个新的 Excel 文件,并将提取出的数据逐行逐列地写入到 Excel 的单元格中。

使用 Apache POI (纯 Java 方案)

Apache POI 是 Java 操作 Office 文件(如 Excel, Word)最权威、最强大的库,它不依赖任何外部工具,完全在 JVM 中运行,非常适合服务器端应用。

优点

  • 功能强大:可以创建复杂的 Excel 文件,设置样式、公式、图表等。
  • 纯 Java:无需安装额外软件,环境依赖简单。
  • 社区活跃:文档丰富,问题容易找到解决方案。

缺点

  • 代码量稍多:相比于一些封装好的库,需要写更多代码来完成 HTML 解析和 Excel 写入。
  • HTML 解析需手动处理:你需要自己使用 Jsoup 或其他 HTML 解析器来处理 HTML。

实现步骤

  1. 添加依赖:你需要同时添加 Apache POIJsoup(用于解析 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>
  2. 编写 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 中。

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

优点

  • 保留样式:可以处理复杂的 CSS 布局和样式,将表格以图片形式完整呈现。
  • 所见即所得:输出的是表格的快照,格式不会错乱。

缺点

  • 数据不可检索:Excel 中的内容是图片,无法直接复制或进行数据分析。
  • 性能开销大:渲染图片比提取文本要慢得多。
  • 依赖字体和图片:需要确保服务器上安装了相应的字体。

实现步骤

  1. 添加依赖

    <!-- 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>
  2. 编写 Java 代码 (概念性)

    这个方案更复杂,通常的流程是: a. 准备一个完整的 XHTML 文档,包含 <html>, <head> (内联 CSS), <body> (你的表格)。 b. 使用 Flying Saucer 将 XHTML 渲染成一个 BufferedImage (图片)。 c. 使用 Apache POI 创建一个 Excel 文件,并使用 WorkbookHelper 或类似方法将生成的图片插入到指定单元格。

    由于代码较长且涉及图片处理,这里不给出完整示例,但其核心逻辑是:HTML -> 图片 -> Excel

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

使用现成的转换库 (html-to-excel)

有一些第三方库专门封装了上述逻辑,使用起来非常简单,几行代码就能搞定。

优点

  • 极其简单:API 设计友好,代码量最少。
  • 快速上手:适合快速实现功能,对底层细节不感兴趣的场景。

缺点

  • 灵活性差:功能可能受限,难以处理特殊情况或进行深度定制。
  • 维护性:社区可能不如 Apache POI 活跃,需要自行评估库的稳定性。

示例 (以 html-to-excel 为例)

  1. 添加依赖

    <!-- pom.xml -->
    <dependency>
        <groupId>com.github.romankh3</groupId>
        <artifactId>html-to-excel</artifactId>
        <version>1.0.3</version>
    </dependency>
  2. 编写 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。

实现步骤 (概念性)

  1. 添加依赖

    <!-- Selenium WebDriver -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.8.1</version>
    </dependency>
  2. 编写 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)是最佳实践,它在灵活性、性能和功能之间取得了最好的平衡。

分享:
扫描分享到社交APP
上一篇
下一篇