python实战-将mysql表结构导出到word文档

背景

将项目中用到的表的结构写入到word文档,格式如下:

解决思路 -- 注意这次最初的思路,操作简单但是重复的操作很多最后选择了python

使用sql将这些字段查出来,然后导出到excel或者excel xml,然后粘贴到word

SELECT UPPER(COLUMN_NAME) 字段名,COLUMN_COMMENT 字段名称,DATA_TYPE 类型,(CASEWHEN DATA_TYPE = 'float' OR DATA_TYPE = 'double' OR DATA_TYPE = 'TINYINT' OR DATA_TYPE = 'SMALLINT' OR DATA_TYPE = 'MEDIUMINT' OR DATA_TYPE = 'INT' OR DATA_TYPE = 'INTEGER' OR DATA_TYPE = 'decimal' OR DATA_TYPE = 'bigint' THEN NUMERIC_PRECISION ELSE CHARACTER_MAXIMUM_LENGTH END) + '' 长度,CASEWHEN IS_NULLABLE = 'YES' THEN '是' ELSE '否' END 空否,CASEWHEN column_key = 'PRI' THEN '是' ELSE '' END 主键,'' 说明 
FROMINFORMATION_SCHEMA.COLUMNS 
WHERE table_schema = '你的库名' AND table_name = '你的表名' 

【备注】:改成你自己的库名,表名

用可视化sql APP允许此sql之后,导出到excel 然后粘贴,以下使用sqlyog演示

生成结果后 右键 -> 导出表中所有的数据行/结果

【注意】:我自己的使用过程中导出excel之后没有格式不方便复制,因此我选择的excel xml,可以自行去试一试

总结

按道理讲这里就结束了,但是我这里需要处理的表非常多,然后我自己的电脑有点垃圾,每次关闭生成的excel xml 再次重新打开需要浪费很多的时间,加上几十上百的表,重复操作及时上百次让我觉得非常恶心,因此就想着用python实现自动化办公

python 的实现

【说明】 下载依赖啥的自己努力吧!我在使用的过程中也遇到很多报错,但是解决错误本身是一个愉快的事情不是么

直接放代码

