• exceljs库实现excel表样式定制化


    概览

    xlsx 是前端最热门的 Excel 导出方案,又叫做 SheetJs,默认不支持修改 Excel 的样式。而exceljs库就可以做到自定义excel表样式,下面来介绍一下其使用方法

    一. 完整示例

    代码示例

    const exportTemplate2 = () => {  
      // 创建工作簿  
      const workbook = new ExcelJS.Workbook();  
      const worksheet = workbook.addWorksheet('sheet1');  
      
      // 定义列  
      worksheet.columns = [  
        { header: 'Id11111111111111111111', key: 'id', width: 20 },  
        { header: 'Name233', key: 'name', width: 20 },  
        { header: 'D.O.B999', key: 'dob', width: 20 }  
      ];  
      
      // 添加二级表头  
      worksheet.addRow(['二级表头A', '二级表头B', '二级表头C']);  
      
      // 填充数据  
      const columnData = [  
        { id: 15, name: 99, dob: '2024-04-16' },  
        { id: 50, name: 101, dob: '2024-04-17' }  
      ];  
      columnData.forEach(item => {  
        worksheet.addRow(item);  
      });  
      
      // 设置第一行表头背景色和字体颜色  
      worksheet.getRow(1).eachCell({ includeEmpty: true }, (cell, colNumber) => {  
        cell.fill = {  
          type: 'pattern',  
          pattern: 'solid',  
          fgColor: { argb: (colNumber === 1 || colNumber === 2) ? 'FF79bbff' : 'FF95d475' }  
        };  
        cell.font = {  
          size: 14,  
          color: { argb: 'FFFFFFFF' } // 白色  
        };  
      });  
      
      // 设置第二行表头字体颜色  
      worksheet.getRow(2).eachCell({ includeEmpty: true }, (cell) => {  
        cell.font = {  
          size: 14,  
          color: { argb: 'FFF89898' } // 浅红色  
        };  
      });  
      
      // 应用自动筛选  
      worksheet.autoFilter = 'A1:C2'; // 筛选整个表头区域  
      
      // 合并单元格  
      worksheet.mergeCells("A1:C1"); // 合并整个第一行  
      
      // 添加条件格式  
      worksheet.addConditionalFormatting({  
        ref: "B3:B4",  
        rules: [  
          {  
            type: 'cellIs',  
            operator: 'lessThan',  
            priority: 1,  
            formulae: ['100'],  
            style: {  
              fill: {  
                type: 'pattern',  
                pattern: 'solid',  
                fgColor: { argb: 'FF95d475' },  
              },  
            },  
          },  
        ],  
      });  
      
      // 添加求和公式到A5单元格  
      worksheet.getCell('A5').value = {  
        formula: 'SUM(A3:A4)',  
        result: null // ExcelJS会自动计算结果,无需显式设置result为null  
      };  
      
      // 计算工作表  
      console.log(worksheet,'worksheet')
      
      // 写入Excel文件  
      workbook.xlsx.writeBuffer().then((buffer) => {  
        const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });  
        saveAs(blob, 'ExcelJS.xlsx');  
      }).catch((error) => {  
        console.error('Error exporting Excel file:', error);  
      });  
    };  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88

    二. 设置表头和填充数据

     // 定义列  
      worksheet.columns = [  
        { header: 'Id11111111111111111111', key: 'id', width: 20 },  
        { header: 'Name233', key: 'name', width: 20 },  
        { header: 'D.O.B999', key: 'dob', width: 20 }  
      ];  
      
      // 添加二级表头  
      worksheet.addRow(['二级表头A', '二级表头B', '二级表头C']);  
      
      // 填充数据  
      const columnData = [  
        { id: 15, name: 99, dob: '2024-04-16' },  
        { id: 50, name: 101, dob: '2024-04-17' }  
      ];  
      columnData.forEach(item => {  
        worksheet.addRow(item);  
      });  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    worksheet.columns中

    header: 表头显示的内容;
    key: 表格内容对应的属性key,和赋值的columnData中的属性名关联起来;
    width:设置单元格的宽度。

    三. 设置表头样式

    // 设置第一行表头背景色和字体颜色  
      worksheet.getRow(1).eachCell({ includeEmpty: true }, (cell, colNumber) => {  
        cell.fill = {  
          type: 'pattern',  
          pattern: 'solid',  
          fgColor: { argb: (colNumber === 1 || colNumber === 2) ? 'FF79bbff' : 'FF95d475' }  
        };  
        cell.font = {  
          size: 14,  
          color: { argb: 'FFFFFFFF' } // 白色  
        };  
      });  
      
      // 设置第二行表头字体颜色  
      worksheet.getRow(2).eachCell({ includeEmpty: true }, (cell) => {  
        cell.font = {  
          size: 14,  
          color: { argb: 'FFF89898' } // 浅红色  
        };  
      });  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    argb: 前面两位为透明度设置,通常设置成FF就行,代表不透明,比如黑色十六进制为#000000,转换成argb格式转成FF000000即可。

    四. 总结

    抛砖引玉,以上示例是我们日常工作较常见的场景,更多功能大家可以继续探索。

  • 相关阅读:
    dflow入门4——recurse&reuse&conditional
    【剑指Offer】45. 把数组排成最小的数
    深入理解Linux网络总结
    为什么defineProps宏函数不需要从vue中import导入?
    因为在此系统上禁止运行脚本
    centerOS搭建kafka集群
    [python][flask] Jinja 模板入门
    SCA算法优化脉冲耦合神经网络的图像自动分割(Matlab代码实现)
    5年Java面试阿里P6经验总结
    pytest+yaml实现接口自动化框架
  • 原文地址:https://blog.csdn.net/m0_45093055/article/details/137930947