python tkinter 数据处理小工具


主要用于解决有个项目需要频繁的进行数据处理,并且自己无法直接链接环境,偶尔业务无法联系到相关人员,为了减少沟通成本,写了个GUI小工具直接给到业务相关技术负责人,由他直接进行数据操作,莫烦我。。。。

主要采用python进行编写,GUI使用了python3的 tkinter,excel处理使用了openpyxl,整体代码完成之后使用pyinstaller打包成了exe,直接丢给他了

因为分了好几次编写,下面是主要代码,希望大佬提提建议

能否更简短一些,新手上路,请多多指教!!

from tkinter import *
from tkinter import filedialog
import tkinter.messagebox
from openpyxl import load_workbook

class hkFile():    # 文件处理类,主要生成了需要的sql文件
    def __init__(self, file, datatype):
        self.file = file
        # self.data_list = []
        self.dataType = datatype
        # self.sqlfile = self.file.split('.')[-2].split('/')[-1] + '.sql'
        self.wb = load_workbook(self.file)
        self.ws1 = self.wb['房屋数据']
        self.ws2 = self.wb['客户数据']
        self.ws3 = self.wb['报事类别']

    def fwsj(self):
        ws = self.ws1
        # 房屋数据sql生成
        dataList = []
        for rowNum in range(2, ws.max_row + 1):
            sql = "INSERT into hk_treedata(EMUN_ID,VALUE_KEY,VALUE_DESC,PARENT_VALUE_ID,SORT_NUM) VALUES ('{}','{}','{}'," \
                "'{}','{}');".format(self.dataType, ws.cell(row=rowNum, column=4).value, ws.cell(row=rowNum, column=6).value,
                                    ws.cell(row=rowNum, column=3).value, ws.cell(row=rowNum, column=7).value)
            dataList.append(sql)
        # print(dataList)
        return dataList

    def khzl(self):
        ws = self.ws2
        # 客户资料及房屋数据关联sql生成
        dataList = []
        for rowNum in range(2, ws.max_row + 1):
            if ws.cell(row=rowNum, column=9).value is None:
                col9 = ''
            else:
                col9 = ws.cell(row=rowNum, column=9).value

            # 客户资料
            sql1 = "INSERT into hycc_cus_info(CustID,CUS_NAME,FIELD02,FIELD08,FIELD20,HOST_NUM,FIELD11,FIELD13,RoomID,FIELD04) VALUES('{}','{}','{}','{}','{}','{}','{}','{}','{}','{}');".format(
                ws.cell(row=rowNum, column=2).value,
                ws.cell(row=rowNum, column=3).value,
                ws.cell(row=rowNum, column=3).value,
                ws.cell(row=rowNum, column=4).value,
                ws.cell(row=rowNum, column=5).value,
                ws.cell(row=rowNum, column=6).value,
                ws.cell(row=rowNum, column=6).value,
                col9,
                ws.cell(row=rowNum, column=11).value,
                ws.cell(row=rowNum, column=12).value)
            # 客户资料与房屋数据关联关系
            sql2 = "INSERT into hk_roomtocust(RoomID,CustID) VALUES('{}','{}');".format(
                ws.cell(row=rowNum, column=11).value,
                ws.cell(row=rowNum, column=2).value)

            dataList.append(sql1)
            dataList.append(sql2)

        return dataList


    def bslbs(self):
        ws = self.ws3
        # 报事类别sql生成
        dataList = []
        for rowNum in range(2, ws.max_row + 1):
            if ws.cell(row=rowNum, column=6).value == '咨询':
                bslb = '21'
            elif ws.cell(row=rowNum, column=6).value == '报事':
                bslb = '22'
            elif ws.cell(row=rowNum, column=6).value == '报修':
                bslb = '23'
            else:
                continue

            sql = "INSERT into hk_treedata(EMUN_ID,VALUE_KEY,VALUE_DESC,PARENT_VALUE_ID,SORT_NUM,CommID) VALUES('{}','{}','{}','{}',CONCAT('1',SUBSTRING('{}',7)),'{}');".format(
                bslb, ws.cell(row=rowNum, column=4).value,
                ws.cell(row=rowNum, column=5).value,
                str(ws.cell(row=rowNum, column=4).value)[:-4] if str(ws.cell(row=rowNum, column=4).value)[
                                                                :-4] != '' else 'NULL',
                ws.cell(row=rowNum, column=1).value, ws.cell(row=rowNum, column=3).value)

            dataList.append(sql)

        return dataList
   
        


