此文章已同步更新至我的个人博客https://simonting.gitee.io
前言
帮老同学写的一个python脚本,具体需求主要是绘制一个面板,连接数据库,输入公司名称关键字,查询满足要求的数据,并且带有导出excel功能。数据库中的数据来源于https://blog.csdn.net/King__Cheung/article/details/109484246 这篇博客中通过python脚本调用企查查接口所获取到的数据。
一、代码
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# pip3 install PyMySQL
import tkinter as tk
from tkinter import messagebox
import pymysql
import csv
import os
window = tk.Tk()
# 标题
window.title('天眼查小工具')
# 窗口大小
window.geometry('900x500+500+250')
# 请输入关键字提示文字
label1 = tk.Label(window, text="请输入关键字:")
# 下方提示文字
label2 = tk.Label(window, text="输入关键字点击查询按钮即可搜索,点击导出数据即可导出为excel文件。")
# 关键字输入框
company_name_input = tk.Entry(window, show=None, font=('微软雅黑', 14))
# 查询结果显示文本框
text = tk.Text(window, width=71, height=14, font=('微软雅黑', 15))
# 滚动条
scroll = tk.Scrollbar()
# 连接数据库
db = pymysql.connect("localhost", "root", "zhangting", "holder")
cursor = db.cursor()
success_text = "程序启动成功。\n数据库连接成功。\n输入关键字开始查询吧..."
text.insert("insert", success_text)
export_res = ()
export_file_name = "data.csv"
# 清空
def reset():
global export_res
export_res = ()
company_name_input.delete(0, "end")
text.delete(1.0, "end")
# 查询
def search():
text.delete(1.0, "end")
key_word = company_name_input.get()
key_word = str(key_word).lstrip().rstrip()
get_data(key_word)
# 导出
def export():
if len(export_res) == 0:
messagebox.showwarning('提示', '内容为空,无法导出!')
return
create_csv_file('data-1')
csv_file = open(export_file_name, 'a+', newline='')
try:
writer = csv.writer(csv_file)
header = ('股东', '公司', 'Account UserName', 'Primary UserName', 'Account Segment', 'AM Name')
writer.writerow(header)
for res in export_res:
writer.writerow(res)
abspath = os.path.abspath(export_file_name)
messagebox.showinfo('提示', '文件导出完成!\n文件地址:' + abspath + "\n")
finally:
csv_file.close()
# 生成csv文件,且防止重名
def create_csv_file(file_name):
if os.path.exists(file_name + '.csv'):
index = int(file_name.split('-', 1)[1]) + 1
create_csv_file('data-' + str(index))
else:
global export_file_name
export_file_name = str(file_name) + '.csv'
# 查询按钮
button_search = tk.Button(window, text="查询", bg="LightBlue", font=('微软雅黑', 12), width=6, height=1, command=search)
# 清空按钮
button_reset = tk.Button(window, text="清空", bg="LightCyan", font=('微软雅黑', 12), width=6, height=1, command=reset)
# 导出按钮
button_export = tk.Button(window, text="导出数据", font=('微软雅黑', 12), width=8, height=1, command=export)
# 查询所有数据(包含直接关联与非直接关联的数据)
def execute_sql(key_word):
if len(key_word) != 0:
cursor.execute(
'select share,name,account_username,primary_username,account_segment'
',am_name from holder where share in (select share from holder where'
' name like \'%' + key_word + '%\')')
return cursor.fetchall()
# 查询直接关联的数据
def search_direct(key_word):
if len(key_word) != 0:
cursor.execute(
'select share,name,account_username,primary_username,account_segment'
',am_name from holder where name like \'%' + key_word + '%\'')
return cursor.fetchall()
# 查询数据、数据处理
def get_data(key_word):
content = '请输入关键字!'
if len(key_word) != 0:
result = execute_sql(key_word)
result = dig_data(result)
# 直接关联的数据
direct_result = search_direct(key_word)
# 求出非直接关联的公司
indirect_result = set(result).difference(set(direct_result))
indirect_result = tuple(indirect_result)
global export_res
export_res = result
if len(result) != 0:
content = "共查询到" + str(len(result)) + "条与“" + key_word + "”相关的信息:\n股东" \
+ " - " + "公司" + " - " + "Account UserName" \
+ " - " + "Primary UserName" + " - " + "Account Segment" \
+ " - " + "AM Name" + "\n"
content += "------------------------------\n与“" + key_word + "”直接关联的数据为:\n"
i = 1
for res in direct_result:
content += str(i) + "、" + res[0] + " - " + res[1] + " - " + res[2] \
+ " - " + res[3] + " - " + res[4] + " - " \
+ res[5] + "\n"
i += 1
content += "------------------------------\n与“" + key_word + "”非直接关联的数据为:\n"
if len(indirect_result) != 0:
for res in indirect_result:
content += str(i) + "、" + res[0] + " - " + res[1] + " - " + res[2] \
+ " - " + res[3] + " - " + res[4] + " - " \
+ res[5] + "\n"
i += 1
else:
content += "无数据\n"
else:
content = "未查询到任何与“" + key_word + "”相关的结果!"
text.insert("insert", content)
db.commit()
# 数据挖掘
def dig_data(result):
all_company = ""
for res in result:
all_company += res[1]
data = ()
for res in result:
share = str(res[0])
if share.endswith("公司"):
data += execute_sql(share)
return tuple(set(result + data))
# 控件布局
def main():
# "请输入关键字"提示文字坐标
label1.place(x=10, y=20)
# 关键字输入框坐标
company_name_input.place(x=100, y=17)
# 关键字输入框的长度与宽度
company_name_input.place(width=590, height=30)
# 查询按钮坐标
button_search.place(x=720, y=12)
# 清空按钮坐标
button_reset.place(x=800, y=12)
# 查询结果显示文本框坐标
text.place(x=12, y=60)
# 滚动条的位置
scroll.pack(side=tk.RIGHT, fill=tk.Y)
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)
# 导出按钮坐标
button_export.place(x=780, y=455)
# 下方提示文字坐标
label2.place(x=10, y=465)
window.mainloop()
if __name__ == '__main__':
main()
功能截图
查询功能:
- 1、 支持向下挖掘一层
- 2、支持直接关联数据与非直接关联数据分开显示
导出功能:
导出文件名支持自动重命名,不会覆盖之前导出的文件。
内容为空,无法导出: