在 Angular 项目开发中,Excel 导入功能是常见需求,而提供标准化的导入模板能极大提升用户体验。本文将详细介绍如何使用 ExcelJS 库生成带样式、数据验证的考核数据导入模板,解决传统模板无格式、易出错的问题。 npm install exceljs
一、前置准备:安装依赖
首先安装 ExcelJS 库,它支持丰富的 Excel 格式配置和数据验证功能:
            
            
              css
              
              
            
          
          npm install exceljs --save # 若需 TypeScript 类型支持(可选) npm install --save-dev @types/exceljs二、完整实现代码
以下是基于 TypeScript 的模板下载功能实现,包含样式设置、数据验证、示例数据填充等核心功能: //基于ts
            
            
              typescript
              
              
            
          
          async downloadTemplate() {
  try {
    // 动态导入 ExcelJS
    const ExcelJS = await import('exceljs');
    // 创建工作簿
    const workbook = new ExcelJS.Workbook();
    const worksheet = workbook.addWorksheet('考核数据模板');
    // 设置标题行并加粗
    worksheet.addRow(['考核年度', '个人名称', '身份证', '考核结果']);
    // 获取第一行并设置加粗样式
    const headerRow = worksheet.getRow(1);
    headerRow.font = {
      bold: true,
      size: 12
    };
    headerRow.alignment = { vertical: 'middle', horizontal: 'center' };
    // 添加示例数据
    worksheet.addRow(['2024', '张三', '110101199001011234', '不称职']);
    worksheet.addRow(['2024', '李四', '110101199001011235', '称职']);
    // 获取考核结果的字典值
    const kh003Options = this.dicservice.getSFdic('kha003');
    const dropdownValues = kh003Options.map((item: any) => item.label || item.value);
    // 设置考核结果列的数据验证(使用正确的类型)
    for (let i = 2; i <= 100; i++) {
      worksheet.getCell(`D${i}`).dataValidation = {
        type: 'list' as const, // 使用类型断言
        allowBlank: true,
        formulae: [`"${dropdownValues.join(',')}"`],
        showErrorMessage: true,
        errorTitle: '无效输入',
        error: '请从下拉列表中选择有效的考核结果'
      };
    }
    // 设置列宽
    worksheet.getColumn(1).width = 12; // 考核年度
    worksheet.getColumn(2).width = 10; // 个人名称
    worksheet.getColumn(3).width = 20; // 身份证
    worksheet.getColumn(4).width = 15; // 考核结果
    // 导出文件
    const buffer = await workbook.xlsx.writeBuffer();
    const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
    const link = document.createElement('a');
    link.href = URL.createObjectURL(blob);
    link.download = '考核数据导入模板.xlsx';
    link.click();
    URL.revokeObjectURL(link.href);
    this.msg.success('模板下载成功!');
  } catch (err: any) {
    console.error('导出错误', err);
    this.msg.error(`模板下载失败:${err.message}`);
    this.fallbackDownload();
  }
}
fallbackDownload() {
  const templateData = [
    ['考核年度', '个人名称', '身份证', '考核结果'],
    ['2024', '张三', '110101199001011234', '优秀'],
    ['2024', '李四', '110101199001011235', '称职']
  ];
  const exportOptions: XlsxExportOptions = {
    sheets: [
      {
        name: '考核数据模板',
        data: templateData
      }
    ],
    filename: '考核数据导入模板.xlsx',
    format: 'xlsx'
  };
  this.xlsx
    .export(exportOptions)
    .then(() => this.msg.success('模板下载成功!'))
    .catch((err: any) => this.msg.error(`模板下载失败:${err.message}`));
}