ExcelJS 下拉选择 dropdown、 加密(encryption)文件 、导出文件

本文介绍了如何使用ExcelJS在Excel中设置列的下拉选择,提供了三种方法进行数据验证,并详细讲解了两种导出表格的方式,包括基本的Buffer导出和使用XlsxPopulate库的加密导出技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、使用 ExcelJS 给某一列设置下拉选择 的 3个方法

  // 下载模板 (导出Excel)
  const downloadTemplate = (tableData) => {
    // 生成表头data
    const showData = ['packageName', ...getShowData()];//string数组
    const columnsData = showData.map((key) => {
      const header = formatMessage({ id: `create_order.${key}` });
      return {
        header,
        key,
        width: 20,
      };
    });

    // 创建工作簿
    const workbook = new ExcelJS.Workbook();
    // 添加工作表
    const worksheet = workbook.addWorksheet('sheet', {});
    // 设置表头
    worksheet.columns = columnsData;
    // 添加数据
    worksheet.addRows(tableData);//数组['packageName','xiaoming','xxx',10,]

    //  某一列设置为下拉选择
    // 方法-1
    worksheet.dataValidations.add('A2:A9999', {
      type: 'list',
      allowBlank: false,
      formulae: ['"male,female,other"'],
      showErrorMessage: true,
      errorStyle: 'error',
      error: 'The value Valid',
    });

    // 方法-2
    for (let i = 2; i <= 9999; i += 1) {
      worksheet.getCell(`A${i}`).dataValidation = {
        type: 'list',
        allowBlank: false,
        formulae: ['"One,Two,Three,Four"'],
      };
    }

    // 方法-3
    // 必须是 已经填充数据的情况下。若数据只有3行,那么就只有前3个可以被设置 dataValidation 。
    worksheet.getColumn('A').eachCell({ includeEmpty: true }, (cell) => {
      // eslint-disable-next-line no-param-reassign
      cell.dataValidation = { type: 'list', allowBlank: false, formulae: ['"One,Two,Three,Four"'] };
    });
   //导出
   exportFun(worksheet)
  };

2、导出表格 的 2种方式

导出方式1

 // 导出表格
 exportFun(){
    workbook.xlsx.writeBuffer().then((buffer) => {
      const file = new Blob([buffer], {
        type: 'application/octet-stream',
      });
      //导出方式1  需要额外下载一个包 FileSaver
      FileSaver.saveAs(
        file,
        `fileName.xlsx`,
      );
    //导出方式2 使用 js对象 Blob+url点击下载
     exportByUrl(file, 'fileName.xlsx', '1111');
    });
}

导出方式2

const exportByUrl = (file, saveName, pw) => {
    if (typeof file === 'object' && file instanceof Blob) {
      // 给blob对象生成临时URL
      const url = URL.createObjectURL(res);
      const aLink = document.createElement('a');
      aLink.href = url;
      // 指定保存文件名
      aLink.download = saveName || 'defaultName.xlsx';
      // 触发点击
      document.body.appendChild(aLink);
      aLink.click();
      aLink.remove();
      setLoading(false);
      Modal.success({
        title: formatMessage({ id: 'export.tip' }),
        content: (
          <div>
            <span>{formatMessage({ id: 'export.success.password.tip' }, { pw })}</span>
            <Button type="link" size="small" onClick={() => handleCopy(pw)}>
              {formatMessage({ id: 'export.pw.copy' })}
            </Button>
          </div>
        ),
        okText: formatMessage({ id: 'export.confirm' }),
      });
    }
  };

3、加密的2个方式

加密方式1 需要一个新的库 github readme 替换 Exceljs。但是使用方式完全兼容 Exceljs

 workbook.xlsx.writeBuffer({
 password: '1111',   // 加密方式1 
}) .then(()=>{
      //...导出步骤
   })

加密方式2 需要新库 XlsxPopulate 这种方式可能会导致 证件号码之类的string数据变为科学计数法。
解决这个科学计数法的问题:可以在证件号码 '1111111' 后边加个 \t ,即可解决 1111111\t

    const blobWb = new Blob([workbook], { type: 'application/octet-stream' });
    XlsxPopulate.fromDataAsync(blobWb).then(function (wb) {
      wb.outputAsync({ type: 'blob', password: '1111' }).then((res) => {
        setVisible(false);
        exportByUrl(res, saveName, pw);
      });
    });

### 使用 ExcelJS 实现多选下拉ExcelJS 是一个用于创建和操作 Excel 文件的强大 JavaScript 。然而,原生的 ExcelJS 并不支持直接创建带有复选功能的数据验证下拉表。为了实现这一目标,可以采用一种变通的方法,在单元格旁边放置一个多选控件,并通过 VBA 或其他脚本语言来处理这些选择的结果。 对于纯前端环境下的解决方案,可以通过以下方式模拟: #### 方法一:利用辅助存储多个选项 1. 创建一个新的工作表作为数据源,其中每一行代表一个可能的选择项。 2. 在主表格中插入一个组合框(ComboBox),并将其链接到上述的工作表中的范围。 3. 当用户选择了多项之后,将所选项目的值拼接成字符串形式存入指定的目标单元格内。 这种方法虽然不是严格意义上的“内置”多选下拉菜单,但在某些场景下也能满足需求[^2]。 ```javascript // 假设 dataSheet 中有 A 包含了所有可用选项 const wsData = workbook.addWorksheet('data'); wsData.getCell('A1').value = 'Option 1'; wsData.getCell('A2').value = 'Option 2'; // 主工作表上的某个单元格用来显示最终结果 mainWs.getCell('B1').value = '=TEXTJOIN(", ", TRUE, IF(data!$A:$A<>"", data!$A:$A,""))'; // 这里假设使用的是 Office 365 及以上版本 ``` 需要注意的是,上面的例子仅适用于静态情况下展示已知数量的预定义选项;如果希望动态更新或允许用户自定义输入,则需要更复杂的逻辑设计以及额外的支持配合完成。 #### 方法二:借助第三方插件扩展能力 考虑到 ExcelJS 的局限性,还可以考虑引入一些专门针对 Web 环境优化过的组件,比如 Handsontable.js 或者 SheetJS 提供的一些高级特性。这类工具通常提供了更加丰富的交互体验和支持更多样化的配置选项,能够更好地适应复杂业务的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值