首页
/ 零门槛掌握ExcelJS:高效全场景JavaScript Excel处理指南

零门槛掌握ExcelJS:高效全场景JavaScript Excel处理指南

2026-04-13 09:44:31作者:尤辰城Agatha

你是否曾为JavaScript处理Excel文件而烦恼?无论是前端表格生成还是Node.js数据导出,ExcelJS都能成为你的得力助手。这款功能全面的开源库让你轻松实现Excel文件的读写与操作,无需复杂配置,几分钟即可上手。本文将带你从功能概述到实战应用,全面掌握ExcelJS的使用技巧,让数据处理变得简单高效。

功能概述:ExcelJS能为你做什么?

如何用三行代码生成专业报表?ExcelJS作为一款强大的JavaScript Excel处理库,提供了丰富的功能集,满足从简单数据导出到复杂报表生成的各种需求。它支持XLSX格式,可在Node.js和浏览器环境中运行,是全栈开发的理想选择。

核心功能一览

功能 适用场景 特点
工作簿管理 「数据报表」 创建、读取、修改Excel文件
单元格操作 「数据录入」 设置值、样式、公式
工作表操作 「多表管理」 添加、删除、重命名工作表
数据验证 「数据规范」 限制单元格输入内容
流式处理💧 「批量处理」 低内存占用处理大型文件

📌 基础功能快速体验

// 创建工作簿并添加数据
const ExcelJS = require('exceljs');
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('示例表');
worksheet.addRow(['姓名', '年龄', '邮箱']);
worksheet.addRow(['张三', 30, 'zhangsan@example.com']);
workbook.xlsx.writeFile('示例.xlsx');

💡 提示:首次使用时,记得通过npm install exceljs安装依赖。ExcelJS支持Promise语法,建议使用async/await处理异步操作。

场景解析:ExcelJS在实际项目中的应用

什么场景下ExcelJS能发挥最大价值?无论是企业报表生成还是Web应用数据导出,ExcelJS都能胜任。以下是几个典型应用场景:

1. 后端数据导出「Node.js数据导出」

在Express.js应用中,将数据库数据导出为Excel文件:

const express = require('express');
const ExcelJS = require('exceljs');
const app = express();

app.get('/export-users', async (req, res) => {
  // 1. 查询数据库获取用户数据
  const users = await User.find().lean();
  
  // 2. 创建工作簿和工作表
  const workbook = new ExcelJS.Workbook();
  const worksheet = workbook.addWorksheet('用户数据');
  
  // 3. 添加表头
  worksheet.addRow(['ID', '用户名', '邮箱', '注册时间']);
  
  // 4. 添加数据行
  users.forEach(user => {
    worksheet.addRow([
      user._id,
      user.username,
      user.email,
      user.createdAt.toISOString()
    ]);
  });
  
  // 5. 设置响应头并发送文件
  res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  res.setHeader('Content-Disposition', 'attachment; filename=users.xlsx');
  
  await workbook.xlsx.write(res);
  res.end();
});

2. 前端表格导出「前端表格生成」

在浏览器中直接生成并下载Excel文件:

<script src="https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js"></script>
<script>
async function exportTableToExcel() {
  // 1. 创建工作簿和工作表
  const workbook = new ExcelJS.Workbook();
  const worksheet = workbook.addWorksheet('销售数据');
  
  // 2. 从HTML表格获取数据
  const table = document.getElementById('salesTable');
  const rows = table.querySelectorAll('tr');
  
  // 3. 添加数据到工作表
  rows.forEach(row => {
    const cells = Array.from(row.querySelectorAll('td, th'));
    worksheet.addRow(cells.map(cell => cell.textContent));
  });
  
  // 4. 生成文件并下载
  const buffer = await workbook.xlsx.writeBuffer();
  const blob = new Blob([buffer], { 
    type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
  });
  
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = '销售报表.xlsx';
  a.click();
  
  URL.revokeObjectURL(url);
}
</script>

3. 大型数据处理「批量处理」

使用流式处理方式处理十万级数据:

const ExcelJS = require('exceljs');
const fs = require('fs');

async function processLargeData() {
  // 创建流式写入器
  const workbook = new ExcelJS.stream.xlsx.WorkbookWriter({
    filename: 'large-data.xlsx',
    useSharedStrings: true
  });
  
  const worksheet = workbook.addWorksheet('大数据表');
  
  // 添加表头
  worksheet.addRow(['ID', '名称', '数值']).commit();
  
  // 模拟10万行数据
  for (let i = 0; i < 100000; i++) {
    worksheet.addRow([
      i + 1,
      `项目${i + 1}`,
      Math.random() * 1000
    ]).commit();
    
    // 每1000行输出进度
    if (i % 1000 === 0) {
      console.log(`已处理 ${i} 行`);
    }
  }
  
  // 完成写入
  await workbook.commit();
  console.log('大型数据文件生成完成');
}

实战指南:5分钟上手ExcelJS

如何快速掌握ExcelJS的核心操作?按照以下步骤,你将在几分钟内创建一个格式化的Excel文件:

步骤1:安装与基础配置

# 安装ExcelJS
npm install exceljs

步骤2:创建工作簿和工作表

const ExcelJS = require('exceljs');

