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 ...
随机推荐
- Sqoop - 使用场景
Oracle >> HDFS sqoop import --connect jdbc:oracle:thin:@<oracle_host>:<oracle_port> ...
- 【渗透测试】 Vulnhub JANGOW: 1.0.1
渗透环境 攻击机: IP: 192.168.149.128(Kali) 靶机: IP:192.168.149.129 靶机下载地址:https://www.vulnhub.com/entr ...
- 大数据之路Week10_day01 (通过直接创建Hfile文件的方式往Hbase中插入数据)
package com.wyh.parctise; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.P ...
- 探秘Transformer系列之(10)--- 自注意力
探秘Transformer系列之(10)--- 自注意力 目录 探秘Transformer系列之(10)--- 自注意力 0x00 概述 0x01 原理 1.1 设计思路 1.2 输入 1.3 QKV ...
- minecraft mods descrip
1. [Advanced Finders]矿物探测器 mod 显示玩家周围附近矿石的方向(指针显示水平面上可到达的矿石) 探测地下深部矿脉(箭头显示最近矿脉的方向(上/下)) 发现大型矿床时发出信号( ...
- Golang 入门 : 转换
Go中数学运算和比较运算要求包含的值具有相同的类型.如果不是的话,则在尝试运行代码时会报错. 为变量分配新值也是如此.如果所赋值的类型与变量的声明类型不匹配,也会报错. 解决方法是使用转换,它允许你将 ...
- element-ui和ant-design-vue 数字输入框只能输入大于等于1的整数
限制输入的是大于等于1的整数 <template> <div> <h1>ant-design-vue 1.xx</h1> <a-input-num ...
- C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- php文件和文件夹操作类
文件和文件夹操作 移动 | 复制 | 删除 | 重命名 | 下载 <?php namespace Framework\Tools; use PharData; class FileManager ...
- FireDAC开发DataSnap应用系统【2】-使用TFDJSONDatasets功能
类别 说明 TFDJSONDatasets FireDAC使用JSONDataSet,其中可包括多个DataSet对象 TFDJSONDataSetsWriter 把TDataSet写入TFDJSON ...