在现代软件开发中,数据的处理和展示是至关重要的环节。其中,将数据库中的数据提取出来并转换为直观的 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 文件的功能,为数据的进一步分析和处理提供了便利。这种方法在很多实际的业务场景中都有着广泛的应用,比如数据备份、报表生成等。
到此这篇关于利用node实现数据库数据导出到excel的文章就介绍到这了,更多相关node数据库数据导出到excel内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论