利用node實(shí)現(xiàn)數(shù)據(jù)庫數(shù)據(jù)導(dǎo)出到Excel
在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)的處理和展示是至關(guān)重要的環(huán)節(jié)。其中,將數(shù)據(jù)庫中的數(shù)據(jù)提取出來并轉(zhuǎn)換為直觀的 Excel 文件是一項(xiàng)常見且實(shí)用的需求。本文將詳細(xì)講解如何使用 Node.js 實(shí)現(xiàn)從 MySQL 數(shù)據(jù)庫獲取數(shù)據(jù),并生成包含多個工作表的 Excel 文件,每個工作表對應(yīng)數(shù)據(jù)庫中的一個表。
一、技術(shù)選型與準(zhǔn)備
Node.js 作為一個強(qiáng)大的后端開發(fā)平臺,為我們提供了豐富的模塊和庫來完成這個功能。我們主要使用了以下幾個關(guān)鍵的庫:
- mysql 庫:這是用于與 MySQL 數(shù)據(jù)庫進(jìn)行交互的核心庫。它允許我們建立連接、執(zhí)行 SQL 查詢等操作,是整個數(shù)據(jù)獲取過程的基礎(chǔ)。
- ExcelJS 庫:專門用于在 Node.js 環(huán)境中創(chuàng)建和操作 Excel 文件。它提供了豐富的 API,可以方便地設(shè)置工作表、添加行列數(shù)據(jù)等。
二、數(shù)據(jù)庫連接配置
首先,我們需要配置數(shù)據(jù)庫連接信息。以下是相關(guān)的代碼片段:
const dbConfig = { host: "localhost", user: "root",//用戶名 password: "root",//密碼 database: "test",//數(shù)據(jù)庫名 }; const sqlData = {};//用于保存數(shù)據(jù)表數(shù)據(jù) const connection = mysql.createConnection(dbConfig);
這里定義了一個dbConfig
對象,其中包含了連接 MySQL 數(shù)據(jù)庫所需的關(guān)鍵信息,包括主機(jī)地址、用戶名、密碼和數(shù)據(jù)庫名稱。sqlData
對象則用于存儲從數(shù)據(jù)庫中查詢出來的數(shù)據(jù),初始化為空。connection
對象是通過mysql.createConnection
方法創(chuàng)建的數(shù)據(jù)庫連接實(shí)例,它是后續(xù)所有數(shù)據(jù)庫操作的入口。
三、連接數(shù)據(jù)庫
連接數(shù)據(jù)庫是整個流程的第一步,代碼中通過一個函數(shù)connectDatabase
來實(shí)現(xiàn):
function connectDatabase() { return new Promise((resolve) => { connection.connect((error) => { if (error) throw error; console.log("成功連接數(shù)據(jù)庫!"); resolve("成功連接數(shù)據(jù)庫!"); }); }); }
這個函數(shù)返回一個 Promise,在connection.connect
方法中,我們處理連接可能出現(xiàn)的錯誤。如果連接成功,會在控制臺輸出相應(yīng)的提示信息,并通過resolve
將成功信息傳遞出去。這種基于 Promise 的設(shè)計使得我們可以方便地在異步流程中處理數(shù)據(jù)庫連接的結(jié)果。
四、導(dǎo)出表數(shù)據(jù)
接下來是核心的導(dǎo)出表數(shù)據(jù)功能,由exportTableData
函數(shù)實(shí)現(xiàn):
function exportTableData(tableName) { return new Promise((resolve) => { connection.query(`SELECT * FROM ${tableName}`, (error, results) => { if (error) throw error; sqlData[tableName] = results; console.log(`表${tableName} 數(shù)據(jù)已成功導(dǎo)出.`); resolve(`表${tableName} 數(shù)據(jù)已成功導(dǎo)出.`); }); }); }
這個函數(shù)接受一個表名作為參數(shù),使用connection.query
方法執(zhí)行一個SELECT *
的 SQL 查詢語句,獲取指定表的所有數(shù)據(jù)。如果查詢過程中沒有錯誤,將查詢結(jié)果存儲在sqlData
對象中,以表名為鍵。同時,在控制臺輸出表數(shù)據(jù)導(dǎo)出成功的信息,并通過resolve
將成功信息返回,同樣是基于 Promise 的異步處理。
五、獲取所有表名與數(shù)據(jù)
為了獲取數(shù)據(jù)庫中的所有表數(shù)據(jù),我們需要先獲取所有表名,這通過mysqlQuery
函數(shù)實(shí)現(xiàn):
function mysqlQuery() { return new Promise((resolve) => { connection.query("SHOW TABLES", (error, results) => { if (error) throw error; resolve(results); }); }); }
這個函數(shù)執(zhí)行SHOW TABLES
的 SQL 查詢,并返回一個包含所有表名結(jié)果的 Promise。
有了表名之后,我們可以通過getAllTableData
函數(shù)來獲取所有表的數(shù)據(jù):
async function getAllTableData() { const reqList = []; const results = await mysqlQuery(); results.forEach((result) => { const tableName = result[`Tables_in_${dbConfig.database}`]; reqList.push(exportTableData(tableName)); }); await Promise.all(reqList); console.log("已全部導(dǎo)出!"); }
在這個異步函數(shù)中,首先調(diào)用mysqlQuery
獲取所有表名,然后遍歷每個表名,調(diào)用exportTableData
函數(shù)來獲取每個表的數(shù)據(jù),并將這些操作的 Promise 添加到reqList
數(shù)組中。最后,使用Promise.all
來等待所有的表數(shù)據(jù)導(dǎo)出操作完成,確保所有數(shù)據(jù)都被正確獲取后,在控制臺輸出已全部導(dǎo)出的信息。
數(shù)據(jù)庫中有這么兩張測試用的表
數(shù)據(jù)分別是
六、生成 Excel 文件
獲取到所有表的數(shù)據(jù)后,我們使用generateExcelFromJson
函數(shù)將數(shù)據(jù)生成 Excel 文件:
async function generateExcelFromJson(jsonData) { const workbook = new ExcelJS.Workbook(); for (const sheetName in jsonData) { const worksheet = workbook.addWorksheet(sheetName); worksheet.columns = Object.keys(jsonData[sheetName][0]).map((key) => ({ header: key, key: key, })); jsonData[sheetName].forEach((rowData) => { worksheet.addRow(rowData); }); } await workbook.xlsx.writeFile(`${dbConfig.database}.xlsx`); console.log(`${dbConfig.database}.xlsx已成功導(dǎo)出`); }
在這個函數(shù)中,首先創(chuàng)建一個ExcelJS
的Workbook
實(shí)例。然后遍歷jsonData
對象(其中存儲了所有表的數(shù)據(jù)),為每個表名創(chuàng)建一個工作表。對于每個工作表,通過分析數(shù)據(jù)的鍵來設(shè)置列標(biāo)題,并將每一行數(shù)據(jù)添加到工作表中。最后,使用workbook.xlsx.writeFile
方法將生成的 Excel 文件保存為以數(shù)據(jù)庫名命名的文件,并在控制臺輸出成功導(dǎo)出的信息。
導(dǎo)出excel數(shù)據(jù)如下:
七、主流程執(zhí)行
最后,通過run
函數(shù)來組織整個流程:
async function run() { await connectDatabase(); await getAllTableData(); await generateExcelFromJson(sqlData); process.exit(0); } run();
在run
函數(shù)中,按照順序依次執(zhí)行連接數(shù)據(jù)庫、獲取所有表數(shù)據(jù)和生成 Excel 文件的操作。當(dāng)所有操作完成后,使用process.exit(0)
正常退出程序。
通過以上步驟,我們成功地實(shí)現(xiàn)了從 MySQL 數(shù)據(jù)庫中獲取數(shù)據(jù)并生成 Excel 文件的功能,為數(shù)據(jù)的進(jìn)一步分析和處理提供了便利。這種方法在很多實(shí)際的業(yè)務(wù)場景中都有著廣泛的應(yīng)用,比如數(shù)據(jù)備份、報表生成等。
到此這篇關(guān)于利用node實(shí)現(xiàn)數(shù)據(jù)庫數(shù)據(jù)導(dǎo)出到Excel的文章就介紹到這了,更多相關(guān)node數(shù)據(jù)庫數(shù)據(jù)導(dǎo)出到Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于node.js版本npm -v報錯問題的解決方法
最近工作中遇到了些問題,這里總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于node.js版本npm -v報錯問題的解決方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04node.js讀取Excel數(shù)據(jù)(下載圖片)的方法示例
這篇文章主要給大家介紹了關(guān)于node.js讀取Excel數(shù)據(jù)(下載圖片)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用node.js具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Node.js中path.resolve與path.join的區(qū)別與作用詳解
path.resolve和path.join都是屬于path核心模塊下的方法,用來拼接路徑,下面這篇文章主要給大家介紹了關(guān)于Node.js中path.resolve與path.join的區(qū)別與作用的相關(guān)資料,需要的朋友可以參考下2023-03-03node如何實(shí)現(xiàn)cmd彈窗交互之inquirer
這篇文章主要介紹了node如何實(shí)現(xiàn)cmd彈窗交互之inquirer問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10用nodejs實(shí)現(xiàn)json和jsonp服務(wù)的方法
本篇文章主要介紹了用nodejs實(shí)現(xiàn)json和jsonp服務(wù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08k8s node節(jié)點(diǎn)重新加入master集群的實(shí)現(xiàn)
這篇文章主要介紹了k8s node節(jié)點(diǎn)重新加入master集群的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02