# 导包
import pymysql
from docx import Document
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml import parse_xml
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn, nsdecls# 读取或者创建文件
document = Document()       # 新建文档
# document = Document('test.docx')      # 读取现有文档,建立文档对象def load_data_from_mysql(table_name):conn = pymysql.connect(host="你的ip",port=3306,user="你的用户名",password="你的密码",db="你的库名",charset="utf8")cursor = conn.cursor()sql = "SELECT UPPER(COLUMN_NAME) 字段名, COLUMN_COMMENT 字段名称, DATA_TYPE 类型, " \"(CASE WHEN DATA_TYPE = 'float' OR DATA_TYPE = 'double' OR DATA_TYPE = 'TINYINT' OR DATA_TYPE = 'SMALLINT' OR DATA_TYPE = 'MEDIUMINT' " \"OR DATA_TYPE = 'INT' OR DATA_TYPE = 'INTEGER'  OR DATA_TYPE = 'decimal' OR DATA_TYPE = 'bigint' THEN NUMERIC_PRECISION " \"ELSE CHARACTER_MAXIMUM_LENGTH END )  长度,  " \"CASE  WHEN IS_NULLABLE = 'YES'  THEN '是' ELSE '否' END 空否, CASE WHEN column_key = 'PRI' THEN '是' ELSE '' END  主键,'' 说明 " \"FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema ='你的库名' AND table_name  = '{}'".format(table_name)print('执行sql:',sql)cursor.execute(sql)result = cursor.fetchall()return result'''
总的大标题部分
'''
# 第二种设置标题的方式,此方式还可以设置文本的字体、颜色、大小等属性
run = document.add_heading("", level=1).add_run("表结构")
# 设置西文字体
run.font.name = u'宋体'
# 设置中文字体
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
# 设置字体颜色
run.font.color.rgb = RGBColor(0,0,0)  # 黑色
# 设置字体大小
run.font.size = Pt(30)
# 设置下划线
# run.font.underline = True
# 设置删除线
# run.font.strike = True
# 设置加粗
run.bold = True
# 设置斜体
# run.italic = True'''
要查询的表初始化
'''
# 需要查询的表名
table_name_list = ['xxxx', 'xxxx', 'xxxx', '这里放你的表名,我这里很多就不完全写下来了']
# 表名对应的注释 必须一一对应,没有注释也必须用''站位
table_name_disc_list = ['xxx表', 'xxx表', 'xxx表', '这里放你的表的注释,我这里很多就不完全写下来了']
# 校验名称和注释的长度是否一致
if(len(table_name_list) != len(table_name_disc_list)):print('table_name_list长度: ' + len(table_name_list) + ';table_name_disc_list长度: ' + len(table_name_disc_list))raise Exception("长度不一致")'''
写入小标题以及表格内容
'''
# 设置正文全局字体
document.styles['Normal'].font.name = u'宋体'
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')for i in range(len(table_name_list)):# 查询sql获得二维元组tuple1 = load_data_from_mysql(table_name_list[i])# 二维元组转化为二维列表 ,且将其他类型转化为字符串 且将None转化为 ''table_data_list = list(list([( '' if it is None else str(it)) for it in items]) for items in list(tuple1))# 写入小标题title = table_name_list[i] + '   ' + table_name_disc_list[i];document.add_heading(title, level=3)# 表格标题table_name = ['字段名', '字段名称', '类型', '长度', '空否', '主键', '说明']# 创建表格行列table = document.add_table(rows=len(table_data_list)+1, cols=len(table_name),style='Table Grid')# 首行设置背景色rows = table.rows[0]for cell in rows.cells:shading_elm = parse_xml(r'<w:shd {} w:fill="D9D9D9"/>'.format(nsdecls('w')))cell._tc.get_or_add_tcPr().append(shading_elm)# 写入表格标题for i in range(len(table_name)):cell = table.cell(0, i)cell.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 水平居中cell.paragraphs[0].add_run(table_name[i])cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER  # 垂直居中# 写入表格内容for i in range(len(table_data_list)):for j in range(len(table_name)):table.cell(i+1, j).text = table_data_list[i][j]# 4
document.save("test.docx")

【解释】 接下来一个个说明你需要更改的部分

1. load_data_from_mysql -- 执行sql的方法

举个例子 db是库名,其他的看起来就懂就不说了

conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="123456",db="test",charset="utf8")

 sql 就是把上面的sql复制下来,然后把最后表名变成参数,如果库名不是固定的需要设计多个,那么自己在加一个参数就行了

2. 你的表名以及注释信息 

table_name_list 放你得所有需要用到的表,
table_name_disc_list 和上面表对应的注释,必须和上面意义对应

3. 表头设置

因为我这里是固定的,并且只需要这些字段,如果你的和我有所不通,请更改这部分,注意连同sql一起更改

其他的完全不需要更改,并且在python中把int,data类型的已经更换成字符串了,能够极大的避免导出到word出错

结果展示-部分

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/66989.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Quarkus技术系列】「云原生架构体系」在云原生时代下的Java“拯救者”是Quarkus,那云原生是什么呢?

云原生时代下的Java"拯救者" 在云原生时代&#xff0c;其实Java程序是有很大的劣势的&#xff0c;以最流行的spring boot/spring cloud微服务框架为例&#xff0c;启动一个已经优化好&#xff0c;很多bean需要lazy load的application至少需要3-4秒时间&#xff0c;内…

OpenHarmony Meetup 广州站 OpenHarmony正当时—技术开源

招募令 OpenHarmony Meetup 广州站 火热招募中&#xff0c;等待激情四射的开发者&#xff0c;线下参与OpenHarmonyMeetup线下交流 展示前沿技术、探讨未来可能、让你了解更多专属OpenHarmony的魅力 线下参与&#xff0c;先到先得,仅限20个名额&#xff01; 报名截止时间8月23日…

如何在Stream流中分组统计

上面是今天碰到需求,之前就做过类似的分组统计,这个相对来说比较简单,统计的也少,序号和总预约人数这两部分交给前端了,不需要由后端统计,后端统计一下预约日期和检查项目和预约人数就行; Overridepublic List<ItemStatisticsVo> statistics(ItemStatisticsModel itemSta…

观察者模式实战

场景 假设创建订单后需要发短信、发邮件等其它的操作&#xff0c;放在业务逻辑会使代码非常臃肿&#xff0c;可以使用观察者模式优化代码 代码实现 自定义一个事件 发送邮件 发送短信 最后再创建订单的业务逻辑进行监听&#xff0c;创建订单 假设后面还需要做其它的…

windows11下配置vscode中c/c++环境

本文默认已经下载且安装好vscode&#xff0c;主要是解决环境变量配置以及编译task、launch文件的问题。 自己尝试过许多博客&#xff0c;最后还是通过这种方法配置成功了。 Linux(ubuntu 20.04)配置vscode可以直接跳转到配置task、launch文件&#xff0c;不需要下载mingw与配…

Fast SAM与YOLOV8检测模型一起使用实现实例分割以及指定物体分割(有代码)

Fast SAM与YOLOV8检测模型一起使用 VX 搜索”晓理紫“ 关注并回复yolov8fastsam获取核心代码 晓理紫 1 使用场景 实例分割数据集的获取要比检测数据的获取更加困难&#xff0c;在已有检测模型不想从新标注分割数据进行训练但是又想获取相关物体的mask信息以便从像素级别对物体进…

微信个人小程序申请 (AppID 和 AppSecret)

1. 登录微信公众平台 https://mp.weixin.qq.com/cgi-bin/loginpage?url%2Fcgi-bin%2Fhome%3Ft%3Dhome%2Findex%26lang%3Dzh_CN%26token%3D47421820 2. 右上角立即注册 3. 注册类型选择小程序 4. 账号信息 5. 邮箱激活 6. 小程序发布流程 7. 小程序信息 (前往填写) 8. 获取小程…

项目知识点记录

1.使用druid连接池 使用properties配置文件&#xff1a; driverClassName com.mysql.cj.jdbc.Driver url jdbc:mysql://localhost:3306/book?useSSLtrue&setUnicodetrue&charsetEncodingUTF-8&serverTimezoneGMT%2B8 username root password 123456 #初始化链接数…

opencv实战项目 手势识别-手势音量控制(opencv)

本项目是使用了谷歌开源的框架mediapipe&#xff0c;里面有非常多的模型提供给我们使用&#xff0c;例如面部检测&#xff0c;身体检测&#xff0c;手部检测等。 手势识别系列文章 1.opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪…

普通索引和唯一索引,应该怎么选择(已经那个changebuffer - 和你这个线程连接池)

普通索引和唯一索引是什么 普通索引和唯一索引都是数据库中常用的索引类型&#xff0c;它们的主要区别在于索引列的值是否允许重复 普通索引允许索引列的值重复&#xff0c;也就是说&#xff0c;如果多个记录在索引列中具有相同的值&#xff0c;那么这些记录仍然可以通过普通…

【12】Git工具 协同工作平台使用教程 Gitee使用指南 腾讯工蜂使用指南【Gitee】【腾讯工蜂】【Git】

tips&#xff1a;少量的git安装和使用教程&#xff0c;更多讲快速使用上手Gitee和工蜂平台 一、准备工作 1、下载git Git - Downloads (git-scm.com) 找到对应操作系统&#xff0c;对应版本&#xff0c;对应的位数 下载后根据需求自己安装&#xff0c;然后用git --version验…

uniapp 微信小程序 订阅消息

第一步&#xff0c;需要先去小程序官方挑选一下订阅模板拿到模板id 订阅按钮在头部导航上&#xff0c;所以 <u-navbar :bgColor"bgColor"><view class"u-nav-slot" slot"left" click"goSubscribe"><image :src"g…