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}`));
}
相关推荐
Nan_Shu_6149 小时前
学习:ES6(2)
前端·学习·es6
命运之光12 小时前
【最新】ChromeDriver最新版本下载安装教程,ChromeDriver版本与Chrome不匹配问题
前端·chrome
星离~14 小时前
Vue响应式原理详解:从零实现一个迷你Vue
前端·javascript·vue.js
梦65014 小时前
React 简介
前端·react.js·前端框架
一只小阿乐15 小时前
react 中的判断显示
前端·javascript·vue.js·react.js·react
光影少年15 小时前
useMemo 和 React.memo区别
前端·react.js·前端框架
小沐°15 小时前
React-页码组件
前端·javascript·react.js
零一科技15 小时前
Vue3学习第三课: ref 与 reactive 选择指南
前端·vue.js
余杭子曰15 小时前
播放状态与播放序列的关系(999篇一线博客第107篇)
前端