ExcelJS:强大的JavaScript电子表格处理库
2026-02-06 04:52:57作者:邬祺芯Juliet
ExcelJS是一个功能丰富的JavaScript库,专门用于读取、操作和写入电子表格数据到XLSX和JSON文件。作为一个完全逆向工程的项目,它提供了与Excel文件格式的深度兼容性,支持Node.js和浏览器环境,是处理电子表格数据的理想选择。
项目概览
ExcelJS支持创建、修改和导出复杂的电子表格文件,包含完整的数据处理、样式设置、公式计算等功能。项目采用模块化架构,核心功能分布在lib目录下的多个子模块中,包括文档模型、XLSX转换器、工具函数等。
快速上手指南
环境配置
首先通过npm安装ExcelJS:
npm install exceljs
基础示例
以下是一个简单的创建Excel文件的示例:
const ExcelJS = require('exceljs');
// 创建工作簿
const workbook = new ExcelJS.Workbook();
workbook.creator = 'ExcelJS User';
workbook.created = new Date();
// 添加工作表
const worksheet = workbook.addWorksheet('员工数据');
// 设置列定义
worksheet.columns = [
{ header: 'ID', key: 'id', width: 10 },
{ header: '姓名', key: 'name', width: 20 },
{ header: '部门', key: 'department', width: 15 },
{ header: '薪资', key: 'salary', width: 12 }
];
// 添加数据行
worksheet.addRow({id: 1, name: '张三', department: '技术部', salary: 15000});
worksheet.addRow({id: 2, name: '李四', department: '市场部', salary: 12000});
worksheet.addRow({id: 3, name: '王五', department: '财务部', salary: 13000});
// 保存文件
workbook.xlsx.writeFile('员工信息表.xlsx')
.then(() => console.log('文件保存成功'))
.catch(error => console.error('保存失败:', error));
实战应用场景
数据导出功能
ExcelJS特别适合将数据库中的数据导出为结构化的Excel报表。支持自定义样式、公式计算、数据验证等高级功能。
// 批量数据导出示例
async function exportUserData(users) {
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('用户数据');
// 设置表头样式
worksheet.getRow(1).font = { bold: true, color: { argb: 'FFFFFF' } };
worksheet.getRow(1).fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '4472C4' } };
worksheet.columns = [
{ header: '用户ID', key: 'id', width: 15 },
{ header: '用户名', key: 'username', width: 20 },
{ header: '邮箱', key: 'email', width: 25 },
{ header: '注册时间', key: 'createdAt', width: 20 }
];
// 添加数据
users.forEach(user => {
worksheet.addRow(user);
});
// 自动调整列宽
worksheet.columns.forEach(column => {
let maxLength = 0;
column.eachCell({ includeEmpty: true }, cell => {
maxLength = Math.max(maxLength, cell.value ? cell.value.toString().length : 0);
});
column.width = maxLength + 2;
});
return workbook.xlsx.writeBuffer();
}
数据导入处理
ExcelJS提供了强大的数据导入功能,支持从XLSX和CSV文件读取数据。
// 数据导入示例
async function importUserData(filePath) {
const workbook = new ExcelJS.Workbook();
await workbook.xlsx.readFile(filePath);
const worksheet = workbook.getWorksheet(1);
const users = [];
worksheet.eachRow({ includeEmpty: false }, (row, rowNumber) => {
if (rowNumber > 1) { // 跳过表头
users.push({
id: row.getCell(1).value,
username: row.getCell(2).value,
email: row.getCell(3).value,
createdAt: row.getCell(4).value
});
}
});
return users;
}
动态报表生成
结合样式设置和公式功能,可以生成专业的业务报表。
// 销售报表生成示例
function generateSalesReport(salesData) {
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('销售报表');
// 设置报表标题
worksheet.mergeCells('A1:D1');
worksheet.getCell('A1').value = '2024年销售汇总报表';
worksheet.getCell('A1').font = { size: 16, bold: true };
worksheet.getCell('A1').alignment = { horizontal: 'center' };
// 设置数据列
worksheet.columns = [
{ header: '产品名称', key: 'product', width: 25 },
{ header: '季度1', key: 'q1', width: 12 },
{ header: '季度2', key: 'q2', width: 12 },
{ header: '季度3', key: 'q3', width: 12 },
{ header: '季度4', key: 'q4', width: 12 },
{ header: '年度总计', key: 'total', width: 15 }
];
// 填充数据
salesData.forEach(item => {
worksheet.addRow({
product: item.name,
q1: item.q1,
q2: item.q2,
q3: item.q3,
q4: item.q4,
total: { formula: `SUM(B${worksheet.rowCount}:E${worksheet.rowCount})` }
});
});
// 添加汇总行
const totalRow = worksheet.addRow({
product: '总计',
q1: { formula: `SUM(B2:B${worksheet.rowCount-1})` },
q2: { formula: `SUM(C2:C${worksheet.rowCount-1})` },
q3: { formula: `SUM(D2:D${worksheet.rowCount-1})` },
q4: { formula: `SUM(E2:E${worksheet.rowCount-1})` },
total: { formula: `SUM(F2:F${worksheet.rowCount-1})` }
});
totalRow.font = { bold: true };
totalRow.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FFF2F2F2' } };
return workbook;
}
开发最佳实践
异常处理机制
在处理大型Excel文件时,合理的异常处理至关重要。
async function safeExcelOperation() {
try {
const workbook = new ExcelJS.Workbook();
await workbook.xlsx.readFile('large-file.xlsx');
// 处理逻辑...
await workbook.xlsx.writeFile('output.xlsx');
} catch (error) {
console.error('Excel操作失败:', error.message);
// 具体的错误处理逻辑
if (error.code === 'ENOENT') {
console.error('文件不存在');
} else if (error.message.includes('corrupted')) {
console.error('文件可能已损坏');
}
throw error; // 重新抛出错误
}
}
性能优化策略
对于大型数据处理,采用流式操作可以显著提升性能。
// 流式写入示例
function streamLargeDataToExcel(dataStream) {
const workbook = new ExcelJS.stream.xlsx.WorkbookWriter({
filename: 'large-data.xlsx',
useStyles: true,
useSharedStrings: true
});
const worksheet = workbook.addWorksheet('大数据');
dataStream.on('data', chunk => {
worksheet.addRow(chunk).commit();
});
dataStream.on('end', () => {
worksheet.commit();
workbook.commit().then(() => {
console.log('流式写入完成');
});
});
return workbook;
}
质量保障方案
建立完整的测试体系确保代码质量。
// 单元测试示例
describe('ExcelJS功能测试', () => {
it('应该正确创建工作簿', () => {
const workbook = new ExcelJS.Workbook();
expect(workbook).toBeInstanceOf(ExcelJS.Workbook);
});
it('应该支持样式设置', async () => {
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('测试');
const cell = worksheet.getCell('A1');
cell.value = '测试内容';
cell.font = { bold: true, color: { argb: 'FF0000' } };
// 验证样式设置
expect(cell.font.bold).toBe(true);
expect(cell.font.color.argb).toBe('FF0000');
});
});
生态系统集成
ExcelJS可以与现代前端框架和后端服务无缝集成。
Node.js后端集成
// Express.js路由示例
app.get('/export/report', async (req, res) => {
try {
const workbook = await generateReport();
res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
res.setHeader('Content-Disposition', 'attachment; filename=report.xlsx');
await workbook.xlsx.write(res);
res.end();
} catch (error) {
res.status(500).json({ error: '导出失败' });
}
});
前端浏览器集成
<!-- 浏览器端使用 -->
<script src="https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js"></script>
<script>
// 在浏览器中创建和下载Excel
async function downloadExcel() {
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('数据');
worksheet.addRow(['名称', '数值']);
worksheet.addRow(['项目A', 100]);
worksheet.addRow(['项目B', 200]);
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 = 'data.xlsx';
link.click();
}
</script>
ExcelJS作为一个成熟的电子表格处理解决方案,提供了丰富的API和出色的性能,非常适合需要处理Excel文件的各类应用场景。其活跃的社区支持和持续的功能更新确保了项目的长期可靠性。
登录后查看全文
热门项目推荐
相关项目推荐
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
537
3.76 K
暂无简介
Dart
773
192
Ascend Extension for PyTorch
Python
343
405
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.34 K
755
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
1.07 K
97
React Native鸿蒙化仓库
JavaScript
303
356
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
337
180
AscendNPU-IR
C++
86
142
openJiuwen agent-studio提供零码、低码可视化开发和工作流编排,模型、知识库、插件等各资源管理能力
TSX
987
249