You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中用XLSX table_to_sheet导出选中行至Excel的方法

解决XLSX导出仅选中行(checked=true)的问题

嗨,我来帮你搞定这个导出需求!咱们分两部分来解答你的问题:

一、table_to_sheet能否实现筛选导出?

XLSX.utils.table_to_sheet本身没有内置的筛选参数,它会直接读取传入DOM表格的全部内容。不过我们可以先手动筛选出checked属性为true的行,创建一个临时表格,再传给这个方法,间接实现需求:

exportTableToExcel(TableElement: ElementRef, FileName: string, Extension: string) {
  const table = TableElement.nativeElement;
  // 筛选出所有复选框被选中的行(请根据实际页面调整复选框选择器)
  const selectedRows = Array.from(table.querySelectorAll('tr')).filter(row => {
    const checkbox = row.querySelector('input[type="checkbox"]');
    return checkbox && checkbox.checked;
  });

  // 无选中行时给出提示
  if (selectedRows.length === 0) {
    alert('请选择要导出的行');
    return;
  }

  // 创建临时表格,复制表头和选中行
  const tempTable = document.createElement('table');
  tempTable.appendChild(table.querySelector('thead')!.cloneNode(true));
  const tempTbody = document.createElement('tbody');
  selectedRows.forEach(row => tempTbody.appendChild(row.cloneNode(true)));
  tempTable.appendChild(tempTbody);

  // 用临时表格生成工作表并导出
  const ws: XLSX.WorkSheet = XLSX.utils.table_to_sheet(tempTable);
  const workbook: XLSX.WorkBook = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(workbook, ws, 'ClassDataExport');
  XLSX.writeFile(workbook, `${FileName}.${Extension}`);

  // 清理临时DOM元素
  tempTable.remove();
}

二、json_to_sheet完全可以实现,且更灵活!

相比操作DOM的方式,json_to_sheet从数据层面处理,逻辑更清晰、易维护。核心思路是:提取选中行的数据转换成JSON数组,再生成工作表导出:

exportSelectedRowsToExcel(TableElement: ElementRef, FileName: string, Extension: string) {
  const table = TableElement.nativeElement;
  // 提取表头文本
  const headers = Array.from(table.querySelectorAll('thead th')).map(th => th.textContent?.trim() || '');
  const rows = Array.from(table.querySelectorAll('tbody tr'));

  // 转换选中行为JSON数组
  const selectedData = rows.filter(row => {
    const checkbox = row.querySelector('input[type="checkbox"]');
    return checkbox && checkbox.checked;
  }).map(row => {
    const cells = Array.from(row.querySelectorAll('td'));
    return cells.reduce((obj, cell, index) => {
      obj[headers[index]] = cell.textContent?.trim() || '';
      return obj;
    }, {} as {[key: string]: string});
  });

  if (selectedData.length === 0) {
    alert('请选择要导出的行');
    return;
  }

  // 用JSON数组生成工作表并导出
  const ws: XLSX.WorkSheet = XLSX.utils.json_to_sheet(selectedData);
  const workbook: XLSX.WorkBook = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(workbook, ws, 'ClassDataExport');
  XLSX.writeFile(workbook, `${FileName}.${Extension}`);
}

小提示:

如果你的表格数据本来就来自前端的数据源(比如一个数组),直接筛选这个数组再传给json_to_sheet会更高效,不用从DOM中提取数据~

内容的提问来源于stack exchange,提问作者Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:46:08