Excel 拼接为 SQL 并打包 exe
关于 Excel 拼接 sql 这个操作, 我已经整过好几篇了, 当然在工作中也是蛮常用的, 今天主要是来写个终篇, 彻底结束它, 然后将代码进行打包为 exe 这样的桌面小软件, 除了自己用, 也可以分享给需要的小伙伴用, 不用装环境也可以运行. 还是先对这一系列做一个汇总吧.
Excel 批量导入Mysql(创建表-追加数据): https://www.cnblogs.com/chenjieyouge/p/11811784.html
Excel 逐条导入Mysql(数据更新): https://www.cnblogs.com/chenjieyouge/p/11812126.html
Excel 数据拼接为 insert 语句脚本: https://www.cnblogs.com/chenjieyouge/p/12643006.html
最后新新增, 自动生成 create table 语句, 然后再将功能给打个包, 自己用呀.
完整代码
不多哔哔, 直接上代码, 刚写的, 自己试了几把, 感觉还是比较香的哦, 我用的是 window 哈.
"""
功能: Excel 文件拼接为sql脚本
输入: 一个Excel 的文件路径
输出: 一个sql文件, 包含自动生成的 create_table 语句 和 insert 数据的语句
"""
import pandas as pd
def Excel_to_sql_file(file_path, output_path="D:/"):
"""将Excel 转为Sql文件,并存储在 'D:/'下"""
df = pd.read_excel(file_path)
# 获取表名, 字段名
file_suffix = file_path.split("/")[-1]
tb_name = file_suffix[:file_suffix.rfind('.')]
col_lst = df.columns
with open(output_path + tb_name + ".sql", 'w', encoding='utf8') as f:
# 先写入建表的 sql
f.write(f'drop table if exists {tb_name};\n')
f.write(f'create table {tb_name}(')
f.write('\n\n\t')
# 最后一个字段要单独处理, 没有逗号 ",", 于是可用 *的方式(pakage) 来代替切片
*head_lst, end = col_lst
for col in head_lst:
# name varchar(200),
f.write(f'{col} varchar(200), \n\t')
f.write(f'{end} varchar(200)')
f.write('\n);')
# 提示检查 create table 的部分
f.write(f'\n\n-- 先要检查建表语句是否正确哦, 比如字段中有"空格", "-" 都是不行的')
# 将 Excel 每行数据拼接为 insert into table values (....); 的脚本
f.write("\n\n\n\n")
for _, val in df.iterrows():
# 将每行值, 每个元素都转为 str, 整体也套为 str
val_str = str([str(i) for i in val.values])
# 通过切片, 将 "['a', 'b']" => "'a', 'b'" => 再来 eval 就ok了
sql_value = eval(val_str[1:-1])
f.write(f'insert into {tb_name} values {sql_value};' + '\n')
print("转换完成! 存在您的 D盘目录下, 快去查看吧!")
if __name__ == '__main__':
file = "D:/test_data/超市数据20.xls"
Excel_to_sql_file(file)
效果演示
数据还是以当时练习 Tableau 的超市数据集为例, 中文版本的呀.

然后呢, 转为SQL脚本文件, 打开是这样的, 前面是建表的 create table ..的 DDL 语句, 后面的数据的 insert 语句.

最后在 sql 终端中执行这个脚本即可, 我用的是 mysql, 可以用 source 文件路径.sql 这个命令来执行这个脚本.
source D:/超市数据20.sql
不过中文名似乎有点 小问题, 改为英文名就正常了.

