ExcelJS:轻松实现Excel文件的读取、操作与写入
创始人
2024-12-09 18:07:13
0

文章目录

  • 发现宝藏
    • 1. 简介
    • 2. 安装
    • 3. 创建工作簿
    • 4. 设置工作簿属性
    • 5. 添加工作表
    • 6.删除工作表
    • 7.访问工作表
    • 8. 列操作
    • 9. 行操作
    • 10. 单元格操作

发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。

ExcelJS 是一个强大的 JavaScript 库,它允许你在 Node.js 和浏览器环境中读取、操作和写入 Excel 文件。本文将带你了解 ExcelJS 的基本用法,帮助你快速上手这个强大的工具。

1. 简介

ExcelJS 是一个开源的 JavaScript 库,支持读写 XLSX 和 CSV 格式的 Excel 文件。它具有以下特点:

  • 支持丰富的 Excel 功能,如单元格样式、公式、图表等。
  • 良好的文档和社区支持。
  • 跨平台,可在 Node.js 和浏览器环境中使用。

2. 安装

在开始使用 ExcelJS 之前,需要先进行安装。以下是在 Node.js 环境中的安装方法:

npm install exceljs 

如果你在浏览器环境中使用,可以直接从 GitHub 仓库下载 exceljs.js 文件。

3. 创建工作簿

首先,我们需要创建一个工作簿(Workbook)对象,然后才能进行其他操作。

const workbook = new ExcelJS.Workbook(); 

4. 设置工作簿属性

可以为工作簿设置一些基本属性,如创建者、最后修改者、创建时间等。

workbook.creator = 'Me'; workbook.lastModifiedBy = 'Her'; workbook.created = new Date(1985, 8, 30); workbook.modified = new Date(); workbook.lastPrinted = new Date(2016, 9, 27);  // 将工作簿日期设置为 1904 年日期系统 workbook.properties.date1904 = true; 

5. 添加工作表

工作簿(Workbook)由多个工作表(Worksheet)组成。以下是如何添加一个工作表:

const sheet = workbook.addWorksheet('My Sheet'); 

使用 addWorksheet 函数的第二个参数来指定工作表的选项。

// 创建带有红色标签颜色的工作表 const sheet = workbook.addWorksheet('My Sheet', {properties:{tabColor:{argb:'FFC0000'}}});  // 创建一个隐藏了网格线的工作表 const sheet = workbook.addWorksheet('My Sheet', {views: [{showGridLines: false}]});  // 创建一个第一行和列冻结的工作表 const sheet = workbook.addWorksheet('My Sheet', {views:[{xSplit: 1, ySplit:1}]});  // 使用A4设置的页面设置设置创建新工作表 - 横向 const worksheet =  workbook.addWorksheet('My Sheet', {   pageSetup:{paperSize: 9, orientation:'landscape'} });  // 创建一个具有页眉页脚的工作表 const sheet = workbook.addWorksheet('My Sheet', {   headerFooter:{firstHeader: "Hello Exceljs", firstFooter: "Hello World"} });  // 创建一个冻结了第一行和第一列的工作表 const sheet = workbook.addWorksheet('My Sheet', {views:[{state: 'frozen', xSplit: 1, ySplit:1}]});  

6.删除工作表

// 创建工作表 const sheet = workbook.addWorksheet('My Sheet');  // 使用工作表 id 删除工作表 workbook.removeWorksheet(sheet.id) 

7.访问工作表

// 遍历所有工作表 // 注意: workbook.worksheets.forEach 仍然是可以正常运行的, 但是以下的方式更好 workbook.eachSheet(function(worksheet, sheetId) {   // ... });  // 按 name 提取工作表 const worksheet = workbook.getWorksheet('My Sheet');  // 按 id 提取工作表 const worksheet = workbook.getWorksheet(1); 

8. 列操作

可以为工作表设置列宽、列名等属性。

