使用ExcelJS实现Excel数据报表导出的完整指南_vue.js

在开始技术细节前,让我们建立直观认知 - 每个ExcelJS操作对应Excel软件中的什么操作:

const workbook = new ExcelJS.Workbook();

相当于:双击打开一个全新的Excel文件

worksheet.pageSetup = { orientation: 'landscape' // 横向};

相当于:页面布局 → 纸张方向 → 横向

cell 是通过工作表(Worksheet)对象获取的特定单元格引用。通俗来讲:在这里cell就是你 选中工作表中的哪些部分 ,选中之后就可以 对选中的部分设置样式 了。

cell.font = { name: '微软雅黑', size: 12};

相当于:右键单元格 → 设置单元格格式 → 字体选项卡

cell.border = { top: { style: 'double' }};

相当于:开始 → 边框 → 其他边框 → 选择上边框线型

这里可能就是有人要问了,你的cell(单元格)是哪里来的呐?接下来告诉你真相:

(1) 通过行列坐标直接获取

const cell = worksheet.getCell('B3'); // 相当于在Excel中点击B3单元格

const cell = worksheet.getCell(3, 2); // 行号3,列号2(即B3)

(2) 通过行对象获取

const row = worksheet.getRow(3); // 获取第3行const cell = row.getCell(2); // 获取该行第2列的单元格

(3) 添加行时直接操作

worksheet.addRow([10, '张三']).eachCell((cell, colNumber) => { if(colNumber === 2) { // 第二列 cell.font = { name: '微软雅黑', size: 12 }; }});

worksheet.addConditionalFormatting({ ref: 'A1:A10', rules: [{ type: 'cellIs', operator: 'greaterThan', formulae: [100], style: { fill: { type: 'solid', fgColor: { argb: 'FFFF0000' } } } }]});

相当于:开始 → 条件格式 → 突出显示单元格规则 → 大于

worksheet.mergeCells('A1:D1');

相当于:选中A1:D1区域 → 开始 → 合并后居中

cell.border = { diagonal: { up: true }};

相当于:右键单元格 → 设置单元格格式 → 边框 → 斜线

worksheet.dataValidation.add('B2:B100', { type: 'list', formulae: ['"男,女"']});

相当于:数据 → 数据验证 → 允许"序列" → 输入"男,女"

cell.value = { formula: 'SUM(B2:C2)', result: 150 };

相当于:在单元格输入"=SUM(B2:C2)" → 按Enter显示计算结果

saveAs(new Blob([buffer]), 'report.xlsx');

相当于:文件 → 另存为 → 选择保存位置

res.setHeader('Content-Type', 'application/vnd.ms-excel');

相当于:SharePoint/OneDrive中的"下载"功能

通过这种可视化操作与代码的精确对应,开发者可以更直观地理解ExcelJS的各个API用途,从而构建出真正符合业务需求的专业报表系统

const transformedData = response.data.list.map((item, index) => ({ 序号: index + 1, 学生姓名: item.name, 性别: item.gender === "male" ? "男" : "女", // 数据字典转换 // ...其他字段 录取时间: item.admission_time ? dayjs(item.admission_time).format("YYYY-MM-DD HH:mm:ss") : "--" // 处理空值}));

关键点:

const workbook = new ExcelJS.Workbook();const worksheet = workbook.addWorksheet("学生报名信息");

对应Excel操作:

// 合并单元格worksheet.mergeCells("A1:N1"); // 设置标题内容const titleCell = worksheet.getCell("A1");titleCell.value = `学生报名信息(${dateRange})`;// 设置样式titleCell.font = { name: "宋体", // 对应Excel字体下拉框 size: 16, // 字号设置 bold: true // 加粗按钮};titleCell.alignment = { horizontal: "center" // 对应Excel居中按钮};

const headers = ["序号", "学生姓名", ...];const headerRow = worksheet.addRow(headers);// 样式设置headerRow.eachCell(cell => { cell.border = { top: { style: "thin" }, // 对应Excel边框工具栏 // ...其他边框 }; cell.fill = { type: "pattern", pattern: "solid", // 对应Excel油漆桶工具 fgColor: { argb: "FFD9D9D9" } };});

专业技巧:

transformedData.forEach(item => { const row = worksheet.addRow(Object.values(item)); row.eachCell((cell, colNumber) => { // 第六列(家庭住址)左对齐,其他居中 cell.alignment = { horizontal: colNumber === 6 ? "left" : "center" }; // 斑马线效果 if(row.number % 2 === 0) { cell.fill = { type: "pattern", fgColor: { argb: "FFF9F9F9" } }; } });});

性能优化:

worksheet.columns = [ { width: 6 }, // 序号列 { width: 10 }, // 姓名列 // ...其他列 { width: 30 } // 地址列(最宽)];

设计原则:

const buffer = await workbook.xlsx.writeBuffer();const blob = new Blob([buffer], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });saveAs(blob, `学生报名信息_${dateRange}.xlsx`);

关键参数:

开发时可先注释掉部分样式代码

逐步添加:先结构 → 基础样式 → 高级效果

实时查看单元格地址:

console.log(`当前处理单元格:${cell.address}`);

样式覆盖检查:

// 查看最终应用的样式console.log(cell.style);

worksheet.views = [{ state: 'frozen', ySplit: 2 // 冻结前两行(标题+表头)}];

数据验证(如性别列):

worksheet.views = [{ state: 'frozen', ySplit: 2 // 冻结前两行(标题+表头)}];

数据验证(如性别列):

worksheet.dataValidation.add('C3:C100', { type: 'list', formulae: ['"男,女"']});

通过这样逐步拆解,您可以看到每个代码块都对应着具体的Excel操作,就像在GUI界面中手动操作一样直观,但通过代码实现了批量和精准控制

到此这篇关于使用ExcelJS实现Excel数据报表导出的完整指南的文章就介绍到这了,更多相关ExcelJS导出Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


本文地址: https://www.earthnavs.com/jishuwz/97fc6201f0e8816284c7.html
全局中部横幅
SegmentFault

SegmentFault思否是中国专业的开发者技术社区。我们以技术问答、技术博客、技术课程、技术资讯为核心的产品形态,为开发者提供纯粹、高质的技术交流平台。

梦想思维优质互联网资源分享平台

梦想资源站-优质的互联网分享平台资源每日更新

《Linux就该这么学》

Linux就该这么学(LinuxProbe)—系统化的Linux学习与运维实战站点:命令行、RHEL10、RHCSA/RHCE、Shell脚本、Ansible、Docker、Kubernetes、服务器部署与优化教程。

登录

该站点未添加描述description...

4K壁纸

彼岸图网专注提供免费4K壁纸,4K高清壁纸,带鱼屏壁纸,4K,5K,6K,7K,8K壁纸,高清图片素材,包含4K游戏、动漫、美女、风景、影视、汽车、动物、背景、手机等高清4k电脑壁纸

ASUS

ASUS,华硕,ASUS官网,华硕官网,华硕官方网站,ASUS,华硕,华硕电脑.华硕始终对质量与创新全力以赴,不断为消费者及企业用户提供崭新的科技解决方案.华硕拥有众多划时代的产品,查找&购买笔记本电脑,游戏手机,路由器,显示器,主板及更多产品.

域名代理注册

ResellerClub-域名主机提供商,19年行业经验,专业提供域名注册,虚拟主机,云虚拟主机,独立服务器,VPS主机,企业邮局,自助建站,SSL数字证书,网站安全备份等产品。全球域名注册商前十强,200,000家域名主机商的第一选择!

群英网络

群英网络专业智能安全云计算服务商,17年老牌IDC商。提供高防服务器、云服务器、香港服务器、服务器租用托管等,全新二代智能平台,提供全方位云安全解决方案。群防超过1500G盾,BGP神级防护线路.

七牛云

2011年成立以来,七牛云致力于成为全球领先的一站式中立音视频云 + AI 服务商,围绕数字化浪潮下的在线音视频需求,基于强大的云边一体化能力和低代码能力,持续在视频点播、互动直播、实时音视频、摄像头上云等领域,进行深度技术投入,提供面向业务场景的视频云解决方案。截至目前,有超过100万企业客户和开发者长期使用七牛云服务,包括OPPO、爱奇艺、平安银行、招商银行、上汽集团、芒果TV等知名企业。

我来

用“我来”搭建一站式协作平台,团队知识库、仪表台、工作流、内部应用、外部网站与个人云端笔记、待办……开箱即用!