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

AngularJS导出多ag-grid到单Excel分工作表:getSheetDataForExcel报错

解决旧版AngularJS ag-grid导出多工作表Excel的问题

由于旧版ag-grid(通常v18及更早版本)未提供getSheetDataForExcel和exportMultipleSheetsAsExcel方法,你可以通过以下两种方案实现多工作表导出:

方案一:使用SheetJS手动构建多工作表Excel

通过获取ag-grid的列定义和行数据,手动转换为Excel支持的格式,再用SheetJS生成包含多工作表的文件。

步骤与代码

  1. 先引入SheetJS(xlsx.js),可通过CDN或本地脚本引入
  2. 实现导出逻辑:
vm.exportData = function() {
    // 处理USA表格数据
    const usaVisibleCols = vm.USAOptions.columnDefs.filter(col => !col.hide);
    const usaRowData = getGridRowData(vm.USAOptions.api);
    const usaSheet = convertToSheet(usaVisibleCols, usaRowData);

    // 处理India表格数据
    const indiaVisibleCols = vm.IndiaOptions.columnDefs.filter(col => !col.hide);
    const indiaRowData = getGridRowData(vm.IndiaOptions.api);
    const indiaSheet = convertToSheet(indiaVisibleCols, indiaRowData);

    // 创建工作簿并添加工作表
    const workbook = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(workbook, usaSheet, "USA");
    XLSX.utils.book_append_sheet(workbook, indiaSheet, "INDIA");

    // 导出文件
    XLSX.writeFile(workbook, "Countries.xlsx");
};

// 兼容旧版ag-grid的行数据获取方法
function getGridRowData(gridApi) {
    const rowData = [];
    gridApi.forEachNode(node => rowData.push(node.data));
    return rowData;
}

// 将ag-grid数据转换为SheetJS工作表格式
function convertToSheet(columnDefs, rowData) {
    // 构建表头
    const headers = columnDefs.map(col => col.headerName);
    // 构建行数据(匹配表头顺序)
    const rows = rowData.map(row => columnDefs.map(col => {
        // 若有自定义渲染,可在此处理显示值,比如row[col.field]的格式化
        return row[col.field] ?? '';
    }));
    // 合并表头与行数据
    const sheetData = [headers, ...rows];
    return XLSX.utils.aoa_to_sheet(sheetData);
}

注意事项

  • 若ag-grid有自定义单元格渲染,需在convertToSheet中针对对应字段处理显示值,而非直接取原始数据
  • 已自动过滤隐藏列,若不需要可移除filter(col => !col.hide)逻辑

方案二:导出单个Excel后合并工作表

先分别导出两个ag-grid的Excel文件(获取Blob),再用SheetJS读取并合并到一个工作簿。

步骤与代码

vm.exportData = function() {
    // 导出两个表格的Excel Blob
    Promise.all([
        exportGridToBlob(vm.USAOptions.api),
        exportGridToBlob(vm.IndiaOptions.api)
    ]).then(([usaBlob, indiaBlob]) => {
        // 读取USA的Excel内容
        readBlobAsWorkbook(usaBlob).then(usaWorkbook => {
            // 读取India的Excel内容
            readBlobAsWorkbook(indiaBlob).then(indiaWorkbook => {
                const newWorkbook = XLSX.utils.book_new();
                // 添加工作表并命名
                XLSX.utils.book_append_sheet(
                    newWorkbook,
                    usaWorkbook.Sheets[usaWorkbook.SheetNames[0]],
                    "USA"
                );
                XLSX.utils.book_append_sheet(
                    newWorkbook,
                    indiaWorkbook.Sheets[indiaWorkbook.SheetNames[0]],
                    "INDIA"
                );
                // 导出合并后的文件
                XLSX.writeFile(newWorkbook, "Countries.xlsx");
            });
        });
    });
};

// 导出ag-grid为Excel Blob(兼容旧版导出方法)
function exportGridToBlob(gridApi) {
    return new Promise(resolve => {
        // 若旧版ag-grid不支持直接返回Blob,可修改为拦截导出内容
        const exportParams = {
            fileName: "temp.xlsx",
            // 部分旧版本需通过回调获取导出内容
            onExportReady: (params) => {
                resolve(params.blob);
            }
        };
        gridApi.exportDataAsExcel(exportParams);
    });
}

// 将Blob转换为SheetJS工作簿
function readBlobAsWorkbook(blob) {
    return new Promise(resolve => {
        const reader = new FileReader();
        reader.onload = e => {
            const workbook = XLSX.read(e.target.result, { type: "binary" });
            resolve(workbook);
        };
        reader.readAsBinaryString(blob);
    });
}

注意事项

  • 若旧版ag-grid的exportDataAsExcel不支持onExportReady或返回Blob,优先选择方案一
  • 合并时需确保两个导出的Excel格式兼容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:15:45