// 添加列标题并定义列键和宽度 // 注意:这些列结构仅是构建工作簿的方便之处,除了列宽之外,它们不会完全保留。 worksheet.columns = [   { header: 'Id', key: 'id', width: 10 },   { header: 'Name', key: 'name', width: 32 },   { header: 'D.O.B.', key: 'DOB', width: 10, outlineLevel: 1 } ];  // 通过键,字母和基于1的列号访问单个列 const idCol = worksheet.getColumn('id'); const nameCol = worksheet.getColumn('B'); const dobCol = worksheet.getColumn(3);  // 设置列属性  // 注意:将覆盖 C1 单元格值 dobCol.header = 'Date of Birth';  // 注意:这将覆盖 C1:C2 单元格值 dobCol.header = ['Date of Birth', 'A.K.A. D.O.B.'];  // 从现在开始,此列将以 “dob” 而不是 “DOB” 建立索引 dobCol.key = 'dob';  dobCol.width = 15;  // 如果需要,隐藏列 dobCol.hidden = true;  // 为列设置大纲级别 worksheet.getColumn(4).outlineLevel = 0; worksheet.getColumn(5).outlineLevel = 1;  // 列支持一个只读字段,以指示基于 `OutlineLevel` 的折叠状态 expect(worksheet.getColumn(4).collapsed).to.equal(false); expect(worksheet.getColumn(5).collapsed).to.equal(true);  // 遍历此列中的所有当前单元格 dobCol.eachCell(function(cell, rowNumber) {   // ... });  // 遍历此列中的所有当前单元格,包括空单元格 dobCol.eachCell({ includeEmpty: true }, function(cell, rowNumber) {   // ... });  // 添加一列新值 worksheet.getColumn(6).values = [1,2,3,4,5];  // 添加稀疏列值 worksheet.getColumn(7).values = [,,2,3,,5,,7,,,,11];  // 剪切一列或多列(右边的列向左移动) // 如果定义了列属性,则会相应地对其进行切割或移动 // 已知问题:如果拼接导致任何合并的单元格移动,结果可能是不可预测的 worksheet.spliceColumns(3,2);  // 删除一列,再插入两列。 // 注意:第4列及以上的列将右移1列。 // 另外:如果工作表中的行数多于列插入项中的值,则行将仍然被插入,就好像值存在一样。 const newCol3Values = [1,2,3,4,5]; const newCol4Values = ['one', 'two', 'three', 'four', 'five']; worksheet.spliceColumns(3, 1, newCol3Values, newCol4Values);  

9. 行操作

以下是如何添加行、设置行高、隐藏行等操作。

  • 添加行
// 通过键值对在当前最后一行后添加几行,使用列键 worksheet.addRow({id: 1, name: 'John Doe', dob: new Date(1970,1,1)}); worksheet.addRow({id: 2, name: 'Jane Doe', dob: new Date(1965,1,7)});  // 通过连续数组添加一行(分配给列 A、B 和 C) worksheet.addRow([3, 'Sam', new Date()]);  // 通过稀疏数组添加一行(分配给列 A、E 和 I) const rowValues = []; rowValues[1] = 4; rowValues[5] = 'Kyle'; rowValues[9] = new Date(); worksheet.addRow(rowValues);  // 添加一行并继承样式 // 这新行将具有与最后一行相同的样式 // 并返回为行对象 const newRow = worksheet.addRow(rowValues, 'i');  // 添加多行 const rows = [   [5,'Bob',new Date()], // 通过数组添加行   {id:6, name: 'Barbara', dob: new Date()} // 通过对象添加行 ]; // 添加新行并返回它们作为行对象数组 const newRows = worksheet.addRows(rows);  // 添加多行并继承样式 // 这些新行将具有与最后一行相同的样式 // 并返回它们作为行对象数组 const newRowsStyled = worksheet.addRows(rows, 'i'); 
  • 插入行
// 在指定位置插入一行,可以传递值和样式 // pos: 要插入行的位置 // value: 要插入的行的值,可以是对象或数组 // style: 可选参数,指定新行的样式处理方式,默认为 'n'(无样式处理)  // 通过键值对在位置1插入几行,每次插入都会下移现有行 worksheet.insertRow(1, {id: 1, name: 'John Doe', dob: new Date(1970,1,1)}); worksheet.insertRow(1, {id: 2, name: 'Jane Doe', dob: new Date(1965,1,7)});  // 通过连续数组在位置1插入一行(分配给列 A, B & C) worksheet.insertRow(1, [3, 'Sam', new Date()]);  // 通过稀疏数组在位置1插入一行(分配给列 A, E & I) var rowValues = []; rowValues[1] = 4; rowValues[5] = 'Kyle'; rowValues[9] = new Date(); // 插入新行并返回作为行对象 const insertedRow = worksheet.insertRow(1, rowValues);  // 插入一行,并继承上方行的样式 // 这新行将具有与上方行相同的样式 // 并返回作为行对象 const insertedRowInherited = worksheet.insertRow(1, rowValues, 'i');  // 插入一行,保持原始样式 // 这新行将保持它之前的样式 // 并返回作为行对象 const insertedRowOriginal = worksheet.insertRow(1, rowValues, 'o');  // 在位置1插入多行,当前位置1及之后的行将下移2行 var rows = [   [5,'Bob',new Date()], // 通过数组添加行   {id:6, name: 'Barbara', dob: new Date()} // 通过对象添加行 ]; // 插入新行并返回它们作为行对象数组 const insertedRows = worksheet.insertRows(1, rows);  // 插入多行,并继承上方行的样式 // 这些新行将具有与上方行相同的样式 // 并返回它们作为行对象数组 const insertedRowsInherited = worksheet.insertRows(1, rows, 'i');  // 插入多行,保持原始样式 // 这些新行将保持它们在 'pos' 位置的原始样式 const inserted  