如果, 还是不知道如何执行 sql 脚本, 那, 也可以用记事本打开, 然后 Ctr + A 全选, 然后复制贴到 终端也是ok 的, 我喜欢这样, 简单粗暴, 不用管啥快慢性能之类的.
打包为 exe
虽然功能简单, 但, 还是封装为一个小 gui 程序比较好. 虽然我更喜欢用 代码的方式, 但万一哪天, 没有环境了, 或者给别人用, 就不太好了, 就打了个包, 用的是 Python 自带的 tkinter 库, 我感觉用起来还是蛮不错的哦. 打包用的是
pyinstaller 这个兄弟, 还是很好用的.
小技巧是, 单独弄一个纯净的虚拟环境来打包, 虚拟环境, 用 Python 自带的行, 原装的才是最好的.
创建: 在你想创建的目录下, 终端执行: python -m venv 虚拟环境名称
进入: cd 到 Scripts 路径下, 终端执行: activate.bat 即进入虚拟环境
然后切换到要 打包的 main.py 文件下, 打包即可.
打包命令: pyinstaller -F -w xxx.py
完整代码 (GUI版)
要打包了, 就大量清掉注释呀, 这样也节省内存和提高性能.
import tkinter as tk
from tkinter import filedialog, messagebox
import pandas as pd
# 主窗口
root = tk.Tk()
root.title("Excel 拼接为 SQL 脚本")
root.minsize(350, 100)
root.resizable(0, 0)
def excel_to_sql_file():
file_path = tk.filedialog.askopenfilename(title="读取文件")
messagebox.showinfo("您选择的Excel是:", file_path)
try:
df = pd.read_excel(file_path)
# 获取表名, 字段名
file_suffix = file_path.split("/")[-1]
tb_name = file_suffix[:file_suffix.rfind('.')]
col_lst = df.columns
except Exception as e:
messagebox.showerror("Excel异常", e)
with open("D:/" + tb_name + ".sql", 'w', encoding='utf8') as f:
# 先写入建表的 sql
f.write(f'drop table if exists {tb_name};\n')
f.write(f'create table {tb_name}(')
f.write('\n\n\t')
*head_lst, end = col_lst
for col in head_lst:
f.write(f'{col} varchar(200), \n\t')
f.write(f'{end} varchar(200)')
f.write('\n);')
f.write(f'\n\n-- 先要检查建表语句是否正确哦, 比如字段中有"空格", "-" 都是不行的')
# 拼接 insert 语句
f.write("\n\n\n\n")
for _, val in df.iterrows():
val_str = str([str(i) for i in val.values])
sql_value = eval(val_str[1:-1])
f.write(f'insert into {tb_name} values {sql_value};' + '\n')
messagebox.showinfo("转换成功", "已存在您的 D盘目录下, 快去查看吧!")
l_file = tk.Label(root, text="我将是要对 Excel 文件进行 : ")
l_file.place(relx=0.03, rely=0.4)
b_file = tk.Button(root, text="选择并拼接为SQL", command=excel_to_sql_file)
b_file.place(relx=0.6, rely=0.38)
if __name__ == '__main__':
root.mainloop()

然后运行运行完即可.

