Angular中使用SheetJS导出Excel时固定LastLogin列为最后一列
实现SheetJS导出Excel时固定LastLogin为最后一列
要让LastLogin始终作为Excel的最后一列,核心是手动指定SheetJS生成工作表时的列顺序,而非依赖JSON对象默认的键顺序。具体实现步骤如下:
步骤1:收集所有唯一列名
遍历传入的JSON数组,提取所有出现过的键(列名),通过去重保证每个列名仅保留一次,同时保留其首次出现的顺序。
步骤2:调整列顺序
- 先筛选出除
LastLogin之外的所有列名,保留原有顺序 - 将
LastLogin追加到列名列表的末尾,形成最终固定的列顺序
步骤3:按指定列顺序生成工作表
调用XLSX.utils.json_to_sheet时,通过第二个参数传入自定义列顺序,强制SheetJS按该顺序生成Excel列。
修改后的完整导出函数
// 若未定义常量,先补充以下定义 const EXCEL_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'; const EXCEL_EXTENSION = '.xlsx'; public exportAsExcelFile(json: any[], excelFileName: string): void { // 收集所有唯一列名,保留首次出现顺序 const allKeys = Array.from(new Set(json.flatMap(item => Object.keys(item)))); // 调整列顺序:移除LastLogin后再追加到末尾 const orderedHeaders = allKeys.filter(key => key !== 'LastLogin').concat('LastLogin'); // 使用自定义列顺序生成工作表 const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json, { header: orderedHeaders }); const workbook: XLSX.WorkBook = { Sheets: { 'data': worksheet }, SheetNames: ['data'] }; const excelBuffer: any = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); this.saveAsExcelFile(excelBuffer, excelFileName); } private saveAsExcelFile(buffer: any, fileName: string): void { const data: Blob = new Blob([buffer], { type: EXCEL_TYPE }); FileSaver.saveAs(data, fileName + '_export_' + new Date().getTime() + EXCEL_EXTENSION); }
代码说明
new Set(json.flatMap(item => Object.keys(item))):遍历所有JSON对象的键,用Set去重后转回数组,确保列名唯一且保留首次出现顺序allKeys.filter(key => key !== 'LastLogin').concat('LastLogin'):将LastLogin从列列表中临时移除,再追加到末尾,确保它始终是最后一列XLSX.utils.json_to_sheet(json, { header: orderedHeaders }):通过header参数指定列顺序,SheetJS会严格按照该顺序生成Excel列,不受原始JSON键顺序影响
修改后,无论传入的JSON对象新增或减少字段,LastLogin都会固定在Excel的最后一列。
内容的提问来源于stack exchange,提问作者Prithvi Emmanuel Machado
相关产品推荐
相关产品推荐

