Angular+FileSaver+XLSX实现导出
一、安装相关插件
npm install file-saver --save
npm install @types/file-saver --save-dev
npm install xlsx --save
二、写一个导出的service供使用
import { Injectable } from '@angular/core';
import * as FileSaver from 'file-saver';
import * as XLSX from 'xlsx';
@Injectable({
providedIn: 'root'
})
export class Export {
/**
* 將Json數據導出為Excel文件
* @param json_data 數據內容
* @param excelName 文件名稱
* @param header 表頭(可选)
*/
downloadExcel(json_data: any, excelName: string,header?: string[]) {
const ws = XLSX.utils.json_to_sheet(
json_data, {
header: header //設置表頭
}
)
//创建一个workbook对象
let wb = XLSX.utils.book_new()
//把worksheet对象添加进workbook对象,第三个参数是excel中sheet的名字
XLSX.utils.book_append_sheet(wb, ws, excelName)
//接下来就是写入,下载导出
let wb_out = XLSX.write(wb, { bookType: 'xlsx', type: 'array' })
FileSaver.saveAs(new Blob([wb_out], { type: 'application/octet-stream' }), excelName + '.xlsx')
}
/**
* 將表格導出為Excel文件
* @param table 表格內容
* @param fileName 文件名稱
*/
exportExcelByTable(table: any, fileName: string) {
const ws: XLSX.WorkSheet = XLSX.utils.table_to_sheet(table);
const workbook: XLSX.WorkBook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, ws, 'ClassDataExport');
const excelBuffer: any = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
const data: Blob = new Blob([excelBuffer], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'
});
FileSaver.saveAs(data, fileName+ '.xlsx');
}
}
三、component中使用
//依赖注入 constructor(private ex:Export,) { } //方法一(根据表格数据导出Excel) @ViewChild('sortTable',{ read: ElementRef }) nzTable!:ElementRef; export(): void { let fileName = 'xxx明细' + Date.parse(new Date().toLocaleTimeString());//定義文件名 //根据表格导出 this.ex.exportExcelByTable(this.nzTable.nativeElement,fileName); } //方法二(根据json数据导出Excel) resultData = [ { title: '标题', fieldName: 'TITLE' }, { title: '号码', fieldName: 'NO' }, { title: '日期', fieldName: 'DATE' }, ]; export(): void { let fileName = 'xxx' + Date.parse(new Date().toLocaleTimeString());//定義文件名 let export_json_data: any; //data是由接口返回的json数据;与展示数组resultData对比生成中文表头 export_json_data=data.map((i: any) =>{ let obj={}; this.resultData.map((item: { fieldName: string; title: string })=>{ obj[item.title]=i[item.fieldName]; }) return obj; }) this.ex.downloadExcel(export_json_data, fileName); }
注:
在typescript中,可能会碰到元素隐式具有“any”类型,因为“string”类型的表达式不能用于索引类型“Object”。在类型“Object”上找不到“string”类型参数的索引签名问题。
要想解决这类问题,需要在tsconfig.json文件中配置:"suppressImplicitAnyIndexErrors": true 就可以解决此类问题。