```typescript
import * as XLSX from "xlsx";
//1、文件导出的主要方法
/*** 将数据表导出为Excel文件,并根据提供的映射替换表头和排序(如果提供了映射)* @param dataTable 数据表,包含要导出的数据* @param fileName 导出文件的名称* @param headerMap 可选参数,用于指定表头映射关系*/
export function exportDataTableToExcel(dataTable: any[], fileName: string, headerMap?: Map<string, string>) {let worksheet: XLSX.WorkSheet;// 如果提供了headerMap,则根据映射关系处理数据表if (headerMap) {// 获取映射后的表头顺序和新的表头名称const orderedHeaders = Array.from(headerMap.keys());const headerTitles = Array.from(headerMap.values());// 根据headerMap调整dataTable中的每一行数据,保证顺序与headerMap一致// 同时,将数据表中的每一行转换为一个新的对象,其键为headerMap中指定的新表头名称const processedData = dataTable.map(row =>orderedHeaders.reduce((obj, key, index) => {obj[headerTitles[index]] = row[key];return obj;}, {}));// 创建一个带有正确表头的工作表worksheet = XLSX.utils.json_to_sheet(processedData, { skipHeader: true });// 手动添加表头到工作表headerTitles.forEach((title, index) => {worksheet[XLSX.utils.encode_cell({ c: index, r: 0 })] = { t: 's', v: title };});} else {// 如果没有提供headerMap,则直接创建worksheetworksheet = XLSX.utils.json_to_sheet(dataTable);}// 创建工作簿并添加工作表const workbook: XLSX.WorkBook = XLSX.utils.book_new();XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");// 生成Excel文件并导出XLSX.writeFile(workbook, `${fileName}.xlsx`);
}
2、如果不需要对导出的Excel进行排序或者对表格的名称进行修改的话,直接调用上面方法即可。如果需要根据指定的Map集合的键值对进行排序的话 需要定义 一个Map集合 然后进行方法的调用
3、//定义表格导出的Map集合键值对```typescript
export const headerMap = new Map([["name", "姓名"],["ssn", "工号"],["userid", "员工ID"],["checktime", "考勤日期"],["checktype", "考勤类型"],["verifycode", "打卡机其他"],["sensorid", "打卡机编号"],["sn", "设备SN"],
]);
4、导出Excel方法的调用,增加Map集合
// 调用新的键值对进行数据的导出的函数
export const exportEhrToExcel = (dataTable: any[], fileName: string) => {// 调用工具函数将数据导出到 ExcelexportDataTableToExcel(dataTable, fileName, headerMap);
};
5、HTML中调用
<el-button type="primary" plain:size="size" title="导出表格" style="width: 60px" @click="exportEhrToExcel(tableData,'考勤表格')">导出</el-button>