// 创建工作簿
const workbook = new ExcelJS.Workbook();

// 设置工作簿属性
workbook.creator = 'ExcelJS';
workbook.lastModifiedBy = 'Me';
workbook.created = new Date();
workbook.modified = new Date();

// 添加工作表
const worksheet = workbook.addWorksheet('我的工作表', {
  properties: { tabColor: { argb: 'FFC0000' } }
});

步骤3:添加数据和样式

// 定义列
worksheet.columns = [
  { header: 'ID', key: 'id', width: 10 },
  { header: '名称', key: 'name', width: 20 },
  { header: '数值', key: 'value', width: 15 }
];

// 添加数据行
worksheet.addRow({ id: 1, name: '项目A', value: 100 });
worksheet.addRow({ id: 2, name: '项目B', value: 200 });
worksheet.addRow({ id: 3, name: '总计', value: { formula: 'SUM(C2:C3)' } });

// 设置表头样式
worksheet.getRow(1).font = { bold: true, size: 12 };
worksheet.getRow(1).fill = {
  type: 'pattern',
  pattern: 'solid',
  fgColor: { argb: 'FFEEEEEE' }
};

// 设置公式单元格样式
worksheet.getCell('C4').font = { bold: true, color: { argb: 'FFFF0000' } };

步骤4:保存文件

// 保存到文件
await workbook.xlsx.writeFile('示例报表.xlsx');
console.log('文件保存成功');

进阶技巧:ExcelJS避坑指南与性能调优

掌握了基础操作后,如何进一步提升ExcelJS的使用效率?以下是一些进阶技巧和注意事项:

1. 数据验证功能

为单元格添加数据验证,确保输入符合规范:

// 添加下拉列表
worksheet.dataValidation.add('B2:B10', {
  type: 'list',
  allowBlank: true,
  formulae: ['"选项1,选项2,选项3"']
});

// 添加数值范围验证
worksheet.dataValidation.add('C2:C10', {
  type: 'whole',
  operator: 'between',
  formulae: [1, 100],
  showErrorMessage: true,
  errorTitle: '输入错误',
  error: '请输入1-100之间的整数'
});

2. 图片插入功能

在Excel中插入图片:

// 读取图片文件
const imageId = workbook.addImage({
  filename: 'test/data/bubbles.jpg',
  extension: 'jpeg',
});

// 将图片插入到工作表
worksheet.addImage(imageId, {
  tl: { col: 0, row: 5 },
  br: { col: 3, row: 10 },
  editAs: 'absolute'
});

ExcelJS图片插入示例

3. 性能优化技巧

处理大型文件时的性能优化:

  1. 使用流式处理而非一次性加载
  2. 禁用不必要的样式和共享字符串
  3. 批量提交行数据
  4. 避免频繁的单元格样式修改
// 性能优化示例
const worksheet = workbook.addWorksheet('优化工作表', {
  pageSetup: { paperSize: 9, orientation: 'landscape' }
});

// 禁用自动样式计算
worksheet.properties.enableCellStyles = false;

// 批量添加行
const rows = [];
for (let i = 0; i < 1000; i++) {
  rows.push([i, `数据${i}`, Math.random()]);
}
worksheet.addRows(rows);

4. ExcelJS vs 其他库功能对比

功能 ExcelJS SheetJS XLSX
读取能力 ★★★★★ ★★★★☆ ★★★★☆
写入能力 ★★★★★ ★★★☆☆ ★★★☆☆
样式支持 ★★★★☆ ★☆☆☆☆ ★☆☆☆☆
流式处理 ★★★★☆ ★★☆☆☆ ★★☆☆☆
浏览器支持 ★★★★☆ ★★★★★ ★★★★★
体积大小 ~150KB ~100KB ~100KB

常见问题速查

Q: ExcelJS支持哪些Excel格式? A: ExcelJS主要支持XLSX格式,不支持旧版XLS格式。对于XLS文件,建议先转换为XLSX格式再进行处理。

Q: 如何处理大型Excel文件? A: 对于超过10万行的大型文件,应使用流式处理(WorkbookWriter)而非普通Workbook,以减少内存占用。

Q: 浏览器环境下如何读取本地Excel文件? A: 可以通过FileReader API读取本地文件,再传递给ExcelJS的read方法:

const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', async (e) => {
  const file = e.target.files[0];
  const reader = new FileReader();
  
  reader.onload = async (event) => {
    const buffer = event.target.result;
    const workbook = new ExcelJS.Workbook();
    await workbook.xlsx.load(buffer);
    // 处理工作簿
  };
  
  reader.readAsArrayBuffer(file);
});

Q: 如何设置单元格合并? A: 使用mergeCells方法:

// 合并A1到C1单元格
worksheet.mergeCells('A1:C1');
worksheet.getCell('A1').value = '合并单元格示例';
worksheet.getCell('A1').alignment = { horizontal: 'center' };

通过本文的介绍,你已经掌握了ExcelJS的核心功能和使用技巧。无论是简单的数据导出还是复杂的报表生成,ExcelJS都能满足你的需求。开始尝试使用ExcelJS,让数据处理变得更加高效简单吧!

登录后查看全文
热门项目推荐
相关项目推荐