文章目录
前言
在当今科技快速发展的时代,数据处理和应用已经成为各行各业不可或缺的一部分。而在许多工作场景中,我们经常需要将Excel表格中的数据导入数据库,并以某种方式进行进一步处理和呈现。而随着云计算的普及,TDSQL Serveless作为一种新兴的数据库服务形式,为我们提供了更加灵活、高效的数据管理解决方案。
本文将重点探讨如何利用TDSQL Serveless进行数据库表格的批量导入与读取,并结合具体实例,展示如何快速生成名片卡。名片卡作为一种常见的商务工具,承载了信息交流和社交背景的重要功能。通过将Excel中的个人信息与数据库相结合,我们可以在不费力的情况下生成个性化的名片卡,从而提高工作效率和用户体验。
工作准备
1. 购买并开通TDSQL-C MySQL Serverless
数据库配置
- 实例形态 选择
Serveless
- 数据库引擎 选择
MySQL
- 地域 根据自己的情况进行选择 本次案例选择的是
广州
- 主可用区 选择
广州四区
- 多可用区部署 选择
否
- 传输链路默认
高IO版
- 网络 选择 默认
- 数据库版本 选择
MySQL5.7
- 算力配置 根据自己的情况进行选择,
温馨提示:读写实例越大每小时消费的费用越高哦!!
- 自动暂停 根据自己的情况选择, 如果有其他业务可以取消勾选
注意:
算力配置中有一个只读组, 但是只读节点数量目前不支持自动弹性
计费模式
- 计算计费模式 选择 按量计费
- 存储计费模式 这里我们可以购买一个资源包用于存储哦!!
基础信息 以及 高级配置可以根据自己的需求进行简单配置
最终配置效果图
购买
安装我当前的配置点击立即购买, 会出现如下弹窗,我们可以看到预计的每小时扣费多少。
开启读写地址
当实例创建成功后我们点击开启外部的读写地址, 方便我们进行SQL
的数据读取
测试连接
接下来我使用的是Navicat Premium
进行的远程访问
在Navicat Premium
中新建数据库链接, 输入以下信息:
- 连接名,
- 主机
- 端口
- 用户名
- 密码
点击左下角的测试链接, 提示连接成功
后点击右下角的保存即可
到此我们的数据库的准备工作已经完成!!! 撒花
2. 向数据库中写入名片卡所需要的数据
如图所示将我们准备好的excel
数据写入到数据库中
配置数据库链接
db_config = {
'host': "xxxxx", # 主机名
'port': xxxx, # 端口
'user': "root", # 账户
'password': "xxx", # 密码
'database': 'myworkcard', # 数据库名称
}
代码解析
- host:主机名,指的是需要连接到的数据库服务器地址。
- port:端口号,指的是数据库服务器端口。
- user:账户,指的是登录数据库所使用的用户名。
- password:密码,指的是对应用户的登录密码。
- database:数据库名称,指的是需要连接的具体数据库。
创建读取EXCEL 函数
def read_excel(excel_file):
# 打开excel
excel = openpyxl.load_workbook(excel_file)
# 选择工作薄-选择第一个
sheet = excel.worksheets[0]
# 创建一个空列表
data_list = []
for row in sheet.iter_rows(min_row=1, values_only=True):
data_list.append((row[1],row[2]))
print(row[1], '----', row[2])
print(data_list)
#调用函数写入数据库
return write_db(data_list)
代码解析
-
打开Excel文件:
excel = openpyxl.load_workbook(excel_file)
使用openpyxl库的
load_workbook()
函数打开指定的Excel文件,将其赋值给变量excel
。 -
选择工作薄:
sheet = excel.worksheets[0]
通过
worksheets
属性选择第一个工作薄,将其赋值给变量sheet
。 -
创建空列表:
data_list = []
创建一个空列表
data_list
,用于存储从Excel中读取出的数据。 -
遍历Excel表格并读取数据:
for row in sheet.iter_rows(min_row=1, values_only=True): data_list.append((row[1], row[2])) print(row[1], '----', row[2])
使用
iter_rows()
函数遍历工作薄中的每一行数据。min_row=1
表示从第一行开始遍历。values_only=True
表示只获取单元格的值,而不是包含格式等其他信息。然后将读取到的第2列和第3列数据添加到data_list
列表中,并通过print()
函数打印出来。 -
输出数据列表:
print(data_list)
打印输出完整的数据列表
data_list
,显示从Excel文件中读取出来的所有数据。 -
调用写入数据库的函数:
return write_db(data_list)
将读取到的数据列表
data_list
作为参数传递给名为write_db
的函数,并返回函数调用的结果。
创建表并写入excel 数据
def write_db(data_list):
# 创建一个数据库连接
conn = pymysql.connect(**db_config)
# 创建一个游标
cursor = conn.cursor()
# 执行创建表的操作, 如果表已经存在, 则不执行
cursor.execute("create table if not exists cardlist(name varchar(20), work varchar(20))")
#cursor.execute("create table cardlist(name varchar(20), work varchar(20))")
# 提交事务
conn.commit()
# 关闭游标和数据库连接
cursor.close()
conn.close()
# 调用函数写入数据库
return write_db_data(data_list)
def write_db_data(data_list):
# 创建一个数据库连接
conn = pymysql.connect(**db_config)
# 创建一个游标
cursor = conn.cursor()
# 执行写入操作
for data in data_list:
cursor.execute("insert into cardlist(name, work) values(%s, %s)", data)
# 提交事务
conn.commit()
# 关闭游标和数据库连接
cursor.close()
conn.close()
return data_list
代码解析
-
函数
write_db
,用于将数据写入数据库:- 创建一个数据库连接:使用
pymysql.connect()
函数和**db_config
参数创建数据库连接对象,并将其赋值给变量conn
。 - 创建一个游标:使用
conn.cursor()
方法创建游标对象,并将其赋值给变量cursor
。 - 执行创建表的操作:使用
cursor.execute()
方法执行SQL语句,如果表已经存在,则不执行创建操作。通过SQL语句"create table if not exists cardlist(name varchar(20), work varchar(20))"
来创建名为cardlist
的表,该表包含名为name
和work
的两列,数据类型分别为varchar(20)
。 - 提交事务:使用
conn.commit()
方法提交数据库事务,将之前的操作生效。 - 关闭游标和数据库连接:使用
cursor.close()
方法关闭游标,使用conn.close()
方法关闭数据库连接。 - 调用函数
write_db_data
并返回结果:使用return write_db_data(data_list)
调用函数write_db_data
将data_list
作为参数传递,并返回函数调用的结果。
- 创建一个数据库连接:使用
-
函数
write_db_data
,用于执行数据的写入操作:- 创建一个数据库连接:同样使用
pymysql.connect()
函数和**db_config
参数创建数据库连接对象,并将其赋值给变量conn
。 - 创建一个游标:使用
conn.cursor()
方法创建游标对象,并将其赋值给变量cursor
。 - 执行写入操作:通过
for
循环遍历data_list
,并使用cursor.execute()
方法执行SQL语句插入数据到cardlist
表中。SQL语句为"insert into cardlist(name, work) values(%s, %s)"
,其中%s
是占位符,用于接收data
中对应位置的值。 - 提交事务:使用
conn.commit()
方法提交数据库事务,将之前的写入操作生效。 - 关闭游标和数据库连接:使用
cursor.close()
方法关闭游标,使用conn.close()
方法关闭数据库连接。 - 返回数据列表:返回
data_list
数据列表作为函数调用的结果。
- 创建一个数据库连接:同样使用
3. 准备名片卡模板
创建一个word 文件命名为template.docx
配置自己喜欢的模板, 参考如下:
4. 读取数据库中的数据,生成名片卡
#定义一个函数,用于读取数据库中的数据
def read_db():
# 创建一个数据库连接
conn = pymysql.connect(**db_config)
# 创建一个游标
cursor = conn.cursor()
# 执行查询操作
cursor.execute("select * from cardlist")
# 获取查询结果
result = cursor.fetchall()
#循环遍历查询结果
for row in result:
print(row)
# 打开模板
doc = DocxTemplate('template.docx')
# 设置内容对应关系
context = {'name': row[0], 'work': row[1]}
# 填充内容
doc.render(context)
na = row[0]
# 保存新的文件
doc.save(f'{na}.docx')
# 友好提示
print(f'{na}的word-生成完毕!!')
# 关闭游标和数据库连接
cursor.close()
conn.close()
return result
代码解析
- 创建一个数据库连接:使用
pymysql.connect()
函数和**db_config
参数创建数据库连接对象,并将其赋值给变量conn
。 - 创建一个游标:使用
conn.cursor()
方法创建游标对象,并将其赋值给变量cursor
。 - 执行查询操作:使用
cursor.execute()
方法执行SQL语句"select * from cardlist"
,并将查询结果赋值给变量result
。 - 循环遍历查询结果:通过
for
循环遍历每一行数据,对于每一行数据,执行如下操作:- 打开一个Word模板:使用
DocxTemplate()
函数读取名为template.docx
的模板文件,并将其赋值给变量doc
。 - 设置内容对应关系:创建一个字典
context
,其中键名分别为name
和work
,对应的键值为该行的第一列和第二列数据,即row[0]
和row[1]
。 - 填充内容:使用
doc.render()
方法将模板中的占位符替换为相应的值,实现内容的动态填充。 - 保存生成的Word文档:使用
doc.save()
方法将生成的Word文档保存到当前目录下,文件名为该行数据的第一列(即姓名)。 - 友好提示:输出一个字符串,表示该行数据的Word文档生成已完成。
- 打开一个Word模板:使用
- 关闭游标和数据库连接:使用
cursor.close()
方法关闭游标,使用conn.close()
方法关闭数据库连接。 - 返回查询结果:返回变量
result
作为函数调用的结果。
执行代码
if __name__ == '__main__':
data_list = read_excel('名单.xlsx')
print(data_list)
read_db()
目录结构
打印结果
查看数据是否写入
生成名片卡菜单
查看名片卡效果
完整代码
import openpyxl
from docxtpl import DocxTemplate
import pymysql
# MySQL数据库连接配置
db_config = {
'host': "xxxx", # 主机名
'port': xxx, # 端口
'user': "root", # 账户
'password': "xxxxx", # 密码
'database': 'myworkcard',
}
# 创建一个读取excel 文件的函数
def read_excel(excel_file):
# 打开excel
excel = openpyxl.load_workbook(excel_file)
# 选择工作薄-选择第一个
sheet = excel.worksheets[0]
# 创建一个空列表
data_list = []
for row in sheet.iter_rows(min_row=1, values_only=True):
data_list.append((row[1],row[2]))
print(row[1], '----', row[2])
print(data_list)
#调用函数写入数据库
return write_db(data_list)
# 创建一个函数, 将数据写入数据库
def write_db(data_list):
# 创建一个数据库连接
conn = pymysql.connect(**db_config)
# 创建一个游标
cursor = conn.cursor()
# 执行创建表的操作, 如果表已经存在, 则不执行
cursor.execute("create table if not exists cardlist(name varchar(20), work varchar(20))")
#cursor.execute("create table cardlist(name varchar(20), work varchar(20))")
# 提交事务
conn.commit()
# 关闭游标和数据库连接
cursor.close()
conn.close()
# 调用函数写入数据库
return write_db_data(data_list)
def write_db_data(data_list):
# 创建一个数据库连接
conn = pymysql.connect(**db_config)
# 创建一个游标
cursor = conn.cursor()
# 执行写入操作
for data in data_list:
cursor.execute("insert into cardlist(name, work) values(%s, %s)", data)
# 提交事务
conn.commit()
# 关闭游标和数据库连接
cursor.close()
conn.close()
return data_list
#定义一个函数,用于读取数据库中的数据
def read_db():
# 创建一个数据库连接
conn = pymysql.connect(**db_config)
# 创建一个游标
cursor = conn.cursor()
# 执行查询操作
cursor.execute("select * from cardlist")
# 获取查询结果
result = cursor.fetchall()
#循环遍历查询结果
for row in result:
print(row)
# 打开模板
doc = DocxTemplate('template.docx')
# 设置内容对应关系
context = {'name': row[0], 'work': row[1]}
# 填充内容
doc.render(context)
na = row[0]
# 保存新的文件
doc.save(f'{na}.docx')
# 友好提示
print(f'{na}的word-生成完毕!!')
# 关闭游标和数据库连接
cursor.close()
conn.close()
return result
if __name__ == '__main__':
data_list = read_excel('名单.xlsx')
print(data_list)
read_db()
总结
本文介绍了使用TDSQL Serveless数据库添加Excel数据,并生成名片卡的流程。具体步骤包括:读取Excel文件中的数据,将数据插入到TDSQL Serveless数据库的表中,从数据库中读取数据并生成名片卡。在实现过程中需要使用pandas
、pymysql
等库。需要注意的是,在使用pymysql
库建立连接时,需要将代码中的连接信息替换为实际的连接信息。此外,使用docxtpl
库动态填充名片卡内容时,需要事先定义名片卡模板,并在代码中指定模板文件的路径。