class mainTop():    #GUI主体窗口
    def __init__(self):
        #初始化
        
        self.results = []
        self.root=Tk()
        
        self.wuye = IntVar()
        self.dichan = IntVar()
        self.chanye = IntVar()
        
        #设置窗体标题
        self.root.title('Python GUI Learning')

        #设置窗口大小和位置
        self.root.geometry('500x300+570+200')


        self.label1=Label(self.root,text='请选择文件:')
        # self.label1.grid(column=1, row=2)
        self.text1=Entry(self.root,bg='white',width=45)
        # self.text1.grid(column=0, row=2)
        self.button1=Button(self.root,text='浏览',width=8,command=self.selectExcelfile)
        # self.button1.grid(column=0, row=2)
        self.button2=Button(self.root,text='处理',width=8,command=self.doProcess)
        self.button3=Button(self.root,text='保存',width=8,command=self.saveFile)

        # self.chsjlx = IntVar()
        self.shuJuLeiXing1=Checkbutton(self.root, text="物业", variable=self.wuye, onvalue=1, offvalue=0)
        # self.shuJuLeiXing1.grid(column=0, row=3, sticky=W)
        self.shuJuLeiXing2=Checkbutton(self.root, text="地产", variable=self.dichan, onvalue=1, offvalue=0)
        # self.shuJuLeiXing2.grid(column=1, row=3, sticky=W)
        self.shuJuLeiXing3=Checkbutton(self.root, text="产业", variable=self.chanye, onvalue=1, offvalue=0)
        # self.shuJuLeiXing3.grid(column=2, row=3, sticky=W)
        self.fwsj = IntVar()
        self.shuJuXinXi1=Checkbutton(self.root, text="房屋数据", variable=self.fwsj, onvalue=1, offvalue=0)
        self.khsj = IntVar()
        self.shuJuXinXi2=Checkbutton(self.root, text="客户数据", variable=self.khsj, onvalue=1, offvalue=0)
        self.bslb = IntVar()
        self.shuJuXinXi3=Checkbutton(self.root, text="报事类别", variable=self.bslb, onvalue=1, offvalue=0)
    

        self.label1.pack()
        self.text1.pack()
        self.button1.pack()
        self.button2.pack()
        self.button3.pack() 
        self.shuJuLeiXing1.pack()
        self.shuJuLeiXing1.pack()
        self.shuJuLeiXing1.pack()
        self.shuJuXinXi1.pack()
        self.shuJuXinXi2.pack()
        self.shuJuXinXi3.pack()

        self.label1.place(x=30,y=30)
        self.text1.place(x=100,y=30)
        self.button1.place(x=390,y=26)
        self.button2.place(x=160,y=80)
        self.button3.place(x=260,y=80)
        self.shuJuLeiXing1.place(x=30,y=120)
        self.shuJuLeiXing2.place(x=120,y=120)
        self.shuJuLeiXing3.place(x=210,y=120)
        self.shuJuXinXi1.place(x=30,y=150)
        self.shuJuXinXi2.place(x=120,y=150)
        self.shuJuXinXi3.place(x=210,y=150)
    
        self.root.mainloop() 

    def selectExcelfile(self):
        self.sfname = filedialog.askopenfilename(title='选择Excel文件', filetypes=[('All Files', '*')])
        print(self.sfname)
        self.text1.insert(INSERT,self.sfname)

    def saveFile(self):
        self.savename = filedialog.asksaveasfilename(title='保存sql文件', filetypes=[('SQL', '*.sql')])
        sqllist = self.results
        # print(self.savename)
        with open(self.savename, 'a', encoding='utf-8') as f:
            f.writelines([line + '\n' for line in sqllist])

        tkinter.messagebox.showinfo('提示','sql文件已生成')

    def doProcess(self):
        # 物业=24,地产=25,产业=26
        dataType = 24
        if self.wuye.get() == 1:
            dataType = 24
        if self.dichan.get() == 1:
            dataType = 25
        if self.chanye.get() == 1:
            dataType == 26

        hksql = hkFile(self.sfname, dataType)
        print(self.fwsj.get())
        if self.fwsj.get() == 1:
            self.results += hksql.fwsj()
            # print(self.results)
        if self.khsj.get() == 1:
            self.results += hksql.khzl()
        if self.bslb.get() == 1:
            self.results += hksql.bslbs()

        # return results
        tkinter.messagebox.showinfo('提示','sql文件处理完成,请保存您的文件')

 
if __name__=="__main__":
    mainTop()