Nodejs使用exceljs實(shí)現(xiàn)excel導(dǎo)入導(dǎo)出
Excel 數(shù)據(jù)處理簡介
Excel 是廣泛應(yīng)用于辦公場(chǎng)景的數(shù)據(jù)處理軟件。
在日常開發(fā)中,我們常需在后臺(tái)管理系統(tǒng)中實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入與導(dǎo)出功能,以便與 Excel 文件進(jìn)行交互。
使用 exceljs 庫進(jìn)行 excel 數(shù)據(jù)處理
exceljs 簡介
在 Node.js 環(huán)境和瀏覽器中,我們常用 exceljs 這個(gè)包來解析和生成 Excel 文件。該包在 npm 官網(wǎng)上每周有超過 30 萬的下載量,足見其受歡迎程度。
環(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(單元格)。通過遍歷這些層級(jí),我們可以獲取所有數(shù)據(jù):
// 引入 exceljs 庫
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 還提供了簡便的方法,可以直接調(diào)用 worksheet 的 getSheetValues 來拿到表格數(shù)據(jù),不用自己遍歷:

這就是解析 excel 文件。
導(dǎo)入數(shù)據(jù)的時(shí)候,按照格式從中解析數(shù)據(jù)然后存入數(shù)據(jù)庫就行。
一般我們都會(huì)提供一個(gè) excel 模版,用這個(gè)模版來填數(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è)置,如字體、背景色、邊框等。

比如通過 cell.style 可以設(shè)置 font、fill、border、alignment 這些。
在瀏覽器中使用 ExcelJS 庫解析 Excel 文件
創(chuàng)建 index.html,引入 exceljs 包:
<!DOCTYPE html>
<html lang="en">
<head>
<!-- 加載ExcelJS庫 -->
<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 庫生成 Excel 文件并下載
然后再試試生成 excel:
這里我創(chuàng)建了一個(gè) 10M 的 ArrayBuffer 來寫入數(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);
// 將工作簿寫入 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';
// 插入鏈接到頁面并觸發(fā)點(diǎn)擊下載
document.body.appendChild(link);
link.click();
// 下載完成后移除鏈接
link.addEventListener('click', () => {
link.remove();
});
}
main();
// 在頁面加載完畢后執(zhí)行
window.onload = generateExcel;
</script>
</body>
</html>
和前面的邏輯一樣,只是把 writeFile 換成了 writeBuffer。
在瀏覽器中打開 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)文章
Node.js+ELK日志規(guī)范的實(shí)現(xiàn)
這篇文章主要介紹了Node.js+ELK日志規(guī)范的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
node使用require?mkdirp創(chuàng)建文件夾示例
這篇文章主要為大家介紹了node使用require?mkdirp創(chuàng)建文件夾示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
初學(xué)node.js中實(shí)現(xiàn)刪除用戶路由
這篇文章主要介紹了node.js中如何實(shí)現(xiàn)刪除用戶路由,下面和小編來一起學(xué)習(xí)一下吧2019-05-05
node.js 使用ejs模板引擎時(shí)后綴換成.html
本文給大家分享一個(gè)nodejs的小技巧,將ejs模板引擎的模板后綴改成.html的使用方法,非常的簡單實(shí)用,這里推薦給大家。2015-04-04
Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建
這篇文章主要為大家介紹了Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
利用adb shell和node.js實(shí)現(xiàn)抖音搶紅包功能(推薦)
這篇文章主要介紹了利用adb shell和node.js實(shí)現(xiàn)抖音搶紅包功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02
用node開發(fā)并發(fā)布一個(gè)cli工具的方法步驟
這篇文章主要介紹了用node開發(fā)并發(fā)布一個(gè)cli工具的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01

