0

0

如何使用 JavaScript 递归遍历嵌套表格并导出为标准 CSV 文件

聖光之護

聖光之護

发布时间:2026-01-07 13:51:17

|

342人浏览过

|

来源于php中文网

原创

如何使用 JavaScript 递归遍历嵌套表格并导出为标准 CSV 文件

本文介绍一种健壮的 javascript 方法,用于遍历含嵌套 `

` 的 dom 结构(如“profile > linked users”层级),提取所有有效数据行(忽略 `colspan` 占位行和嵌套容器行),生成符合 csv 规范的纯文本,并支持浏览器下载。

在处理动态渲染的层级化表格(例如用户档案 + 关联子用户)时,常见陷阱是将包含嵌套表格的

(如 应与顶层 平权参与 CSV 行生成,而非被包裹在父行中。

正确的解决方案是统一采集所有“叶子级数据行”:即跳过任何含 colspan 的

,并递归提取所有 下的 ,无论其位于主表还是嵌套表中。

以下是生产就绪的实现:

function exportTableToCsv() {
  const table = document.querySelector('table');
  const headers = Array.from(table.querySelectorAll('thead th'))
    .map(th => escapeCsvCell(th.textContent.trim()));

  const rows = [];

  // 递归收集所有有效数据行(排除含 colspan 的容器行)
  function collectDataRows(tbody) {
    tbody.querySelectorAll('tr').forEach(tr => {
      // 跳过包含 colspan 单元格的行(它们只是嵌套容器,非真实数据)
      if (tr.querySelector('td[colspan], th[colspan]')) return;

      const cells = Array.from(tr.querySelectorAll('td, th'))
        .map(cell => escapeCsvCell(cell.textContent.trim()));

      // 只保留列数匹配表头的行(防数据错位)
      if (cells.length === headers.length) {
        rows.push(cells);
      }
    });

    // 递归处理本 tbody 内嵌套的 table > tbody
    tbody.querySelectorAll('table tbody').forEach(nestedTbody => {
      collectDataRows(nestedTbody);
    });
  }

  // 从主表所有 tbody 开始收集
  table.querySelectorAll('tbody').forEach(tbody => {
    collectDataRows(tbody);
  });

  // 组装 CSV 字符串:首行为 header,后续为数据行
  const csvContent = [
    headers.join(','),
    ...rows.map(row => row.join(','))
  ].join('\n');

  downloadCsv(csvContent, 'export.csv');
}

// CSV 单元格转义:处理含逗号、换行、引号的值
function escapeCsvCell(value) {
  if (/[,\"\n\r]/.test(value)) {
    return `"${value.replace(/"/g, '""')}"`;
  }
  return value;
}

function downloadCsv(content, filename) {
  const blob = new Blob([content], { type: 'text/csv;charset=utf-8;' });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = filename;
  a.style.display = 'none';
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
  URL.revokeObjectURL(url);
}

关键设计说明

VIVA
VIVA

一个免费的AI创意视觉设计平台

下载

立即学习Java免费学习笔记(深入)”;

  • 严格过滤容器行:通过 tr.querySelector('td[colspan], th[colspan]') 精准识别并跳过所有用于包裹嵌套表格的占位
,避免“Tom Jack Sam Alex”式错误合并;
  • 跨层级统一采集:collectDataRows() 递归遍历任意深度的
  • 中的容器行)误判为数据行,导致 CSV 出现重复、错位或合并字段(如 "Tom Jack Sam Alex")。根本原因在于:DOM 层级不等于数据层级——嵌套表格是独立的数据源,其
    所在的
    ,确保 Jack/Sam/Alex 与 Tom/Josh 处于同一 CSV 行级别;
  • CSV 安全转义:escapeCsvCell() 自动为含逗号、双引号或换行符的单元格添加双引号,并对内部引号做 "" 转义,符合 RFC 4180 标准;
  • 列数校验:if (cells.length === headers.length) 防止因 HTML 结构异常(如缺失单元格)导致 CSV 列偏移。
  • ⚠️ 注意事项

    • 该方案假设所有数据行具有与表头一致的列数(
    ),否则需调整选择器。

    调用 exportTableToCsv() 即可一键导出结构清晰、无冗余、兼容 Excel 的 CSV 文件——真正实现“所见数据即所得”。

    数量);若存在动态列宽(如部分行用 colspan 合并展示但实际无数据),需按业务逻辑预处理;
  • 不依赖 innerText(可能受 CSS 隐藏影响),而使用 textContent 确保获取原始文本;
  • 嵌套表格必须位于
  • 内且自身结构完整(含

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    if什么意思
    if什么意思

    if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

    846

    2023.08.22

    length函数用法
    length函数用法

    length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

    954

    2023.09.19

    DOM是什么意思
    DOM是什么意思

    dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

    4329

    2024.08.14

    excel对比两列数据异同
    excel对比两列数据异同

    Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

    1453

    2023.07.25

    excel重复项筛选标色
    excel重复项筛选标色

    excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

    428

    2023.07.31

    excel复制表格怎么复制出来和原来一样大
    excel复制表格怎么复制出来和原来一样大

    本专题为大家带来excel复制表格怎么复制出来和原来一样大相关文章,帮助大家解决问题。

    572

    2023.08.02

    excel表格斜线一分为二
    excel表格斜线一分为二

    在Excel表格中,我们可以使用斜线将单元格一分为二。本专题为大家带来excel表格斜线一分为二怎么弄的相关文章,希望可以帮到大家。

    1264

    2023.08.02

    excel斜线表头一分为二
    excel斜线表头一分为二

    excel斜线表头一分为二的方法有使用合并单元格功能方法、使用文本框功能方法、使用自定义格式方法。本专题为大家提供excel斜线表头一分为二相关的各种文章、以及下载和课程。

    376

    2023.08.02

    C# ASP.NET Core微服务架构与API网关实践
    C# ASP.NET Core微服务架构与API网关实践

    本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

    3

    2026.03.11

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Sass 教程
    Sass 教程

    共14课时 | 0.9万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 3.6万人学习

    CSS教程
    CSS教程

    共754课时 | 42.1万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号