说在前面
🧐在现代软件开发中,数据的处理和展示是至关重要的环节。其中,将数据库中的数据提取出来并转换为直观的 Excel 文件是一项常见且实用的需求。本文将详细讲解如何使用 Node.js 实现从 MySQL 数据库获取数据,并生成包含多个工作表的 Excel 文件,每个工作表对应数据库中的一个表👨💻。
一、技术选型与准备
Node.js 作为一个强大的后端开发平台,为我们提供了丰富的模块和库来完成这个功能。我们主要使用了以下几个关键的库:
- mysql 库:这是用于与 MySQL 数据库进行交互的核心库。它允许我们建立连接、执行 SQL 查询等操作,是整个数据获取过程的基础。
- ExcelJS 库:专门用于在 Node.js 环境中创建和操作 Excel 文件。它提供了丰富的 API,可以方便地设置工作表、添加行列数据等。
二、数据库连接配置
首先,我们需要配置数据库连接信息。以下是相关的代码片段:
const dbConfig = {
host: "localhost",
user: "root",//用户名
password: "root",//密码
database: "test",//数据库名
};
const sqlData = {};//用于保存数据表数据
const connection = mysql.createConnection(dbConfig);
这里定义了一个dbConfig
对象,其中包含了连接 MySQL 数据库所需的关键信息,包括主机地址、用户名、密码和数据库名称。sqlData
对象则用于存储从数据库中查询出来的数据,初始化为空。connection
对象是通过mysql.createConnection
方法创建的数据库连接实例,它是后续所有数据库操作的入口。
三、连接数据库
连接数据库是整个流程的第一步,代码中通过一个函数connectDatabase
来实现:
function connectDatabase() {
return new Promise((resolve) => {
connection.connect((error) => {
if (error) throw error;
console.log("成功连接数据库!");
resolve("成功连接数据库!");
});
});
}
这个函数返回一个 Promise,在connection.connect
方法中,我们处理连接可能出现的错误。如果连接成功,会在控制台输出相应的提示信息,并通过resolve
将成功信息传递出去。这种基于 Promise 的设计使得我们可以方便地在异步流程中处理数据库连接的结果。
四、导出表数据
接下来是核心的导出表数据功能,由exportTableData
函数实现:
function exportTableData(tableName) {
return new Promise((resolve) => {
connection.query(`SELECT * FROM ${tableName}`, (error, results) => {
if (error) throw error;
sqlData[tableName] = results;
console.log(`表${tableName} 数据已成功导出.`);
resolve(`表${tableName} 数据已成功导出.`);
});
});
}
这个函数接受一个表名作为参数,使用connection.query
方法执行一个SELECT *
的 SQL 查询语句,获取指定表的所有数据。如果查询过程中没有错误,将查询结果存储在sqlData
对象中,以表名为键。同时,在控制台输出表数据导出成功的信息,并通过resolve
将成功信息返回,同样是基于 Promise 的异步处理。
五、获取所有表名与数据
为了获取数据库中的所有表数据,我们需要先获取所有表名,这通过mysqlQuery
函数实现:
function mysqlQuery() {
return new Promise((resolve) => {
connection.query("SHOW TABLES", (error, results) => {
if (error) throw error;
resolve(results);
});
});
}
这个函数执行SHOW TABLES
的 SQL 查询,并返回一个包含所有表名结果的 Promise。
有了表名之后,我们可以通过getAllTableData
函数来获取所有表的数据:
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("已全部导出!");
}
在这个异步函数中,首先调用mysqlQuery
获取所有表名,然后遍历每个表名,调用exportTableData
函数来获取每个表的数据,并将这些操作的 Promise 添加到reqList
数组中。最后,使用Promise.all
来等待所有的表数据导出操作完成,确保所有数据都被正确获取后,在控制台输出已全部导出的信息。
- 数据库中有这么两张测试用的表
- 数据分别是
六、生成 Excel 文件
获取到所有表的数据后,我们使用generateExcelFromJson
函数将数据生成 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已成功导出`);
}
在这个函数中,首先创建一个ExcelJS
的Workbook
实例。然后遍历jsonData
对象(其中存储了所有表的数据),为每个表名创建一个工作表。对于每个工作表,通过分析数据的键来设置列标题,并将每一行数据添加到工作表中。最后,使用workbook.xlsx.writeFile
方法将生成的 Excel 文件保存为以数据库名命名的文件,并在控制台输出成功导出的信息。
- 导出excel数据如下:
七、主流程执行
最后,通过run
函数来组织整个流程:
async function run() {
await connectDatabase();
await getAllTableData();
await generateExcelFromJson(sqlData);
process.exit(0);
}
run();
在run
函数中,按照顺序依次执行连接数据库、获取所有表数据和生成 Excel 文件的操作。当所有操作完成后,使用process.exit(0)
正常退出程序。
通过以上步骤,我们成功地实现了从 MySQL 数据库中获取数据并生成 Excel 文件的功能,为数据的进一步分析和处理提供了便利。这种方法在很多实际的业务场景中都有着广泛的应用,比如数据备份、报表生成等。
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。