exceljs库实现excel表样式定制化

概览

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

一. 完整示例

代码示例

javascript 复制代码
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);  
  });  
};  

二. 设置表头和填充数据

javascript 复制代码
 // 定义列  
  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.columns中

header: 表头显示的内容;

key: 表格内容对应的属性key,和赋值的columnData中的属性名关联起来;

width:设置单元格的宽度。

三. 设置表头样式

javascript 复制代码
// 设置第一行表头背景色和字体颜色  
  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' } // 浅红色  
    };  
  });  

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

四. 总结

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

相关推荐
IT_陈寒11 分钟前
Vite的HMR把我整不会了:一个生产环境的热更新坑
前端·人工智能·后端
Mh22 分钟前
如何使用双缓冲优化视频切换
前端
risenav28 分钟前
低头蓄力,抬头起跳:《萤虫跳跳》的 Rokid AIUI 开发实战
前端
ZhengEnCi44 分钟前
如何看待 Fable 5.2 用纯代码生成 1.4MB 视觉作品:光追、水面、倒影、火光的程序化生成原理
前端
再吃一根胡萝卜1 小时前
DSH 插件的 Host 与 Client:为什么「只加载了 Host」,以及要不要自己写 Client 加载器
前端
parade岁月2 小时前
AI 写的前端代码为什么总像 5 年前的?Chrome 官方出手了
前端
新*2 小时前
从一段 WebSocket 代码聊开:bytes 不是 zlib、binaryType 决定一切,15MB 大消息的零拷贝优化
javascript·python·websocket·性能优化·blob·zlib·arraybuffer
tryCbest2 小时前
Vue系列——第 15 篇:内置组件全家桶——Transition、Teleport、Suspense、KeepAlive
前端·vue.js
易师傅2 小时前
技术面试已死?AI 时代,真正拉开程序员差距的是什么?
前端·后端·程序员
jay神3 小时前
基于深度学习的交通流量预测系统(Web 版)
前端·人工智能·深度学习·yolo·计算机毕业设计