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}`));
}
相关推荐
布茹 ei ai13 小时前
5、基于 GEE 的 Sentinel-1 SAR 地震滑坡变化检测系统:2022 泸定地震案例
javascript·sentinel·遥感·gee·云平台
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ13 小时前
java实现登录:多点登录互踢,30分钟无操作超时
java·前端
一字白首13 小时前
Vue Router 进阶,声明式 / 编程式导航 + 重定向 + 404 + 路由模式
前端·javascript·vue.js
d111111111d13 小时前
C语言中static修斯局部变量,全局变量和函数时分别由什么特性
c语言·javascript·笔记·stm32·单片机·嵌入式硬件·学习
广州华水科技13 小时前
单北斗变形监测在水库安全中的应用与维护该如何实施?
前端
GIS好难学14 小时前
0帧起手《Vue零基础教程》,从前端框架到GIS开发系列课程
前端·vue.js·前端框架
李瑞丰_liruifengv14 小时前
使用 Claude Agent SDK 写一个 DeepResearch Agent
javascript·aigc·agent
行走的陀螺仪14 小时前
重绘和重排怎么触发?怎么优化?
前端·css·性能优化·css3·浏览器原理
尘世中一位迷途小书童14 小时前
项目大扫除神器:Knip —— 将你的代码库“瘦身”到底
前端·架构·代码规范