Nodejs使用exceljs實(shí)現(xiàn)excel導(dǎo)入導(dǎo)出
Excel 數(shù)據(jù)處理簡(jiǎn)介
Excel 是廣泛應(yīng)用于辦公場(chǎng)景的數(shù)據(jù)處理軟件。
在日常開(kāi)發(fā)中,我們常需在后臺(tái)管理系統(tǒng)中實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入與導(dǎo)出功能,以便與 Excel 文件進(jìn)行交互。
使用 exceljs 庫(kù)進(jìn)行 excel 數(shù)據(jù)處理
exceljs 簡(jiǎn)介
在 Node.js 環(huán)境和瀏覽器中,我們常用 exceljs 這個(gè)包來(lái)解析和生成 Excel 文件。該包在 npm 官網(wǎng)上每周有超過(guò) 30 萬(wàn)的下載量,足見(jiàn)其受歡迎程度。
環(huán)境搭建
mkdir exceljs-test cd exceljs-test npm init -y
安裝 exceljs:
npm install exceljs
新建 data.xlsx:
從 Excel 文件讀取數(shù)據(jù)
工作表結(jié)構(gòu)遵循層級(jí)關(guān)系:workbook(工作簿)> worksheet(工作表)> row(行)> cell(單元格)。通過(guò)遍歷這些層級(jí),我們可以獲取所有數(shù)據(jù):
// 引入 exceljs 庫(kù) const { Workbook } = require('exceljs'); // 異步函數(shù)讀取 Excel 文件 async function main() { // 創(chuàng)建一個(gè)Workbook實(shí)例,用于處理Excel文件 const workbook = new Workbook(); // 從指定路徑讀取Excel文件 const dataBook = await workbook.xlsx.readFile('./data.xlsx'); // 遍歷Excel中的每個(gè)工作表 dataBook.eachSheet((sheet, index1) => { console.log('工作表 ' + index1); // 遍歷每個(gè)工作表中的每行數(shù)據(jù) sheet.eachRow((row, index2) => { const rowData = []; // 用于存儲(chǔ)當(dāng)前行的數(shù)據(jù) row.eachCell((cell, index3) => { // 遍歷當(dāng)前行的每個(gè)單元格,并將值存儲(chǔ)到rowData數(shù)組中 rowData.push(cell.value); }); console.log('行 ' + index2, rowData); }); }); } main();
node 運(yùn)行:
我們已經(jīng)解析出 excel 數(shù)據(jù)了。
exceljs 還提供了簡(jiǎn)便的方法,可以直接調(diào)用 worksheet 的 getSheetValues 來(lái)拿到表格數(shù)據(jù),不用自己遍歷:
這就是解析 excel 文件。
導(dǎo)入數(shù)據(jù)的時(shí)候,按照格式從中解析數(shù)據(jù)然后存入數(shù)據(jù)庫(kù)就行。
一般我們都會(huì)提供一個(gè) excel 模版,用這個(gè)模版來(lái)填數(shù)據(jù),然后再導(dǎo)入。
數(shù)據(jù)導(dǎo)出
使用 exceljs 進(jìn)行數(shù)據(jù)導(dǎo)出:
const { Workbook } = require('exceljs'); async function main() { // 創(chuàng)建一個(gè)新的工作簿 const workbook = new Workbook(); // 添加一個(gè)新的工作表,命名為'hong' const worksheet = workbook.addWorksheet('hong'); // 定義工作表的列結(jié)構(gòu) worksheet.columns = [ { header: 'ID', key: 'id', width: 20 }, { header: '姓名', key: 'name', width: 40 }, { header: '年齡', key: 'age', width: 20 }, ]; // 數(shù)據(jù)數(shù)組,用于填充工作表 const data = [ { id: 1, name: '探春', age: 18 }, { id: 2, name: '迎春', age: 19 }, { id: 3, name: '惜春' }, ]; // 向工作表中添加數(shù)據(jù)行 worksheet.addRows(data); // 將工作簿保存為Excel文件 workbook.xlsx.writeFile('./data2.xlsx'); } main();
運(yùn)行后產(chǎn)生的 data2.xlsx 如下:
我們可以遍歷行和列,對(duì)特定單元格進(jìn)行樣式設(shè)置,如字體、背景色、邊框等。
比如通過(guò) cell.style 可以設(shè)置 font、fill、border、alignment 這些。
在瀏覽器中使用 ExcelJS 庫(kù)解析 Excel 文件
創(chuàng)建 index.html,引入 exceljs 包:
<!DOCTYPE html> <html lang="en"> <head> <!-- 加載ExcelJS庫(kù) --> <script src="https://unpkg.com/exceljs@4.4.0/dist/exceljs.min.js"></script> </head> <body> <!-- 文件選擇輸入框 --> <input id="fileInput" type="file" /> <script> const fileInput = document.getElementById('fileInput'); // 文件選擇變化時(shí)的處理邏輯 fileInput.onchange = async () => { // 獲取選中的文件 const file = fileInput.files[0]; const { Workbook } = ExcelJS; const workbook = new Workbook(); const loadedWorkbook = await workbook.xlsx.load(file); loadedWorkbook.eachSheet((sheet, index1) => { console.log('工作表' + index1); const value = sheet.getSheetValues(); console.log(value); }); }; </script> </body> </html>
啟動(dòng)靜態(tài)服務(wù)器:
npx http-server .
同樣解析出了 excel 的內(nèi)容。
在瀏覽器中使用 ExcelJS 庫(kù)生成 Excel 文件并下載
然后再試試生成 excel:
這里我創(chuàng)建了一個(gè) 10M 的 ArrayBuffer 來(lái)寫(xiě)入數(shù)據(jù),之后再讀取。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <script src="https://unpkg.com/exceljs@4.4.0/dist/exceljs.min.js"></script> </head> <body> <script> const { Workbook } = ExcelJS; async function main() { // 創(chuàng)建一個(gè)新的工作簿 const workbook = new Workbook(); // 添加一個(gè)新的工作表,命名為'hong' const worksheet = workbook.addWorksheet('hong'); // 定義工作表的列結(jié)構(gòu) worksheet.columns = [ { header: 'ID', key: 'id', width: 20 }, { header: '姓名', key: 'name', width: 40 }, { header: '年齡', key: 'age', width: 20 }, ]; // 數(shù)據(jù)數(shù)組,用于填充工作表 const data = [ { id: 1, name: '寶玉', age: 18 }, { id: 2, name: '寶釵', age: 19 }, { id: 3, name: '黛玉' }, ]; worksheet.addRows(data); // 將工作簿寫(xiě)入 ArrayBuffer 并下載 const buffer = new ArrayBuffer(10 * 1024 * 1024); // 分配足夠大的內(nèi)存空間 const res = await workbook.xlsx.writeBuffer(buffer); download(res.buffer); } function download(arrayBuffer) { const link = document.createElement('a'); // 創(chuàng)建 Blob 對(duì)象并生成 URL const blob = new Blob([arrayBuffer]); const url = URL.createObjectURL(blob); link.href = url; // 設(shè)置下載的文件名 link.download = 'honglou.xlsx'; // 插入鏈接到頁(yè)面并觸發(fā)點(diǎn)擊下載 document.body.appendChild(link); link.click(); // 下載完成后移除鏈接 link.addEventListener('click', () => { link.remove(); }); } main(); // 在頁(yè)面加載完畢后執(zhí)行 window.onload = generateExcel; </script> </body> </html>
和前面的邏輯一樣,只是把 writeFile 換成了 writeBuffer。
在瀏覽器中打開(kāi) index.html,Excel 文件將自動(dòng)生成并下載:
到此這篇關(guān)于Nodejs使用exceljs實(shí)現(xiàn)excel導(dǎo)入導(dǎo)出的文章就介紹到這了,更多相關(guān)Nodejs excel導(dǎo)入導(dǎo)出內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nodejs連接mysql并實(shí)現(xiàn)增、刪、改、查操作的方法詳解
這篇文章主要介紹了Nodejs連接mysql并實(shí)現(xiàn)增、刪、改、查操作的方法,結(jié)合實(shí)例形式詳細(xì)分析了nodejs針對(duì)mysql數(shù)據(jù)庫(kù)的的連接、mysql數(shù)據(jù)庫(kù)的創(chuàng)建及nodejs針對(duì)mysql增刪改查等相關(guān)操作具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-01-01nodejs實(shí)現(xiàn)百度輿情接口應(yīng)用示例
這篇文章主要介紹了nodejs實(shí)現(xiàn)百度輿情接口應(yīng)用,結(jié)合實(shí)例形式分析了node.js調(diào)用百度輿情接口的具體使用技巧,需要的朋友可以參考下2020-02-02使用nodeJS中的fs模塊對(duì)文件及目錄進(jìn)行讀寫(xiě),刪除,追加,等操作詳解
nodeJS中fs模塊對(duì)系統(tǒng)文件及目錄進(jìn)行讀寫(xiě)操作,本文將詳細(xì)介紹nodejs中的文件操作模塊fs的使用方法2020-02-02nodejs更新package.json中的dependencies依賴到最新版本的方法
今天小編就為大家分享一篇nodejs更新package.json中的dependencies依賴到最新版本的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10node封裝一個(gè)控制臺(tái)進(jìn)度條插件???????詳情
這篇文章主要介紹了node封裝一個(gè)控制臺(tái)進(jìn)度條插件???????詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08Ajax獲取node服務(wù)器數(shù)據(jù)的完整步驟
這篇文章主要給大家介紹了關(guān)于Ajax獲取node服務(wù)器數(shù)據(jù)的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09