使用ExcelJS快速處理Node.js爬蟲(chóng)數(shù)據(jù)
什么是ExcelJS
ExcelJS是一個(gè)用于處理Excel文件的JavaScript庫(kù)。它可以讓你使用JavaScript創(chuàng)建、讀取和修改Excel文件。
以下是ExcelJS的一些主要特點(diǎn):
- 支持xlsx、xlsm、xlsb、xls格式的Excel文件。
- 可以創(chuàng)建和修改工作表、單元格、行和列。
- 可以設(shè)置單元格樣式、字體、背景顏色等。
- 可以設(shè)置工作表的打印選項(xiàng)。
- 可以將Excel文件保存到本地或者下載到瀏覽器中。
- 支持流式寫入大型Excel文件,以避免內(nèi)存限制問(wèn)題。
我們使用ExcelJS可以輕松地將數(shù)據(jù)轉(zhuǎn)換為Excel文件,并且可以通過(guò)代碼自動(dòng)化地創(chuàng)建和修改Excel文件。
ExcelJS的基本使用
安裝ExcelJS
在命令行中使用命令來(lái)安裝Excel.js
npm install exceljs
創(chuàng)建工作簿
Excel.js庫(kù)提供了創(chuàng)建新的工作簿、打開(kāi)已有的工作簿以及保存工作簿的方法。
首先我們需要引入Excel.js庫(kù):
const ExcelJS = require('exceljs');
接著,我們可以使用以下代碼創(chuàng)建一個(gè)新的工作簿:
const workbook = new ExcelJS.Workbook();
這個(gè)代碼將會(huì)創(chuàng)建一個(gè)空的工作簿。我們可以通過(guò)以下代碼添加一個(gè)新的工作表:
const worksheet = workbook.addWorksheet('Sheet1');
這個(gè)代碼將會(huì)在工作簿中添加一個(gè)名為’Sheet1’的新工作表。我們也可以使用以下代碼獲取已有的工作表:
const worksheet = workbook.getWorksheet('Sheet1');
這個(gè)代碼將會(huì)獲取名為’Sheet1’的工作表。如果工作簿中不存在這個(gè)工作表,那么這個(gè)代碼將會(huì)返回undefined。
在創(chuàng)建新的工作表時(shí),我們可以指定一些選項(xiàng)來(lái)控制新工作表的行數(shù)、列數(shù)、列寬和行高等,例如:
const options = { pageSetup: {paperSize: 9, orientation: 'landscape'}, properties: {tabColor: {argb:'FFC0000'}} }; const worksheet = workbook.addWorksheet('Sheet1', options);
這個(gè)代碼將會(huì)創(chuàng)建一個(gè)名為’Sheet1’的新工作表,并設(shè)置紙張大小為’A4’、方向?yàn)?rsquo;橫向’,以及選項(xiàng)卡顏色為橙色。
除此之外,我們還可以使用以下代碼刪除一個(gè)已有的工作表:
workbook.removeWorksheet(worksheet);
這個(gè)代碼將會(huì)刪除名為’Sheet1’的工作表。需要注意的是,如果工作簿中只剩下一個(gè)工作表,那么這個(gè)工作表是不能被刪除的。
最后我們需要使用以下代碼保存工作簿:
workbook.xlsx.writeFile('example.xlsx') .then(function() { console.log('文件已保存'); });
這個(gè)代碼將會(huì)把工作簿保存為’example.xlsx’文件。需要注意的是,Excel.js庫(kù)支持保存為多種格式,包括.xlsx、.xls、.csv等。
操作單元格
Excel.js庫(kù)提供了一系列方法來(lái)操作單元格,例如獲取單元格、設(shè)置單元格值、合并單元格和設(shè)置單元格樣式等
首先我們可以使用以下代碼創(chuàng)建一個(gè)新的工作簿和工作表:
const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('Sheet1');
獲取單元格
我們可以使用以下代碼獲取一個(gè)單元格:
const cell = worksheet.getCell('A1');
這個(gè)代碼將會(huì)獲取’Sheet1’工作表中的A1單元格。我們也可以使用以下代碼獲取一個(gè)單元格的行和列:
const cell = worksheet.getRow(1).getCell(1);
這個(gè)代碼將會(huì)獲取’Sheet1’工作表中的A1單元格。
設(shè)置單元格值
然后我們可以使用以下代碼設(shè)置一個(gè)單元格的值:
worksheet.getCell('A1').value = 'Hello, World!';
這個(gè)代碼將會(huì)在’Sheet1’工作表中的A1單元格設(shè)置值為’Hello, World!’
Excel.js庫(kù)支持各種數(shù)據(jù)類型,包括字符串、數(shù)字、日期和布爾值等。
合并單元格
我們可以使用以下代碼合并一個(gè)區(qū)域內(nèi)的單元格:
worksheet.mergeCells('B2:C3');
這個(gè)代碼將會(huì)合并’Sheet1’工作表中B2到C3區(qū)域內(nèi)的所有單元格。
需要注意的是,合并單元格時(shí),只有左上角的單元格保留了原有的值,其他單元格的值都被清空了。
設(shè)置單元格樣式
我們可以使用以下代碼設(shè)置一個(gè)單元格的樣式:
worksheet.getCell('A1').font = {bold: true}; worksheet.getCell('A1').fill = {type: 'pattern', pattern: 'solid', fgColor: {argb: 'FFFF0000'}}; worksheet.getCell('A1').border = {top: {style: 'thin'}, left: {style: 'thin'}, bottom: {style: 'thin'}, right: {style: 'thin'}}; worksheet.getCell('A1').alignment = {horizontal: 'center', vertical: 'middle'};
這個(gè)代碼將會(huì)設(shè)置’Sheet1’工作表中的A1單元格的字體加粗、背景顏色為紅色、邊框?yàn)閷?shí)線細(xì)邊框、水平居中和垂直居中。
讀取和寫入數(shù)據(jù)
讀取工作表中的數(shù)據(jù)
我們可以使用以下代碼讀取工作表中的數(shù)據(jù):
worksheet.eachRow({ includeEmpty: false }, function(row, rowNumber) { console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values)); });
上述代碼將會(huì)遍歷’Sheet1’工作表中的每一行并打印出每一行的值,這里我們使用了includeEmpty選項(xiàng)來(lái)忽略空行。
除此之外,我們還可以使用以下代碼獲取’Sheet1’工作表中的A1單元格的值:
const data = [ { name: 'John', age: 30 }, { name: 'Jane', age: 25 }, { name: 'Jim', age: 40 } ]; worksheet.addRows(data);
寫入數(shù)據(jù)到工作表中
我們可以使用以下代碼將數(shù)據(jù)寫入到工作表中:
worksheet.getColumn('A').values = [1, 2, 3, 4, 5];
這個(gè)代碼將會(huì)在’Sheet1’工作表中的A列寫入1到5這五個(gè)數(shù)字。
除此之外,我們還可以使用以下代碼將一個(gè)對(duì)象數(shù)組寫入到工作表中:
const data = [ { name: 'John', age: 30 }, { name: 'Jane', age: 25 }, { name: 'Jim', age: 40 } ]; worksheet.addRows(data);
這個(gè)代碼將會(huì)在’Sheet1’工作表中添加三行數(shù)據(jù),每一行包括’name’和’age’兩個(gè)字段
處理行和列
獲取行和列
我們可以使用以下代碼獲取工作表中的行和列:
const row = worksheet.getRow(1); const column = worksheet.getColumn('A');
這個(gè)代碼將會(huì)獲取’Sheet1’工作表中的第一行和第一列。
我們也可以使用以下代碼獲取指定區(qū)域內(nèi)的行和列:
const rows = worksheet.getRows(1, 5); const columns = worksheet.getColumns('A', 'C');
這個(gè)代碼將會(huì)獲取’Sheet1’工作表中第1到5行和A到C列。
添加行和列
我們可以使用以下代碼添加新的行和列:
const row = worksheet.addRow([1, 2, 3, 4, 5]); const column = worksheet.addColumn(['A', 'B', 'C', 'D', 'E']);
這個(gè)代碼將會(huì)在’Sheet1’工作表中添加一行和一列,并分別設(shè)置它們的值為1到5和A到E。
刪除行和列
我們可以使用以下代碼刪除指定的行和列:
worksheet.spliceRows(1, 5); worksheet.spliceColumns('A', 2);
這個(gè)代碼將會(huì)刪除’Sheet1’工作表中第1到5行和A到B列。
設(shè)置行高和列寬
我們可以使用以下代碼設(shè)置指定行的高度和指定列的寬度:
worksheet.getRow(1).height = 30; worksheet.getColumn('A').width = 20;
這個(gè)代碼將會(huì)設(shè)置’Sheet1’工作表中第一行的高度為30像素,第一列的寬度為20字符。
隱藏行和列
我們可以使用以下代碼隱藏工作表中的行和列:
worksheet.getRow(1).hidden = true; worksheet.getColumn('A').hidden = true;
這個(gè)代碼將會(huì)隱藏’Sheet1’工作表中第一行和第一列。
凍結(jié)窗格
我們可以使用以下代碼凍結(jié)工作表中的窗格:
worksheet.views = [ {state: 'frozen', xSplit: 1, ySplit: 1} ];
這個(gè)代碼將會(huì)凍結(jié)’Sheet1’工作表中第一行和第一列。
需要注意的是,xSplit和ySplit選項(xiàng)指定了凍結(jié)窗格的位置,它們的值從1開(kāi)始。
導(dǎo)入和導(dǎo)出數(shù)據(jù)
Excel.js庫(kù)提供了一系列方法來(lái)導(dǎo)入和導(dǎo)出Excel文件中的數(shù)據(jù),例如從文件讀取Excel數(shù)據(jù)、將數(shù)據(jù)寫入到Excel文件中以及將Excel文件轉(zhuǎn)換為其他格式等。
從文件讀取Excel數(shù)據(jù)
const workbook = new ExcelJS.Workbook(); workbook.xlsx.readFile('path/to/file.xlsx') .then(function() { const worksheet = workbook.getWorksheet('Sheet1'); worksheet.eachRow({ includeEmpty: false }, function(row, rowNumber) { console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values)); }); });
這個(gè)代碼將會(huì)從’path/to/file.xlsx’文件中讀取數(shù)據(jù),并打印出’Sheet1’工作表中每一行的值。
將數(shù)據(jù)寫入到Excel文件中
const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('Sheet1'); worksheet.addRow([1, 2, 3, 4, 5]); worksheet.addRow(['A', 'B', 'C', 'D', 'E']); workbook.xlsx.writeFile('path/to/file.xlsx') .then(function() { console.log('File is written successfully!'); });
這個(gè)代碼將會(huì)創(chuàng)建一個(gè)新的工作簿和工作表,然后向’Sheet1’工作表中添加兩行數(shù)據(jù),最后它將會(huì)將這個(gè)工作簿寫入到’path/to/file.xlsx’文件中。
將Excel文件轉(zhuǎn)換為其他格式
const workbook = new ExcelJS.Workbook(); workbook.xlsx.readFile('path/to/file.xlsx') .then(function() { workbook.csv.writeFile('path/to/file.csv') .then(function() { console.log('CSV file is written successfully!'); }); });
這個(gè)代碼將會(huì)從’path/to/file.xlsx’文件中讀取數(shù)據(jù),并將其轉(zhuǎn)換為CSV格式,然后它將會(huì)將這個(gè)CSV文件寫入到’path/to/file.csv’文件中。除此之外,Excel.js庫(kù)還支持將Excel文件轉(zhuǎn)換為JSON、HTML、PDF等各種格式。
ExcelJS實(shí)戰(zhàn)
我們之前曾經(jīng)爬過(guò)掘金小冊(cè)的所有數(shù)據(jù)并且存到了本地的JSON文件里
沒(méi)有學(xué)過(guò)的同學(xué)可以看一下這一篇Nodejs中使用puppeteer控制瀏覽器中視頻播放功能
這里我們直接來(lái)看生成的JSON文件:
我們這里就來(lái)把這些數(shù)據(jù)全部寫入 Excel 表并導(dǎo)出文件
相信大家有了前面對(duì)ExcelJS的了解,這里的代碼就非常簡(jiǎn)單了
首先我們新建一個(gè) excel 工作簿,然后創(chuàng)建一個(gè)新的工作表,我們給這個(gè)工作表添加自定義表頭,接下來(lái)就是把數(shù)據(jù)寫入excel表并且設(shè)置一些單元格的樣式,最后我們將工作簿保存然后導(dǎo)出Excel文件
具體實(shí)現(xiàn)請(qǐng)看下面的代碼:
const ExcelJS = require('exceljs'); const bookData = require('../juejin/xiaoce.json') // 新建一個(gè) excel 工作簿 const workbook = new ExcelJS.Workbook(); // 創(chuàng)建一個(gè)新的工作表 const worksheet = workbook.addWorksheet('Sheet1'); // 添加表頭 worksheet.columns = [ { header: '小冊(cè)名稱', key: 'title', width: 45 }, // 設(shè)置列寬 { header: '小冊(cè)簡(jiǎn)介', key: 'desc', width: 120 }, // 設(shè)置列寬 { header: '小冊(cè)作者', key: 'author', width: 16 }, // 設(shè)置列寬 { header: '小冊(cè)價(jià)格', key: 'price', width: 18 }, // 設(shè)置列寬 ]; // 添加數(shù)據(jù) worksheet.addRows(bookData); // 第一行字體加粗加大 worksheet.getRow(1).font = { bold: true, size: 14 }; // 第一行單元格居中 worksheet.getRow(1).alignment = { vertical: 'middle', horizontal: 'center' }; // 第一列單元格居中 worksheet.getColumn(1).alignment = { vertical: 'middle', horizontal: 'center' }; // 第三列單元格居中 worksheet.getColumn(3).alignment = { vertical: 'middle', horizontal: 'center' }; // 第四列單元格居中 worksheet.getColumn(4).alignment = { vertical: 'middle', horizontal: 'center' }; // 將工作簿保存到文件 workbook.xlsx.writeFile('juejinBook.xlsx') .then(() => { console.log('Excel文件已保存'); }) .catch((error) => { console.log('保存Excel文件時(shí)出錯(cuò):', error); });
運(yùn)行程序,不出意外的話控制臺(tái)會(huì)出現(xiàn)“Excel文件已保存”,我們發(fā)現(xiàn)目錄下確實(shí)多了一個(gè)excel文件:
然后我們來(lái)打開(kāi)生成的Excel文件,看看里面是不是我們要的json文件里爬取到的數(shù)據(jù):
沒(méi)有問(wèn)題!所有的小冊(cè)數(shù)據(jù)全部寫入了excel文件,并且單元格的樣式也是我們想要的。
總結(jié)
Excel.js是一個(gè)強(qiáng)大的JavaScript庫(kù),它提供了一系列方法來(lái)處理Excel文件,例如創(chuàng)建和編輯工作簿、讀取和寫入數(shù)據(jù)、處理行和列、設(shè)置樣式、導(dǎo)入和導(dǎo)出數(shù)據(jù)等。
使用Excel.js,我們可以輕松地創(chuàng)建和編輯Excel文件,以及從Excel文件中讀取和寫入數(shù)據(jù)。
在使用Excel.js時(shí),我們需要注意以下幾點(diǎn):
- Excel.js庫(kù)需要安裝并引入到我們的項(xiàng)目中。
- 我們需要?jiǎng)?chuàng)建一個(gè)新的工作簿和工作表來(lái)存儲(chǔ)數(shù)據(jù)。
- 我們可以使用一系列方法來(lái)讀取和寫入工作表中的數(shù)據(jù),例如eachRow()、getCell()、addRow()、addColumn()等。
- 我們可以使用一系列方法來(lái)處理工作表中的行和列,例如getRow()、getColumn()、addRow()、addColumn()、spliceRows()、spliceColumns()等。
- 我們可以使用一系列方法來(lái)設(shè)置工作表中的行和列的樣式,例如設(shè)置行高和列寬、設(shè)置單元格邊框和背景色等。
- 我們可以使用一系列方法來(lái)導(dǎo)入和導(dǎo)出Excel文件中的數(shù)據(jù),例如從文件讀取Excel數(shù)據(jù)、將數(shù)據(jù)寫入到Excel文件中以及將Excel文件轉(zhuǎn)換為其他格式等。
最后我們還帶大家寫了一個(gè)Excel.js的實(shí)戰(zhàn)項(xiàng)目來(lái)生成了爬取到的掘金小冊(cè)Excel文件
如果想深入了解ExcelJS,請(qǐng)查看官方文檔:https://github.com/exceljs/exceljs/blob/master/README_zh.md
相關(guān)文章
node.js中的console.trace方法使用說(shuō)明
這篇文章主要介紹了node.js中的console.trace方法使用說(shuō)明,本文介紹了console.trace的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12Grunt針對(duì)靜態(tài)文件的壓縮,版本控制打包的實(shí)例講解
下面小編就為大家?guī)?lái)一篇Grunt針對(duì)靜態(tài)文件的壓縮,版本控制打包的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09node.js中的fs.fsyncSync方法使用說(shuō)明
這篇文章主要介紹了node.js中的fs.fsyncSync方法使用說(shuō)明,本文介紹了fs.fsyncSync的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12Nodejs中使用phantom將html轉(zhuǎn)為pdf或圖片格式的方法
這篇文章主要介紹了Nodejs中使用phantom將html轉(zhuǎn)為pdf或圖片格式的方法,需要的朋友可以參考下2017-09-09nodejs和C語(yǔ)言插入mysql數(shù)據(jù)庫(kù)亂碼問(wèn)題的解決方法
這篇文章主要介紹了nodejs和C語(yǔ)言插入mysql數(shù)據(jù)庫(kù)亂碼問(wèn)題,需要的朋友可以參考下2017-04-04關(guān)于npm install過(guò)程失敗的幾種處理方式
這篇文章主要介紹了關(guān)于npm install過(guò)程失敗的幾種處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06