小结
- Excel 转 SQL, 或者直接存 数据库.... 这些操作已经玩透了, 以后再也不玩了, 没意思了.
- 现多养成将一些小功能代码, 写为 GUI 然后打个 exe, 这样还能分享给小伙伴用.
- 多用内置的库, 原装的才是最好的, 然后多抄代码, 抄多了,自然就会写了, 比如, *lst 这类的组包, 操作, 之前只会用切片, 现在都会用组包了, 还是有点高级和优雅的.
Excel 拼接为 SQL 并打包 exe的更多相关文章
- 将EXCEL中的列拼接成SQL insert插入语句
工作中经常需要将EXCEL文件中的数据导入到各种数据库,但是对于不熟悉数据库的人来说,如果直接使用命令执行导入,这无疑是一个难题,也是一个风险.这里我们直接在EXCEL文件中拼接成标准的SQL ins ...
- 通过Excel生成批量SQL语句
项目中有时会遇到这样的要求:用户给发过来一些数据,要我们直接给存放到数据库里面,有的是Insert,有的是Update等等,少量的数据我们可以采取最原始的办法,也就是在SQL里面用Insert int ...
- 在Excel中使用SQL语句查询和筛选
本文转自:http://blog.sina.com.cn/s/blog_5fc375650102e1g5.html 今天在微博上看到@数据分析精选 分享的一篇文章,是关于<在Excel中使用SQ ...
- 将数组里的元素拼接成sql里的in条件
/** * 将数组里的元素拼接成sql里的in条件,如'a1','a2','a3' * @param array * @returns */function makeSqlInStr(array){ ...
- Excel下用SQL语句实现AVEDEV函数功能
Excel下AVEDEV函数返回一组数据点到其算术平均值的绝对偏差的平均值. AVEDEV 是对一组数据中变化性的度量.最常见的应用就是统计平均分差. 但是如果在Excel中写SQL进行一些复杂的统计 ...
- 存储过程往拼接的sql语句中传递日期值
存储过程往拼接的sql语句中传递日期值 declare @start datetime declare @end datetime set @start='2014-3-1' set @end='20 ...
- Excel数据生成Sql语句的方法
选中想要生成的列,套用表格格式,选中表包含标题的选项确定,然后在最右边的一列第二行处,点击函数功能,选择CONCATENATE,在文本里输入想要的结构即可 代码如下 复制代码 ,=CONCATENA ...
- [破解]java打包Exe工具 - Jar2Exe Wizard
打包java文件为exe的方法和软件有很多,还有一些开源的软件和一些免费的软件. 我用过的所有打包exe软件中,Jar2Exe Wizard是最好用的,但是只有一个月的试用期,需要的可以从官网下载. ...
- SQL代理执行EXE可执行程序
原文:SQL代理执行EXE可执行程序 1.如果没有启用xp_cmdshell安全配置是不可以使用的-- 启用xp_cmdshellEXEC sp_configure 'xp_cmdshell', 1 ...
- Air打包exe
1.用flash创建一个airtest.fla,发布目标选择为AIR.ctrl+enter会得到如下文件: 2.把flex sdk的bin中找到adl.exe,复制过来,放置到:项目目录\bin\ad ...
随机推荐
- Linux介绍及使用(1)
一.linux介绍 1.Linux是一个免费.开源的操作系统,能多用户.多任务.支持多线程和多CPU的操作系统,相对windows更加稳定,在unix系统的基础上开发的系统: 注解:(1)免费:不要钱 ...
- [ABC213G] Connectivity 2 题解
好好好. 我们设当前处理 \(i\) 的答案,那么最后的图就可以分成两个部分:\(1\) 所在的联通块和其他,根据乘法原理,答案就是它们二者方案的乘积. 设 \(f_s\) 表示集合 \(s\) 中所 ...
- mysql常用优化
SQL优化是一个分析,优化,再分析,再优化的过程.站在执行计划的角度来说,我们这个过程,就是在不断的减少rows的数量. 1.建索引 2.减少表之间的关联 3.优化 sql,尽量让 sql 很快定位数 ...
- 傻妞教程——对接QQ机器人go-cqhttp
原本我懒,用的傻妞QQbot一键安装版,docker的,最近有点问题,索性换了go-cqhttp 安装go-cqhttp: go-cqhttp项目地址:https://github.com/Mrs4s ...
- TypeError: Cannot read properties of null (reading 'level')
一.分析问题 1.一个下拉框组件的更新由另一个下拉框组件控制被动更新列表,子级下拉框的值是由父级下拉框的值调用接口获取,每次父级下拉框值的改变都会改变子级下拉框的数据源也就是会改变子级下拉框的opti ...
- 机器学习 | 强化学习(7) | 融合学习与规划(Integrating Learning and Planning)
7-融合学习与规划(Integrating Learning and Planning) 1.导论 基于模型的强化学习(Model-Based Reinforcement Learning) 在上一个 ...
- React从webpack迁移到rsbuild 纪实
Why 随着团队项目规模越来越大之后,继从babel-loader迁移到esbuild之后发现打包.热重载性能随着时间迭代之后又慢慢开始成为性能瓶颈,所以决定用新的打包工具去解决这个问题.esbuil ...
- wincurl:一款基于HTTP协议的轻量级web资源抓取和上传工具
编写web程序经常要进行接口调测,通常我们会使用curl或者postman等工具,通过这些工具可以方便的发送GET或POST请求来验证接口的正确与否. 对于复杂的接口业务,我们可以通过这些工具构造po ...
- .NET 中的 Swagger 文档排序设置
Swagger的API默认排序往往达不到效果,甚至设置了Action排序也没有作用.这里直接给出代码,关键在于 IDocumentFilter 实现. 注意 DocumentFilter 注册要放在尾 ...
- 探秘Transformer系列之(16)--- 资源占用
探秘Transformer系列之(16)--- 资源占用 目录 探秘Transformer系列之(16)--- 资源占用 文章总表 0x00 概述 0x01 背景知识 1.1 数据类型 1.2 进制& ...