Angular(TypeScript ) 中基于 ExcelJS 实现导入模板下载功能(带样式与数据验证)

在 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}`));
}
相关推荐
前端九哥6 小时前
老板:就是你小子删光了try-catch?
前端·javascript
杰出的胡兵6 小时前
2v1带您实战12nm高级数字后端
前端·soc·数字后端·数字ic后端·芯片设计全流程培训
Achieve前端实验室6 小时前
深入浅出 ES Module
前端·javascript·前端框架
炳子6 小时前
小程序地图组件(map)中使用全屏预览图片(previewImage)的问题解决方案
前端
Onion6 小时前
BroadcastChannel 使用:优缺点、场景示例与最佳实践
前端·javascript
东东2336 小时前
搭建 Vite + React 服务端渲染(SSR)环境
前端·javascript·react.js
上车函予6 小时前
点击即扩散:使用 View Transition API 实现 UnoCSS 官网同款主题切换动画
前端·javascript·css
星链引擎6 小时前
生成式 AI 驱动下的智能聊天机器人 技术架构核心实现与场景落地
前端
Asort6 小时前
React框架深度剖析:设计理念、核心机制与现代生态对比
前端·javascript·react.js