10. 单元格操作

可以对单元格进行赋值、设置样式等操作。

  • 处理单个单元格
const cell = worksheet.getCell('C3');  // 修改/添加单个单元格 cell.value = new Date(1968, 5, 1);  // 查询单元格的类型 expect(cell.type).toEqual(Excel.ValueType.Date);  // 使用单元格的字符串值 myInput.value = cell.text;  // 使用 html 安全的字符串进行渲染... const html = '
' + cell.html + '
';
  • 合并单元格
// 合并一系列单元格 worksheet.mergeCells('A4:B5');  // ...合并的单元格被链接起来了 worksheet.getCell('B5').value = 'Hello, World!'; expect(worksheet.getCell('B5').value).toBe(worksheet.getCell('A4').value); expect(worksheet.getCell('B5').master).toBe(worksheet.getCell('A4'));  // ...合并的单元格共享相同的样式对象 expect(worksheet.getCell('B5').style).toBe(worksheet.getCell('A4').style); worksheet.getCell('B5').style.font = myFonts.arial; expect(worksheet.getCell('A4').style.font).toBe(myFonts.arial);  // 取消单元格合并将打破链接的样式 worksheet.unMergeCells('A4'); expect(worksheet.getCell('B5').style).not.toBe(worksheet.getCell('A4').style); expect(worksheet.getCell('B5').style.font).not.toBe(myFonts.arial);  // 按左上,右下合并 worksheet.mergeCells('K10', 'M12');  // 按开始行,开始列,结束行,结束列合并(相当于 K10:M12) worksheet.mergeCells(10,11,12,13); 

相关内容

热门资讯

总算了解!老胡麻将赢牌技巧,白... 总算了解!老胡麻将赢牌技巧,白金岛跑胡子有挂吗,雀神小程序能开挂吗(详细教程)1、任何老胡麻将赢牌技...
四分钟攻略!决胜奕福怎么开挂,... 四分钟攻略!决胜奕福怎么开挂,友相逢麻将有挂吗(其实者的有挂)1、决胜奕福怎么开挂透视辅助简单,决胜...
8分钟辅助挂!衡阳丫丫棋牌可以... 8分钟辅助挂!衡阳丫丫棋牌可以装挂吗,闽游十三水果真真的有挂,微扑克教程(有挂脚本);1、衡阳丫丫棋...
科普攻略!微扑克wpk辅助软件... 科普攻略!微扑克wpk辅助软件,腾讯广东麻将真的有挂吗,安装教程(有挂脚本);1、金币登录送、破产送...
推荐一款!!德扑牌型胜率计算,... 推荐一款!!德扑牌型胜率计算,奇迹陕西棋牌外 挂,黑科技教程(有挂攻略);1、这是跨平台的奇迹陕西棋...
1分钟辅助!白金岛放炮罚手气臭... 您好,白金岛放炮罚手气臭怎么打这款游戏可以开挂的,确实是有挂的,需要了解加微【757446909】很...
十分钟辅助挂!多乐麻将是不是有... 十分钟辅助挂!多乐麻将是不是有挂,天天闲来麻将一直真的有挂,解密教程(有挂详情);十分钟辅助挂!多乐...
玩家亲测!贵阳手机天天麻将ap... 玩家亲测!贵阳手机天天麻将app辅牌器购买,闽游十三水辅助,雀神开外挂专用辅助器下载安装(详细教程)...
总算了解!!云扑克有辅助软件,... 总算了解!!云扑克有辅助软件,血战到底能作弊么,软件教程(有挂技巧);1、玩家可以在血战到底能作弊么...
9分钟规律!科乐麻将助赢神器,... 9分钟规律!科乐麻将助赢神器,鄂州晃晃麻将app有没有挂(其实一直都是有挂);1、完成鄂州晃晃麻将a...