AngularJS导出多ag-grid到单Excel分工作表:getSheetDataForExcel报错
解决旧版AngularJS ag-grid导出多工作表Excel的问题
由于旧版ag-grid(通常v18及更早版本)未提供getSheetDataForExcel和exportMultipleSheetsAsExcel方法,你可以通过以下两种方案实现多工作表导出:
方案一:使用SheetJS手动构建多工作表Excel
通过获取ag-grid的列定义和行数据,手动转换为Excel支持的格式,再用SheetJS生成包含多工作表的文件。
步骤与代码
- 先引入SheetJS(xlsx.js),可通过CDN或本地脚本引入
- 实现导出逻辑:
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
相关产品推荐
相关产品推荐

