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

news2024/12/25 23:43:04

背景

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

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

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

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 = '你的表名' 

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

用可视化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.coloradmin.cn/o/878847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mathematica 与 Matlab 常见复杂指令集汇编

Mathematica 常见指令汇编 Mathematica 常见指令 NDSolve 求解结果的保存 sol NDSolve[{y[x] x^2, y[0] 0, g[x] -y[x]^2, g[0] 1}, {y, g}, {x, 0, 1}]; numericSoly sol[[1, 1, 2]]; numericSolg sol[[1, 2, 2]]; data Table[{x, numericSoly[x], numericSolg[x]},…

Redis_缓存1_缓存类型

14.redis缓存 14.1简介 穿透型缓存&#xff1a; 缓存与后端数据交互在一起&#xff0c;对服务端的调用隐藏细节。如果从缓存中可以读到数据&#xff0c;就直接返回&#xff0c;如果读不到&#xff0c;就到数据库中去读取&#xff0c;从数据库中读到数据&#xff0c;也是先更…

基于鲲鹏平台Ceph深度性能调优

刘亮奇 架构师技术联盟 2021-04-12 07:50 摘自&#xff1a; https://mp.weixin.qq.com/s/o9HH-8TF0DbMqHrvsFh1NA 随着 IOT、大数据、移动互联等应用的暴涨&#xff0c;产生的数据也越来越多&#xff0c;整个存储市场总量也逐年增长&#xff0c;预计到 2021 年分布式存储会占到…

文本分类实战-NLP

数据集及任务分析 项目主题&#xff1a;新闻的主题分类&#xff0c;10分类任务 一般对于NLP项目来说的话需要进行数据预处理的&#xff0c;但是由于本项目的数据是经过处理过的&#xff0c;所以就不需要进行数据预处理了&#xff0c;但是数据预处理对NLP项目是重中之重的。 TH…

【力扣周赛】第 358 场周赛

文章目录 竞赛链接Q1&#xff1a;6939. 数组中的最大数对和竞赛时代码—— O ( n 2 ) O(n^2) O(n2)解法2——一次遍历 O ( n ) O(n) O(n)&#xff0c;维护最大数位为 i 的元素的最大值 Q2&#xff1a;6914. 翻倍以链表形式表示的数字竞赛时代码——存入列表再计算解法2——只有…

批量提取文件名到excel,详细的提取步骤

如何批量提取文件名到excel&#xff1f;我们的电脑中可能存储着数量非常多的电子文件&#xff0c;现在需要快速将这些文件的名称全部提取到Excel中。虽然少量数据可以通过复制粘贴的方式轻松完成&#xff0c;但是对于上万个数据而言&#xff0c;复制粘贴都是行不通的&#xff0…

【考研数学】高等数学第三模块——积分学 | Part II 定积分(反常积分及定积分应用)

文章目录 前言三、广义积分3.1 敛散性概念&#xff08;一&#xff09;积分区间为无限的广义积分&#xff08;二&#xff09;积分区间有限但存在无穷间断点 3.2 敛散性判别法 四、定积分应用写在最后 前言 承接前文&#xff0c;梳理完定积分的定义及性质后&#xff0c;我们进入…

陪诊小程序开发|陪诊陪护小程序让看病不再难

陪诊小程序通过与医疗机构的合作&#xff0c;整合了医疗资源&#xff0c;让用户能够更加方便地获得专业医疗服务。用户不再需要面对繁琐的挂号排队&#xff0c;只需通过小程序预约服务&#xff0c;便能够享受到合适的医疗资源。这使得用户的就医过程变得简单高效&#xff0c;并…

vue基础知识三:v-show和v-if有什么区别?使用场景分别是什么?

一、v-show与v-if的共同点 我们都知道在 vue 中 v-show 与 v-if 的作用效果是相同的(不含v-else)&#xff0c;都能控制元素在页面是否显示 在用法上也是相同的 <Model v-show"isShow" /> <Model v-if"isShow" />当表达式为true的时候&#…

使用 Python 在 NLP 中进行文本预处理

一、说明 自然语言处理 &#xff08;NLP&#xff09; 是人工智能 &#xff08;AI&#xff09; 和计算语言学的一个子领域&#xff0c;专注于使计算机能够理解、解释和生成人类语言。它涉及计算机和自然语言之间的交互&#xff0c;允许机器以对人类有意义和有用的方式处理、分析…

Debian 10驱动Broadcom 无线网卡

用lspci命令查询无线网卡品牌&#xff1a; 运行下面代码后&#xff0c;重启即可。 apt-get install linux-image-$(uname -r|sed s,[^-]*-[^-]*-,,) linux-headers-$(uname -r|sed s,[^-]*-[^-]*-,,) broadcom-sta-dkms

Springboot MultipartFile文件上传与下载

yml文件配置是否可以上传及上传附件大小 servlet:multipart:# 允许文件上传enabled: true# 单个文件大小max-file-size: 20MB# 设置总上传的文件大小max-request-size: 50MB /*** param files* param request* Description 上传文件* Throws* Return java.util.List* Date 202…

Dynamics 365 视图

1 视图分类 如图,视图分为查找视图、关联视图、公共视图三类。其中查找视图又可分为查找视图、高级查找视图、快速查找视图。 查找视图从名称来看,就是查找记录使用的,相当于预置了一些过滤条件,且控制查询的结果展示的列。只不过使用的位置不同,具体如下。 公共视图是最…

实践-CNN卷积层

实践-CNN卷积层 1 卷积层构造2 整体流程3 BatchNormalization效果4 参数对比5 测试效果 1 卷积层构造 2 整体流程 根据网络结构来写就可以了。 池化 拉平 训练一个网络需要2-3天的时间。用经典网络来&#xff0c;一些细节没有必要去扣。 损失函数&#xff1a; fit模型&…

量子计算的突破:从理论到实践

章节一&#xff1a;引言 随着信息时代的到来&#xff0c;计算科学与技术也在不断迎来新的突破与革新。其中&#xff0c;量子计算作为一项引人瞩目的前沿技术&#xff0c;正逐渐从理论走向实践。量子计算以其在处理复杂问题上的巨大潜力&#xff0c;吸引着全球科学家和工程师的关…

需求调研前需要做哪些准备?

大家好&#xff0c;我是沐尘而生&#xff0c;今天让我和大家一起走进&#xff0c;产品经理实战百问百答&#xff0c;从问题入手&#xff0c;一步一个脚印&#xff0c;习惯产品经理岗位。 我将从需求调研的角度出发&#xff0c;为大家详细介绍一下在开始调研前需要做哪些准备工作…

项目难点:解决IOS调用起软键盘之后页面样式布局错乱问题

需求背景 &#xff1a; 开发了一个问卷系统重构项目&#xff0c;刚开始开发的为 PC 端&#xff0c;其中最头疼的一点无非就是 IE 浏览器的兼容适配性问题&#xff1b; 再之后项目经理要求开发移动端&#xff0c;简单的说就是写 H5 页面&#xff0c;到时候会内嵌在 App 应用或办…

嵌入式要卷成下一个Java了吗?

不会&#xff01; 说不会也是有自己的原因的 前几天写了一篇 Linux 和单片机的文章 不做Linux就没前途吗&#xff1f; 单片机容易&#xff0c;门槛低&#xff0c;无非不就是单片机技术知识点比较少&#xff0c;特别是面向过程式的编程也更容易掌握。嵌入式 Linux 是多任务式的&…

Rx.NET in Action 第四章学习笔记

Part 2 核心思想 《Rx.NET in Action》这一部共分八章&#xff0c;涵盖了Rx 关键模块——**Observable(可观察序列)和Observer(观察者)**的全部功能&#xff0c;以及如何创建它们、连接它们和控制它们之间的关系。 然后&#xff0c;您将学习如何使用强大的 Rx 处理器构建复杂…