草庐IT

利用python编写exe应用,实现excel文件输出建表sql文件。

pangpang_csdn 2023-07-28 原文

目录

一、excel文件内容如下:

二、生成如下sql:

三、 思路:

1.设计界面

2.界面分模块设计

2.1 模块一(数据库选择)

点击选择按钮会触发command后面的函数,同时会相应的返回value值

2.2 模块一(Excel文件)

2.3 模块一(字段列表)

2.4 模块一(建表sql预览)

3.具体函数

3.1 xlsx文件转换成xls文件

3.2  添加文件目录

3.3  获取sheet、行列数

3.4  获取表名称

3.5 获取字段、类型、注释

3.6 根据sheet、列数获取具体数据

3.7 保存建表文件 

3.8 弹窗模块

四、 将代码打包成exe应用

五、全部代码

六、打包好的应用


一、excel文件内容如下:

二、生成如下sql:

三、 思路:

     利用python的xlrd包来解析excel(xlrd包只支持xls格式文件)

     利用python的tkinter包来设计GUI界面

1.设计界面

界面分成4部分,如下图

 

界面代码如下

#设置界面
    def SetGUI(self):
        
        self.init_window_name.title("Excel文件创建建表sql文件")
        self.init_window_name.geometry('1300x750')
        #self.init_window_name.overrideredirect(1) # 隐藏标题栏 最大化最小化按钮
        #self.init_window_name.attributes("-toolwindow", 2) # 去掉窗口最大化最小化按钮,只保留关闭
        self.init_window_name.resizable(0,0)# 禁止拉伸窗口
        ##button_filename=add_Excel_file()
        
        
        #数据库选择部分
        self.select_database_labelframe = tk.LabelFrame(self.init_window_name,width=1280, height=53,text="数据库选择")
        self.select_database_labelframe.place(x=10,y=2)
        self.hive_Radiobutton = Radiobutton(self.select_database_labelframe,text="hive数据库",variable=self.get_select_datebase,value='hive',command=self.select_hive_database)
        self.hive_Radiobutton.place(x=50,y=0)

        self.pg_Radiobutton = Radiobutton(self.select_database_labelframe,text="pg数据库",variable=self.get_select_datebase,value='pg',command=self.select_pg_database)
        self.pg_Radiobutton.place(x=200,y=0)
        
        self.tip_label = tk.Label(self.select_database_labelframe,width=80,height=1,fg="red", bg="yellow", font=("微软雅黑", 12,"bold"), text="提示:选择的Excel文件最好是xls格式的。如果是xlsx格式的,按钮响应时间有点慢!!!")
        self.tip_label.place(x=420,y=0)
        
        #self.get_datebase_hive.set('hive')
        #self.pg_Radiobutton.select() #默认hive_Radiobutton这个按钮被选中
        #print(self.hive_Radiobutton.get())

        #文件编辑部分
        labelframe = tk.LabelFrame(self.init_window_name,width=680, height=300, text="Excel文件")
        #labelframe.pack()
        labelframe.place(x=10,y=60)
        self.Excel_label = tk.Label(labelframe,width=10,height=1,fg='red', font=("微软雅黑", 10), text="目录路径:")
        self.Excel_label.place(x=0,y=2)
        self.Excel_path = tk.Entry(labelframe, width=60, textvariable=self.get_value)
        self.Excel_path.place(x=80,y=5)
        self.Excel_file = tk.Button(labelframe,width=23,height=1,fg='blue', text="选择Excel文件(只支持xls格式)",command=self.add_Excel_file)
        self.Excel_file.place(x=505,y=5)
        
        #表名
        self.start_row_label_location = tk.Label(labelframe,width=22,height=1,fg='red', font=("微软雅黑", 13),text="请填写表名位置信息", anchor="sw")
        self.start_row_label_location.place(x=0,y=38)
        
        self.start_row_label = tk.Label(labelframe,width=22,height=1, text="表名开始行(填写数字):")
        self.start_row_label.place(x=0,y=70)
        self.start_row = tk.Entry(labelframe, width=15, textvariable=self.get_start_row_value)
        self.start_row.place(x=160,y=70)
        self.end_row_label = tk.Label(labelframe,width=22,height=1, text="表名结束行(填写数字):")
        self.end_row_label.place(x=0,y=100)
        self.end_row = tk.Entry(labelframe, width=15, textvariable=self.get_end_row_value)
        self.end_row.place(x=160,y=100)
       
        self.start_col_label = tk.Label(labelframe,width=22,height=1, text="表名开始列(填写字母):")
        self.start_col_label.place(x=0,y=130)
        self.start_col = tk.Entry(labelframe, width=15, textvariable=self.get_start_col_value)
        self.start_col.place(x=160,y=130)
        self.end_col_label = tk.Label(labelframe,width=22,height=1, text="表名结束列(填写字母):")
        self.end_col_label.place(x=0,y=160)
        self.end_col = tk.Entry(labelframe, width=15, textvariable=self.get_end_col_value)
        self.end_col.place(x=160,y=160)
        
        #表字段
        self.start_row_label_field_location = tk.Label(labelframe,width=28,height=1,fg='red', font=("微软雅黑", 13),text="请填写表字段、注释、类型位置信息", anchor="sw")
        self.start_row_label_field_location.place(x=320,y=38)
        
        self.start_row_label_field = tk.Label(labelframe,width=24,height=1, text="表字段开始行(填写数字):")
        self.start_row_label_field.place(x=320,y=70)
        self.start_row_field = tk.Entry(labelframe, width=15, textvariable=self.get_start_row_field_value)
        self.start_row_field.place(x=494,y=70)
        self.end_row_label_field = tk.Label(labelframe,width=24,height=1, text="表字段结束行(填写数字):")
        self.end_row_label_field.place(x=320,y=100)
        self.end_row_field = tk.Entry(labelframe, width=15, textvariable=self.get_end_row_field_value)
        self.end_row_field.place(x=494,y=100)
       
        self.start_col_label_field = tk.Label(labelframe,width=24,height=1, text="表字段开始列(填写字母):")
        self.start_col_label_field.place(x=320,y=130)
        self.start_col_field = tk.Entry(labelframe, width=15, textvariable=self.get_start_col_field_value)
        self.start_col_field.place(x=494,y=130)
        self.end_col_label_field = tk.Label(labelframe,width=24,height=1, text="表字段结束列(填写字母):")
        self.end_col_label_field.place(x=320,y=160)
        self.end_col_field = tk.Entry(labelframe, width=15, textvariable=self.get_end_col_field_value)
        self.end_col_field.place(x=494,y=160)
        
        #输入sheet数字 页面改成下拉选择框
        self.sheet_label= tk.Label(labelframe,width=24,height=2,fg='green', text="请选择Excel中sheet", font=("微软雅黑", 14), anchor="sw")
        self.sheet_label.place(x=10,y=183)
        #self.sheet_value = tk.Entry(labelframe, width=15, textvariable=self.get_sheet_value)
        #self.sheet_value.place(x=10,y=245)
        self.sheet_value=ttk.Combobox(labelframe,textvariable=self.get_sheet_value)
        self.sheet_value.place(x=15,y=240)
        #self.sheet_value['value'] = ('下拉选项1', '下拉选项2', '下拉选项3', '下拉选项4')
        #self.sheet_value.current(0)
        

        
        #填写位置信息例子按钮
        self.Excel_field = tk.Button(labelframe,width=40,height=3,fg='blue', text="填写前,一定要点击我,查看位置信息格式!!!",command=self.Open_image)
        self.Excel_field.place(x=240,y=200)
        
        #查找按钮
        self.Excel_field = tk.Button(labelframe,width=17,height=3,fg='blue', text="查找表名、字段、注释",command=self.get_start_end_row_col_value)
        self.Excel_field.place(x=540,y=200)
        
        #保存文件按钮
        self.save_sql = tk.Button(labelframe,width=5,height=7,fg='blue', text="保存建表文件",wraplength=2,command=self.display_messagebox)
        self.save_sql.place(x=615,y=61)
        

        
        #字段显示列表LabelFrame
        self.field_labelframe = tk.LabelFrame(self.init_window_name,width=680, height=375,text="字段列表")
        self.field_labelframe.place(x=10,y=370)
        
        # 定义树形结构与滚动条
        self.field_tree = ttk.Treeview(self.field_labelframe, show="headings", columns=("a", "b", "c", "d"), height=16)
        self.vbar = Scrollbar(self.field_labelframe, orient='vertical', command=self.field_tree.yview,activerelief='ridge')
        #self.vbar.pack(side = tk.RIGHT, fill = tk.Y)
        self.field_tree.configure(yscrollcommand=self.vbar.set)
        # 表格的标题
        self.field_tree.column("a", width=100, anchor="center")
        self.field_tree.column("b", width=250, anchor="center")
        self.field_tree.column("c", width=150, anchor="center")
        self.field_tree.column("d", width=150, anchor="center")
        self.field_tree.heading("a", text="序号")
        self.field_tree.heading("b", text="字段名")
        self.field_tree.heading("c", text="字段类型",)
        self.field_tree.heading("d", text="注释")
        self.field_tree.place(x=0,y=3)
       # self.field_tree.bind("<Double-1>", self.onDBClick)
        self.vbar.place(x=653,y=3,relheight=0.99) #滚动条长度,取值在0-1之间

        

        #建表sql预览模块
        self.view_sql_labelframe = tk.LabelFrame(self.init_window_name,width=590, height=685,text="建表SQL预览")
        self.view_sql_labelframe.place(x=700,y=60)
        self.view_sql_Text = tk.Text(self.view_sql_labelframe,height=50, width=80,fg='red')
        self.view_sql_Text.place(x=0,y=5)
        self.view_sql_vbar = Scrollbar(self.view_sql_labelframe, orient='vertical', command=self.view_sql_Text.yview,activerelief='ridge')
        self.view_sql_Text.configure(yscrollcommand=self.view_sql_vbar.set)
        self.view_sql_vbar.place(x=565,y=5,relheight=0.99) #滚动条长度,取值在0-1之间

2.界面分模块设计

2.1 模块一(数据库选择)

 代码如下:

#数据库选择部分
        self.select_database_labelframe = tk.LabelFrame(self.init_window_name,width=1280, height=53,text="数据库选择")
        self.select_database_labelframe.place(x=10,y=2)
        self.hive_Radiobutton = Radiobutton(self.select_database_labelframe,text="hive数据库",variable=self.get_select_datebase,value='hive',command=self.select_hive_database)
        self.hive_Radiobutton.place(x=50,y=0)

        self.pg_Radiobutton = Radiobutton(self.select_database_labelframe,text="pg数据库",variable=self.get_select_datebase,value='pg',command=self.select_pg_database)
        self.pg_Radiobutton.place(x=200,y=0)
        
        self.tip_label = tk.Label(self.select_database_labelframe,width=80,height=1,fg="red", bg="yellow", font=("微软雅黑", 12,"bold"), text="提示:选择的Excel文件最好是xls格式的。如果是xlsx格式的,按钮响应时间有点慢!!!")
        self.tip_label.place(x=420,y=0)

点击选择按钮会触发command后面的函数,同时会相应的返回value值

2.2 模块一(Excel文件)

点击相应的按钮会触发command后面的函数 

 代码如下:

#excel文件模块
        #文件编辑部分
        labelframe = tk.LabelFrame(self.init_window_name,width=680, height=300, text="Excel文件")
        #labelframe.pack()
        labelframe.place(x=10,y=60)
        self.Excel_label = tk.Label(labelframe,width=10,height=1,fg='red', font=("微软雅黑", 10), text="目录路径:")
        self.Excel_label.place(x=0,y=2)
        self.Excel_path = tk.Entry(labelframe, width=60, textvariable=self.get_value)
        self.Excel_path.place(x=80,y=5)
        self.Excel_file = tk.Button(labelframe,width=23,height=1,fg='blue', text="选择Excel文件(只支持xls格式)",command=self.add_Excel_file)
        self.Excel_file.place(x=505,y=5)
        
        #表名
        self.start_row_label_location = tk.Label(labelframe,width=22,height=1,fg='red', font=("微软雅黑", 13),text="请填写表名位置信息", anchor="sw")
        self.start_row_label_location.place(x=0,y=38)
        
        self.start_row_label = tk.Label(labelframe,width=22,height=1, text="表名开始行(填写数字):")
        self.start_row_label.place(x=0,y=70)
        self.start_row = tk.Entry(labelframe, width=15, textvariable=self.get_start_row_value)
        self.start_row.place(x=160,y=70)
        self.end_row_label = tk.Label(labelframe,width=22,height=1, text="表名结束行(填写数字):")
        self.end_row_label.place(x=0,y=100)
        self.end_row = tk.Entry(labelframe, width=15, textvariable=self.get_end_row_value)
        self.end_row.place(x=160,y=100)
       
        self.start_col_label = tk.Label(labelframe,width=22,height=1, text="表名开始列(填写字母):")
        self.start_col_label.place(x=0,y=130)
        self.start_col = tk.Entry(labelframe, width=15, textvariable=self.get_start_col_value)
        self.start_col.place(x=160,y=130)
        self.end_col_label = tk.Label(labelframe,width=22,height=1, text="表名结束列(填写字母):")
        self.end_col_label.place(x=0,y=160)
        self.end_col = tk.Entry(labelframe, width=15, textvariable=self.get_end_col_value)
        self.end_col.place(x=160,y=160)
        
        #表字段
        self.start_row_label_field_location = tk.Label(labelframe,width=28,height=1,fg='red', font=("微软雅黑", 13),text="请填写表字段、注释、类型位置信息", anchor="sw")
        self.start_row_label_field_location.place(x=320,y=38)
        
        self.start_row_label_field = tk.Label(labelframe,width=24,height=1, text="表字段开始行(填写数字):")
        self.start_row_label_field.place(x=320,y=70)
        self.start_row_field = tk.Entry(labelframe, width=15, textvariable=self.get_start_row_field_value)
        self.start_row_field.place(x=494,y=70)
        self.end_row_label_field = tk.Label(labelframe,width=24,height=1, text="表字段结束行(填写数字):")
        self.end_row_label_field.place(x=320,y=100)
        self.end_row_field = tk.Entry(labelframe, width=15, textvariable=self.get_end_row_field_value)
        self.end_row_field.place(x=494,y=100)
       
        self.start_col_label_field = tk.Label(labelframe,width=24,height=1, text="表字段开始列(填写字母):")
        self.start_col_label_field.place(x=320,y=130)
        self.start_col_field = tk.Entry(labelframe, width=15, textvariable=self.get_start_col_field_value)
        self.start_col_field.place(x=494,y=130)
        self.end_col_label_field = tk.Label(labelframe,width=24,height=1, text="表字段结束列(填写字母):")
        self.end_col_label_field.place(x=320,y=160)
        self.end_col_field = tk.Entry(labelframe, width=15, textvariable=self.get_end_col_field_value)
        self.end_col_field.place(x=494,y=160)
        
        #输入sheet数字 页面改成下拉选择框
        self.sheet_label= tk.Label(labelframe,width=24,height=2,fg='green', text="请选择Excel中sheet", font=("微软雅黑", 14), anchor="sw")
        self.sheet_label.place(x=10,y=183)
        #self.sheet_value = tk.Entry(labelframe, width=15, textvariable=self.get_sheet_value)
        #self.sheet_value.place(x=10,y=245)
        self.sheet_value=ttk.Combobox(labelframe,textvariable=self.get_sheet_value)
        self.sheet_value.place(x=15,y=240)
        #self.sheet_value['value'] = ('下拉选项1', '下拉选项2', '下拉选项3', '下拉选项4')
        #self.sheet_value.current(0)
        

        
        #填写位置信息例子按钮
        self.Excel_field = tk.Button(labelframe,width=40,height=3,fg='blue', text="填写前,一定要点击我,查看位置信息格式!!!",command=self.Open_image)
        self.Excel_field.place(x=240,y=200)
        
        #查找按钮
        self.Excel_field = tk.Button(labelframe,width=17,height=3,fg='blue', text="查找表名、字段、注释",command=self.get_start_end_row_col_value)
        self.Excel_field.place(x=540,y=200)
        
        #保存文件按钮
        self.save_sql = tk.Button(labelframe,width=5,height=7,fg='blue', text="保存建表文件",wraplength=2,command=self.display_messagebox)
        self.save_sql.place(x=615,y=61)

2.3 模块一(字段列表)

 代码如下:

#list模块
        #字段显示列表LabelFrame
        self.field_labelframe = tk.LabelFrame(self.init_window_name,width=680, height=375,text="字段列表")
        self.field_labelframe.place(x=10,y=370)
        
        # 定义树形结构与滚动条
        self.field_tree = ttk.Treeview(self.field_labelframe, show="headings", columns=("a", "b", "c", "d"), height=16)
        self.vbar = Scrollbar(self.field_labelframe, orient='vertical', command=self.field_tree.yview,activerelief='ridge')
        #self.vbar.pack(side = tk.RIGHT, fill = tk.Y)
        self.field_tree.configure(yscrollcommand=self.vbar.set)
        # 表格的标题
        self.field_tree.column("a", width=100, anchor="center")
        self.field_tree.column("b", width=250, anchor="center")
        self.field_tree.column("c", width=150, anchor="center")
        self.field_tree.column("d", width=150, anchor="center")
        self.field_tree.heading("a", text="序号")
        self.field_tree.heading("b", text="字段名")
        self.field_tree.heading("c", text="字段类型",)
        self.field_tree.heading("d", text="注释")
        self.field_tree.place(x=0,y=3)
       # self.field_tree.bind("<Double-1>", self.onDBClick)
        self.vbar.place(x=653,y=3,relheight=0.99) #滚动条长度,取值在0-1之间

2.4 模块一(建表sql预览)

代码如下:

#建表sql预览模块
        self.view_sql_labelframe = tk.LabelFrame(self.init_window_name,width=590, height=685,text="建表SQL预览")
        self.view_sql_labelframe.place(x=700,y=60)
        self.view_sql_Text = tk.Text(self.view_sql_labelframe,height=50, width=80,fg='red')
        self.view_sql_Text.place(x=0,y=5)
        self.view_sql_vbar = Scrollbar(self.view_sql_labelframe, orient='vertical', command=self.view_sql_Text.yview,activerelief='ridge')
        self.view_sql_Text.configure(yscrollcommand=self.view_sql_vbar.set)
        self.view_sql_vbar.place(x=565,y=5,relheight=0.99) #滚动条长度,取值在0-1之间

3.具体函数

3.1 xlsx文件转换成xls文件

如果输入的文件是xls格式的,就不需要转换。如果输入的文件是xlsx格式,就会在原文件目录自动复制一个临时xls文件,等用户点击“保存文件”按钮后或者关闭怎么应用之后,就会删除创建的临时xls文件。具体删除代码在:点击按钮后删除代码在“保存文件”函数中,关闭应用删除代码在main函数中。

def xlsx_to_xls(self,fname, export_name, delete_flag=False):
        """
        将xlsx文件转化为xls文件
        :param fname: 传入待转换的文件路径(可传绝对路径,也可传入相对路径,都可以)
        :param export_name: 传入转换后到哪个目录下的路径(可传绝对路径,也可传入相对路径,都可以)
        :param delete_flag: 转换成功后,是否删除原来的xlsx的文件,默认删除 布尔类型
        :return:    无返回值
        """
        excel = win32.gencache.EnsureDispatch('Excel.Application')
        excel.Visible = False
        excel.DisplayAlerts = False
        absolute_path = os.path.join(os.path.dirname(os.path.abspath(fname)), os.path.basename(fname))
        save_path = os.path.join(os.path.dirname(os.path.abspath(export_name)), os.path.basename(export_name))
        wb = excel.Workbooks.Open(absolute_path)
        wb.SaveAs(save_path, FileFormat=56)  # FileFormat = 51 is for .xlsx extension
        wb.Close()  # FileFormat = 56 is for .xls extension
        excel.Application.Quit()
        if delete_flag:
            os.remove(absolute_path)

3.2  添加文件目录

 def add_Excel_file(self):      
        try:
            filename = tkinter.filedialog.askopenfilename(title=u'打开文件')
            self.clear_entry()#清空内容
            #清空list
            self.clear_tree_value(self.field_tree)
            #清除text内容
            self.clear_text_value(self.view_sql_Text)
            if filename!='': #如果关闭选择窗口会返回一个空值
                if str(os.path.splitext(filename)[-1])=='.xlsx': #如果选择的文件为xlsx文件,就需要转换成xls文件
                    #get_value.set(filename)
                    #print('文件名为%s'%filename)
                    self.random_string=self.create_string_number(8)#随机生成6位字符串
                    self.filename_dir=os.path.dirname(filename)#获取文件目录路径
                    #print('文件为%s'%self.filename_dir)
                    fname_path=filename
                    export_name_path=self.filename_dir+str()
                    #转换后的新xls文件名    
                    self.filename_xls=str(os.path.splitext(filename)[0])+'_'+str(self.random_string)+'.xls'
                    #转换函数
                    self.xlsx_to_xls(fname=fname_path, export_name=self.filename_xls, delete_flag=False)
    
                    self.get_value.set(filename) #entry标签设置内容
                    self.file_path =self.filename_xls #获取文件路径内容,后面打开文件的路径是用这个路径
                    self.delete_xlsx_trans_xls_token='delete_xls' #标识符号,为了后面删除新建xls文件
                    self.delete_xlsx_trans_xls_list.append(self.filename_xls) #如果生成多个xls文件,就把他放入list,方便后期删除文件
            
                    #这里打开excel文件主要是为了获取sheet,为了下拉框数据
                    data=self.OpenExcelFile(self.file_path)
                    #获取sheet名称
                    sheetName= data.sheet_names()#获取excel所有的sheet
                    #print(sheetName)
                    self.sheet_value['value'] = sheetName#下拉框内容
                    self.sheet_value.current(0)#默认设置显示第一个
                elif str(os.path.splitext(filename)[-1])=='.xls':#文件为xls文件,就不需要转换
                    #get_value.set(filename)
                    #print('文件名为%s'%filename)
                    self.filename_dir=os.path.dirname(filename)#获取文件目录路径
                    #print('文件为%s'%self.filename_dir)
    
                    self.get_value.set(filename) #entry标签设置内容
                    self.file_path = self.get_value.get() #获取文件路径内容,后面打开文件的路径是用这个路径
                    self.delete_xlsx_trans_xls_token='not_delete_xls' #标识符号
                    
                    #这里打开excel文件主要是为了获取sheet,为了下拉框数据
                    data=self.OpenExcelFile(filename)
                    #获取sheet名称
                    sheetName= data.sheet_names()#获取excel所有的sheet
                    #print(sheetName)
                    self.sheet_value['value'] = sheetName#下拉框内容
                    self.sheet_value.current(0)#默认设置显示第一个
        except Exception as e:
            self.clear_entry()#清空内容
            #清空list
            self.clear_tree_value(self.field_tree)
            #清除text内容
            self.clear_text_value(self.view_sql_Text)
            self.display_messagebox_error_success('打开Excel文件','打开失败,报错信息为:'+str(e))

3.3  获取sheet、行列数

 def get_start_end_row_col_value(self):
        #print('开始行为%s,结束行为%s,开始列为%s,结束列为%s'%(self.start_row.get(),self.end_row.get(),self.start_col.get(),self.end_col.get()))
        #表名称位置
        self.start_row_value=self.start_row.get()
        success_start_row_value=re.match('^[1-9]{1}$|^[0-9]{2,}$',self.start_row_value)
        self.end_row_value=self.end_row.get()
        success_end_row_value=re.match('^[1-9]{1}$|^[0-9]{2,}$',self.end_row_value)
        self.start_col_value=self.start_col.get()
        success_start_col_value=re.match('^[a-zA-Z]{1}$|^[a-zA-Z]{1}\d+$',self.start_col_value)
        self.end_col_value=self.end_col.get()
        success_end_col_value=re.match('^[a-zA-Z]{1}$|^[a-zA-Z]{1}\d+$',self.end_col_value)
        
        #表名字段位置
        self.start_row_field_value=self.start_row_field.get()
        success_start_row_field_value=re.match('^[1-9]{1}$|^[0-9]{2,}$',self.start_row_field_value)
        self.end_row_field_value=self.end_row_field.get()
        success_end_row_field_value=re.match('^[1-9]{1}$|^[0-9]{2,}$',self.end_row_field_value)
        self.start_col_field_value=self.start_col_field.get()
        success_start_col_field_value=re.match('^[a-zA-Z]{1}$|^[a-zA-Z]{1}\d+$',self.start_col_field_value)
        self.end_col_field_value=self.end_col_field.get()
        success_end_col_field_value=re.match('^[a-zA-Z]{1}$|^[a-zA-Z]{1}\d+$',self.end_col_field_value)
        #print(self.file_path)
        #Excel的sheet
        self.sheet_value_number=self.sheet_value.get()
        #success_sheet_value_number=re.match('^[1-9]{1}$|^[0-9]{2,}$',self.sheet_value_number)
        
        if success_start_row_value!=None and success_end_row_value!=None and success_start_col_value!=None and success_end_col_value!=None and success_start_row_field_value!=None and success_end_row_field_value!=None and success_start_col_field_value!=None and success_end_col_field_value!=None:
            #输入的位置信息符合规范,才继续执行查找数据
            #根据行列数获取具体数据
             self.Get_Excel_value('success')
        else:
            #输入的位置信息符合不规范
            if success_start_row_value==None:
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名开始行数不规范,应该填写数字(填写的数字要大于等于1)')
            elif success_end_row_value==None :
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名结束行数不规范,应该填写数字(填写的数字要大于等于1)')
            elif success_start_col_value==None :
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名开始列数不规范,应该填写字母(例如a、a1、A、A1)')
            elif success_end_col_value==None :
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名结束列数不规范,应该填写字母(例如a、a1、A、A1)')
                
            elif success_start_row_field_value==None :
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名、字段、注释开始行数不规范,应该填写数字(填写的数字要大于等于1)')
            elif success_end_row_field_value==None :
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名、字段、注释开始行数不规范,应该填写数字(填写的数字要大于等于1)')
            elif success_start_col_field_value==None :
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名、字段、注释开始列数不规范,应该填写字母(例如a、a1、A、A1)')
            elif success_end_col_field_value==None :
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名、字段、注释结束列数不规范,应该填写字母(例如a、a1、A、A1)')

3.4  获取表名称

def GetExcel_TableName(self,data,sheet_name,TableName_row_start,TableName_row_end,TableName_column_start,TableName_column_end):
        try:
            # 根据sheet_name下标选择读取内容
            sheetvalue = data.sheet_by_name(sheet_name)
            #将输入的列名号转换成数字列号
            column_start_number=Col2Int(TableName_column_start.upper())
            column_end_number=Col2Int(TableName_column_end.upper())
            if int(TableName_row_start)<=int(TableName_row_end):
                #开始行小于等于结束行
                if column_start_number<=column_end_number:
                    #开始列小于等于结束列
                    #取表名
                    TableName_dict={}#用于存放表名及注释
                    TableName=sheetvalue.row_values(int(TableName_row_start)-1,int(column_start_number)-1,int(column_end_number))[0]
                    TableName_dict[TableName]=sheet_name
                    #print(TableName_dict)
                    return TableName_dict
                else:
                    return '表名开始列和结束列顺序填写错误,开始列应该在结束列前面。'
                
            else:
                return '表名开始行和结束行顺序填写错误,开始行应该小于等于结束行。'
        except Exception as e: 
            return '查找表名称失败,原因:'+str(e)+' ,请查看开始行、结束行、开始列、结束列是否填写正确!!'
        

3.5 获取字段、类型、注释

def GetExcel_TableField(self,data,sheet_name,TableField_row_start,TableField_row_end,TableField_column_start,TableField_column_end):
        try:
            # 根据sheet_name下标选择读取内容
            sheetvalue = data.sheet_by_name(sheet_name)
            
            #将输入的列名号转换成数字列号
            column_start_number=Col2Int(TableField_column_start.upper())
            column_end_number=Col2Int(TableField_column_end.upper())
            if int(TableField_row_start)<=int(TableField_row_end):
                #开始行小于等于结束行
                if column_end_number-column_start_number+1==3 and column_end_number>=column_start_number:
                    #获取表字段、类型、注释列数有3列
                    #取表字段及注释
                    TableField_dict={} #建立一个字典存放字段名称和注释
                    TableField_dict1={} #建立一个字典存放字段名称和字段类型
                    for i in range(int(TableField_row_start),int(TableField_row_end)+1):
                        TableFieldName=sheetvalue.row_values(i-1,column_start_number-1,column_end_number)[0]
                        TableFieldComment=sheetvalue.row_values(i-1,column_start_number-1,column_end_number)[1]
                        TableFieldKind=sheetvalue.row_values(i-1,column_start_number-1,column_end_number)[2]
                        if TableFieldName!='': #表名称为空的值,不放入字典中
                            TableField_dict[TableFieldName]=TableFieldComment
                            TableField_dict1[TableFieldName]=TableFieldKind
                        #print('表内容为%s' %(TableField_dict))
                    #del TableField_dict['']#删除表名称为空的值
                    #del TableField_dict1['']#删除表名称为空的值
                    

                    return TableField_dict,TableField_dict1
                else:
                    #self.display_messagebox_error_success('填写sheet不规范','填写的sheet不规范,应该填写数字(填写的数字要大于等于1)')
                    return '字段、类型、注释列数不对,应该要有3列。','字段、类型、注释列数不对,应该要有3列。'
            else:
                return '表字段、类型、注释开始行和结束行顺序填写错误,开始行应该小于等于结束行。','表字段、类型、注释开始行和结束行顺序填写错误,开始行应该小于等于结束行。'
                             
        except Exception as e:
            print('错误信息:eeeee%s'%e)
            return '查找字段、类型、注释失败,原因:'+str(e)+' ,请查看开始行、结束行、开始列、结束列是否填写正确!!','查找表字段及注释失败,原因:'+str(e)+' ,请查看开始行、结束行、开始列、结束列是否填写正确!!'
     

3.6 根据sheet、列数获取具体数据

 #根据sheet、列数获取具体数据
    def Get_Excel_value(self,successinfo):    
        filename=self.file_path #获取路径必须在mainloop后面,这个file_path在class定义必须要加self

        #打开excel获取数据
        data=self.OpenExcelFile(filename)
        #获取表名
        self.TableName_dict=self.GetExcel_TableName(data,self.sheet_value_number,self.start_row_value,self.end_row_value,self.start_col_value,self.end_col_value)
        if isinstance(self.TableName_dict,dict): 
            #获取名称成功
            #获取字段、类型、注释
            self.TableField_dict,self.TableField_dict1=self.GetExcel_TableField(data,self.sheet_value_number,self.start_row_field_value,self.end_row_field_value,self.start_col_field_value,self.end_col_field_value)
            if isinstance(self.TableField_dict,dict) and isinstance(self.TableField_dict1,dict):
                #获取字段、类型、注释成功
                #字段信息list显示
                self.show_field_list(self.TableField_dict,self.TableField_dict1)
                #for index, wifi_info in enumerate(TableField_dict):
                    #print('index为%s,wifi_info为%s'%(index, wifi_info ))
                    
                if self.mark_hive_pg_datebase=='hive':
                    try:
                        #print('这边走%s:'%self.mark_hive_pg_datebase)
                        #创建表头、表尾写法
                        self.tablename,self.string_CreateSql_1,self.string_CreateSql_3=self.CreateTableSql_1_3(self.TableName_dict,self.mark_hive_pg_datebase)
                        #创建表中写法
                        self.string_CreateSql_2,string_CreateSql_4=self.CreateTableSql_2(self.TableField_dict,self.TableField_dict1,'','',self.mark_hive_pg_datebase)
                
                        #整个建表语句写法
                        self.string_whole_CreateTableName=self.string_CreateSql_1+"\n"+self.string_CreateSql_2+"\n"+self.string_CreateSql_3
                        #print(string_whole_CreateTableName)
                        
                        #如果编写sql语句成功,返回一个标识符。
                        self.createSql_token='succrss_create_sql'
                    except Exception as e:
                        self.display_messagebox_error_success('查找表名、字段、注释','程序编辑sql语句失败')
                    
                    
                elif self.mark_hive_pg_datebase=='pg':
                    try:
                        #print('这边走%s:'%self.mark_hive_pg_datebase)
                        #创建表头、表尾写法
                        self.tablename,self.string_CreateSql_1,self.string_CreateSql_3=self.CreateTableSql_1_3(self.TableName_dict,self.mark_hive_pg_datebase)
                        #创建表中写法
                        self.string_CreateSql_2,string_CreateSql_4=self.CreateTableSql_2(self.TableField_dict,self.TableField_dict1,self.TableName_dict,self.tablename,self.mark_hive_pg_datebase)
                
                        #整个建表语句写法
                        self.string_whole_CreateTableName=self.string_CreateSql_1+"\n"+self.string_CreateSql_2+"\n"+self.string_CreateSql_3+"\n"+string_CreateSql_4
                        #print(string_whole_CreateTableName)
                        
                        #如果编写sql语句成功,返回一个标识符。
                        self.createSql_token='succrss_create_sql'
                    except Exception as e:
                        self.display_messagebox_error_success('查找表名、字段、注释','程序编辑sql语句失败')
                    
                    
                #将sql语句放入text预览,先清除text内容
                self.clear_text_value(self.view_sql_Text)
                self.view_sql_Text.insert('end', self.string_whole_CreateTableName)
                
            else:
                #获取字段、类型、注释失败
                #获取字段、类型、注释失败,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('查找表名、字段、注释',self.TableField_dict)
        else:
            #获取表名称失败
            #获取表名称失败,弹窗之前,先把text、treelist信息删除
            self.clear_tree_value(self.field_tree)
            self.clear_text_value(self.view_sql_Text)
            self.display_messagebox_error_success('查找表名、字段、注释',self.TableName_dict)

3.7 保存建表文件 

#保存建表文件            保存文件目录路径
    def Save_sql_file(self,file_save_path):
        #sql语句写入文件中
        try:
            ack_success=''
            #print('self.createSql_token为%s'%self.createSql_token)
            if file_save_path!='' and self.createSql_token=='succrss_create_sql':
                #print('进去保存流程self.createSql_token为%s'%self.createSql_token)
                self.sql_filename=str(self.tablename)+'.sql'
                if os.path.isfile(self.sql_filename):#判断文件是否存在
                    os.remove(self.sql_filename)#删除文件
                    #print('文件存在,'+str(self.sql_filename)+'删除成功')
                    with open(file_save_path+'/'+self.sql_filename,'w+',encoding='UTF-8') as file:
                        file.write(self.string_whole_CreateTableName)
                        file.close()
                        ack_success='success'
                        self.createSql_token='false_create_sql'
                        return ack_success
                else: #不存在
                    #print('文件不存在,'+str(self.sql_filename)+',可以创建')
                    with open(file_save_path+'/'+self.sql_filename,'w+',encoding='UTF-8') as file:
                        file.write(self.string_whole_CreateTableName)
                        file.close()
                        ack_success='success'
                        self.createSql_token='false_create_sql'
                        return ack_success
            else:
                self.display_messagebox_error_success('保存文件','请输入文件位置信息查询后,再点击保存!!')
                
        except Exception as e:
            return 'false'

3.8 弹窗模块

   
    #弹窗模块
    def display_messagebox_error_success(self,success_error_title,success_error_info):
        tk.messagebox.showinfo(title=str(success_error_title),message=str(success_error_info))
        

、 将代码打包成exe应用

我这里使用的是Anaconda3打包。

#创建虚拟环境 (有没有创建成功,可以在安装目录:D:\Anaconda3\envs())
conda create -n excel python=3.6

#激活虚拟环境 
conda activate excel

#Pyinstaller打包
Pyinstaller -F -w -i apple.ico Hive_CreateSQL.py

五、全部代码

# -*- coding: utf-8 -*-
"""
Created on Sun Oct  9 18:00:06 2022

@author: Administrator
"""

import xlrd
from openpyxl.utils import column_index_from_string as Col2Int
import tkinter as tk
from tkinter import ttk
from tkinter import *
import os
import re
import shutil
import random
import string
import win32com.client as win32

import tkinter.filedialog  # 在Gui中打开文件浏览
import tkinter.messagebox  # 打开tkiner的消息提醒框

from PIL import Image


'''
row_values(row,col1,col2)  第row行,第col1列到col2列,不包括col2列
cell(row,col) 第row行,第col1列
col_values(col,row1,row2) 取第col列, 第row1行到row2行 不包括row2行

# 获取到表的总行数
#nrows = sheet.nrows
#for i in range(nrows):
    #print(sheet.row_values(i))
'''

class Excel_GUI():
    def __init__(self, init_window_name): #以下self结果是class返回的结果
        self.init_window_name = init_window_name
        
        #数据库选择
        self.get_select_datebase = tk.StringVar()  # 设置可变内容
        self.get_select_datebase.set('hive') #单选按钮默认选择hive按钮
        self.mark_hive_pg_datebase='hive' #默认设置成hive
        
        # Excel文件路径
        self.get_value = tk.StringVar()  # 设置可变内容
        #表名称
        self.get_start_row_value = tk.StringVar()  # 设置可变内容
        self.get_end_row_value = tk.StringVar()  # 设置可变内容
        self.get_start_col_value = tk.StringVar()  # 设置可变内容
        self.get_end_col_value = tk.StringVar()  # 设置可变内容
        #表字段
        self.get_start_row_field_value = tk.StringVar()  # 设置可变内容
        self.get_end_row_field_value = tk.StringVar()  # 设置可变内容
        self.get_start_col_field_value = tk.StringVar()  # 设置可变内容
        self.get_end_col_field_value = tk.StringVar()  # 设置可变内容
        #sheet数字
        self.get_sheet_value = tk.StringVar()  # 设置可变内容
        #self.filename={}
        #如果编写sql语句成功,返回一个标识符。
        self.createSql_token=''
        
        #输入文件是xlsx格式,给一个标识符
        self.delete_xlsx_trans_xls_token=''
        self.delete_xlsx_trans_xls_list=[]
       
    


    
    #打开excel文件
    def OpenExcelFile(self,filename):
        # 打开excel读取文件
        data = xlrd.open_workbook(filename)
        return data
    
    #取表名
    def GetExcel_TableName(self,data,sheet_name,TableName_row_start,TableName_row_end,TableName_column_start,TableName_column_end):
        try:
            # 根据sheet_name下标选择读取内容
            sheetvalue = data.sheet_by_name(sheet_name)
            #将输入的列名号转换成数字列号
            column_start_number=Col2Int(TableName_column_start.upper())
            column_end_number=Col2Int(TableName_column_end.upper())
            if int(TableName_row_start)<=int(TableName_row_end):
                #开始行小于等于结束行
                if column_start_number<=column_end_number:
                    #开始列小于等于结束列
                    #取表名
                    TableName_dict={}#用于存放表名及注释
                    TableName=sheetvalue.row_values(int(TableName_row_start)-1,int(column_start_number)-1,int(column_end_number))[0]
                    TableName_dict[TableName]=sheet_name
                    #print(TableName_dict)
                    return TableName_dict
                else:
                    return '表名开始列和结束列顺序填写错误,开始列应该在结束列前面。'
                
            else:
                return '表名开始行和结束行顺序填写错误,开始行应该小于等于结束行。'
        except Exception as e: 
            return '查找表名称失败,原因:'+str(e)+' ,请查看开始行、结束行、开始列、结束列是否填写正确!!'
        
        
    #获取字段、类型、注释
    def GetExcel_TableField(self,data,sheet_name,TableField_row_start,TableField_row_end,TableField_column_start,TableField_column_end):
        try:
            # 根据sheet_name下标选择读取内容
            sheetvalue = data.sheet_by_name(sheet_name)
            
            #将输入的列名号转换成数字列号
            column_start_number=Col2Int(TableField_column_start.upper())
            column_end_number=Col2Int(TableField_column_end.upper())
            if int(TableField_row_start)<=int(TableField_row_end):
                #开始行小于等于结束行
                if column_end_number-column_start_number+1==3 and column_end_number>=column_start_number:
                    #获取表字段、类型、注释列数有3列
                    #取表字段及注释
                    TableField_dict={} #建立一个字典存放字段名称和注释
                    TableField_dict1={} #建立一个字典存放字段名称和字段类型
                    for i in range(int(TableField_row_start),int(TableField_row_end)+1):
                        TableFieldName=sheetvalue.row_values(i-1,column_start_number-1,column_end_number)[0]
                        TableFieldComment=sheetvalue.row_values(i-1,column_start_number-1,column_end_number)[1]
                        TableFieldKind=sheetvalue.row_values(i-1,column_start_number-1,column_end_number)[2]
                        if TableFieldName!='': #表名称为空的值,不放入字典中
                            TableField_dict[TableFieldName]=TableFieldComment
                            TableField_dict1[TableFieldName]=TableFieldKind
                        #print('表内容为%s' %(TableField_dict))
                    #del TableField_dict['']#删除表名称为空的值
                    #del TableField_dict1['']#删除表名称为空的值
                    

                    return TableField_dict,TableField_dict1
                else:
                    #self.display_messagebox_error_success('填写sheet不规范','填写的sheet不规范,应该填写数字(填写的数字要大于等于1)')
                    return '字段、类型、注释列数不对,应该要有3列。','字段、类型、注释列数不对,应该要有3列。'
            else:
                return '表字段、类型、注释开始行和结束行顺序填写错误,开始行应该小于等于结束行。','表字段、类型、注释开始行和结束行顺序填写错误,开始行应该小于等于结束行。'
                             
        except Exception as e:
            print('错误信息:eeeee%s'%e)
            return '查找字段、类型、注释失败,原因:'+str(e)+' ,请查看开始行、结束行、开始列、结束列是否填写正确!!','查找表字段及注释失败,原因:'+str(e)+' ,请查看开始行、结束行、开始列、结束列是否填写正确!!'
     
    #创建表头、表尾写法           表名:表注释
    def CreateTableSql_1_3(self,dict_name,Select_database):
        #print('创建表头、表尾为:%s'%Select_database)
        if Select_database=='hive':
            #hive表头、表尾写法
            for key,value in dict_name.items():
                string_CreateSql_1='CREATE TABLE IF NOT EXISTS '+str(key)+'('
                string_CreateSql_3=")\nCOMMENT '"+str(value)+"'\nROW FORMAT DELIMITED FIELDS TERMINATED BY '\\u001' STORED AS ORCFILE;"
                #print(string_CreateSql_3
                return key,string_CreateSql_1,string_CreateSql_3
        
        elif Select_database=='pg':
            #pg表头、表尾写法
            for key,value in dict_name.items():
                string_CreateSql_1="CREATE TABLE "+str(key)+" ("
                string_CreateSql_3=");"
                #print(string_CreateSql_3
                return key,string_CreateSql_1,string_CreateSql_3
    
    #创建表中写法              字段:注释  字段:字段类型 表名:表注释  表名
    def CreateTableSql_2(self,dict_name,dict_name1,dict_tablename,tablename,Select_database):
        #print('创建表中为:%s'%Select_database)
        if Select_database=='hive':
            #hive表中写法
            string_CreateSql_2=""
            dict_length=1
            for key,value in dict_name.items():
                if dict_length==len(dict_name): #最后一个字段末尾不需要加逗号
                    string_CreateSql_2=string_CreateSql_2+"\t"+str(key)+" "+str(dict_name1[key])+" COMMENT '"+str(value)+"'"
                else:
                    string_CreateSql_2=string_CreateSql_2+"\t"+str(key)+" "+str(dict_name1[key])+" COMMENT '"+str(value)+"',\n"
                    dict_length=dict_length+1
            return string_CreateSql_2,''
        elif Select_database=='pg':
            #pg表中写法
            string_CreateSql_2="" #表字段加字段类型部分 如batch_id varchar(500) 
            string_CreateSql_4="" #表字段注释加表注释
            dict_length=1
            for key,value in dict_name1.items():
                if dict_length==len(dict_name1): #最后一个字段末尾不需要加逗号
                    string_CreateSql_2=string_CreateSql_2+"\t"+str(key)+" "+str(dict_name1[key])
                else:
                    string_CreateSql_2=string_CreateSql_2+"\t"+str(key)+" "+str(dict_name1[key])+",\n"
                    dict_length=dict_length+1
            for key,value in dict_name.items():
                string_CreateSql_4=string_CreateSql_4+"COMMENT ON COLUMN "+str(tablename)+"."+str(key)+" IS '"+str(value)+"';\n"
            string_CreateSql_4=string_CreateSql_4+"\nCOMMENT ON TABLE "+str(tablename)+" IS '"+str(dict_tablename[tablename])+"';"
            return string_CreateSql_2,string_CreateSql_4
    
    
    #将xlsx文件转化为xls文件
    def xlsx_to_xls(self,fname, export_name, delete_flag=False):
        """
        将xlsx文件转化为xls文件
        :param fname: 传入待转换的文件路径(可传绝对路径,也可传入相对路径,都可以)
        :param export_name: 传入转换后到哪个目录下的路径(可传绝对路径,也可传入相对路径,都可以)
        :param delete_flag: 转换成功后,是否删除原来的xlsx的文件,默认删除 布尔类型
        :return:    无返回值
        """
        excel = win32.gencache.EnsureDispatch('Excel.Application')
        excel.Visible = False
        excel.DisplayAlerts = False
        absolute_path = os.path.join(os.path.dirname(os.path.abspath(fname)), os.path.basename(fname))
        save_path = os.path.join(os.path.dirname(os.path.abspath(export_name)), os.path.basename(export_name))
        wb = excel.Workbooks.Open(absolute_path)
        wb.SaveAs(save_path, FileFormat=56)  # FileFormat = 51 is for .xlsx extension
        wb.Close()  # FileFormat = 56 is for .xls extension
        excel.Application.Quit()
        if delete_flag:
            os.remove(absolute_path)

                      
    # 添加文件目录
    def add_Excel_file(self):      
        try:
            filename = tkinter.filedialog.askopenfilename(title=u'打开文件')
            self.clear_entry()#清空内容
            #清空list
            self.clear_tree_value(self.field_tree)
            #清除text内容
            self.clear_text_value(self.view_sql_Text)
            if filename!='': #如果关闭选择窗口会返回一个空值
                if str(os.path.splitext(filename)[-1])=='.xlsx': #如果选择的文件为xlsx文件,就需要转换成xls文件
                    #get_value.set(filename)
                    #print('文件名为%s'%filename)
                    self.random_string=self.create_string_number(8)#随机生成6位字符串
                    self.filename_dir=os.path.dirname(filename)#获取文件目录路径
                    #print('文件为%s'%self.filename_dir)
                    fname_path=filename
                    export_name_path=self.filename_dir+str()
                    #转换后的新xls文件名    
                    self.filename_xls=str(os.path.splitext(filename)[0])+'_'+str(self.random_string)+'.xls'
                    #转换函数
                    self.xlsx_to_xls(fname=fname_path, export_name=self.filename_xls, delete_flag=False)
    
                    self.get_value.set(filename) #entry标签设置内容
                    self.file_path =self.filename_xls #获取文件路径内容,后面打开文件的路径是用这个路径
                    self.delete_xlsx_trans_xls_token='delete_xls' #标识符号,为了后面删除新建xls文件
                    self.delete_xlsx_trans_xls_list.append(self.filename_xls) #如果生成多个xls文件,就把他放入list,方便后期删除文件
            
                    #这里打开excel文件主要是为了获取sheet,为了下拉框数据
                    data=self.OpenExcelFile(self.file_path)
                    #获取sheet名称
                    sheetName= data.sheet_names()#获取excel所有的sheet
                    #print(sheetName)
                    self.sheet_value['value'] = sheetName#下拉框内容
                    self.sheet_value.current(0)#默认设置显示第一个
                elif str(os.path.splitext(filename)[-1])=='.xls':#文件为xls文件,就不需要转换
                    #get_value.set(filename)
                    #print('文件名为%s'%filename)
                    self.filename_dir=os.path.dirname(filename)#获取文件目录路径
                    #print('文件为%s'%self.filename_dir)
    
                    self.get_value.set(filename) #entry标签设置内容
                    self.file_path = self.get_value.get() #获取文件路径内容,后面打开文件的路径是用这个路径
                    self.delete_xlsx_trans_xls_token='not_delete_xls' #标识符号
                    
                    #这里打开excel文件主要是为了获取sheet,为了下拉框数据
                    data=self.OpenExcelFile(filename)
                    #获取sheet名称
                    sheetName= data.sheet_names()#获取excel所有的sheet
                    #print(sheetName)
                    self.sheet_value['value'] = sheetName#下拉框内容
                    self.sheet_value.current(0)#默认设置显示第一个
        except Exception as e:
            self.clear_entry()#清空内容
            #清空list
            self.clear_tree_value(self.field_tree)
            #清除text内容
            self.clear_text_value(self.view_sql_Text)
            self.display_messagebox_error_success('打开Excel文件','打开失败,报错信息为:'+str(e))
        '''
        self.random_string=self.create_string_number(6)#随机生成6位字符串
        self.filename_dir=os.path.dirname(filename)
        if str(os.path.splitext(filename)[-1])=='.xlsx':
            self.filename_xls=str(os.path.splitext(filename)[0:-1][0])+'_'+str(self.random_string)+'.xls'
            #shutil.copyfile(filename,self.filename_dir)#根据xlsx文件创建xls文件
            self.a="copy "+str(filename)+' '+str(self.filename_xls)
            os.popen(self.a)
            
            print('1111111111')
        elif str(os.path.splitext(filename)[-1])=='.xls':
            print('22222222222')
            self.filename_xlsx=filename
            #os.remove(self.filename_xls)#删除文件
        self.get_value.set(filename) #entry标签设置内容
        self.file_path = self.get_value.get() #获取路径内容

        #这里打开excel文件主要是为了获取sheet,为了下拉框数据
        
        
        data=self.OpenExcelFile(self.filename_xls)
        #获取sheet名称
        sheetName= data.sheet_names()#获取excel所有的sheet
        #print(sheetName)
        self.sheet_value['value'] = sheetName#下拉框内容
        self.sheet_value.current(0)#默认设置显示第一个
        '''
        
       # self.init_window_name.destory()

        
    #获取sheet、行列数
    def get_start_end_row_col_value(self):
        #print('开始行为%s,结束行为%s,开始列为%s,结束列为%s'%(self.start_row.get(),self.end_row.get(),self.start_col.get(),self.end_col.get()))
        #表名称位置
        self.start_row_value=self.start_row.get()
        success_start_row_value=re.match('^[1-9]{1}$|^[0-9]{2,}$',self.start_row_value)
        self.end_row_value=self.end_row.get()
        success_end_row_value=re.match('^[1-9]{1}$|^[0-9]{2,}$',self.end_row_value)
        self.start_col_value=self.start_col.get()
        success_start_col_value=re.match('^[a-zA-Z]{1}$|^[a-zA-Z]{1}\d+$',self.start_col_value)
        self.end_col_value=self.end_col.get()
        success_end_col_value=re.match('^[a-zA-Z]{1}$|^[a-zA-Z]{1}\d+$',self.end_col_value)
        
        #表名字段位置
        self.start_row_field_value=self.start_row_field.get()
        success_start_row_field_value=re.match('^[1-9]{1}$|^[0-9]{2,}$',self.start_row_field_value)
        self.end_row_field_value=self.end_row_field.get()
        success_end_row_field_value=re.match('^[1-9]{1}$|^[0-9]{2,}$',self.end_row_field_value)
        self.start_col_field_value=self.start_col_field.get()
        success_start_col_field_value=re.match('^[a-zA-Z]{1}$|^[a-zA-Z]{1}\d+$',self.start_col_field_value)
        self.end_col_field_value=self.end_col_field.get()
        success_end_col_field_value=re.match('^[a-zA-Z]{1}$|^[a-zA-Z]{1}\d+$',self.end_col_field_value)
        #print(self.file_path)
        #Excel的sheet
        self.sheet_value_number=self.sheet_value.get()
        #success_sheet_value_number=re.match('^[1-9]{1}$|^[0-9]{2,}$',self.sheet_value_number)
        
        if success_start_row_value!=None and success_end_row_value!=None and success_start_col_value!=None and success_end_col_value!=None and success_start_row_field_value!=None and success_end_row_field_value!=None and success_start_col_field_value!=None and success_end_col_field_value!=None:
            #输入的位置信息符合规范,才继续执行查找数据
            #根据行列数获取具体数据
             self.Get_Excel_value('success')
        else:
            #输入的位置信息符合不规范
            if success_start_row_value==None:
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名开始行数不规范,应该填写数字(填写的数字要大于等于1)')
            elif success_end_row_value==None :
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名结束行数不规范,应该填写数字(填写的数字要大于等于1)')
            elif success_start_col_value==None :
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名开始列数不规范,应该填写字母(例如a、a1、A、A1)')
            elif success_end_col_value==None :
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名结束列数不规范,应该填写字母(例如a、a1、A、A1)')
                
            elif success_start_row_field_value==None :
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名、字段、注释开始行数不规范,应该填写数字(填写的数字要大于等于1)')
            elif success_end_row_field_value==None :
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名、字段、注释开始行数不规范,应该填写数字(填写的数字要大于等于1)')
            elif success_start_col_field_value==None :
                #信息不规范,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名、字段、注释开始列数不规范,应该填写字母(例如a、a1、A、A1)')
            elif success_end_col_field_value==None :
                self.display_messagebox_error_success('填写位置信息不规范','填写的表名、字段、注释结束列数不规范,应该填写字母(例如a、a1、A、A1)')
                

    
    #清空list   
    def clear_tree_value(self,treelist):
        tree_value=treelist.get_children()#返回结果是元组
        #print(type(tree_value))
        for item in tree_value:  #或者用这种写法[your_treeview.delete(item) for item in items]
            treelist.delete(item)
        
    #清空text 
    def clear_text_value(self,text):
        text.delete('0.0', END) #从第一行第一列开始删除
        
    #清空目录、填写的位置信息
    def clear_entry(self):
        self.Excel_path.delete(0, END)
        self.start_row.delete(0, END)
        self.end_row.delete(0, END)
        self.start_col.delete(0, END)
        self.end_col.delete(0, END)
        self.start_row_field.delete(0, END)
        self.end_row_field.delete(0, END)
        self.start_col_field.delete(0, END)
        self.end_col_field.delete(0, END)
        self.sheet_value.delete(0, END)
    
    # 显示字段列表
    def show_field_list(self, TableField_dict,TableField_dict1):
        #插入list前,先清空列表
        self.clear_tree_value(self.field_tree)
        #tree_value=self.field_tree.get_children()#返回结果是元组
        #for item in tree_value:  #或者用这种写法[your_treeview.delete(item) for item in items]
         #   self.field_tree.delete(item)
        
        #往列表中插入值
        for index, field in enumerate(TableField_dict):
            self.field_tree.insert("", 'end', values=(index + 1,field,TableField_dict1[field],TableField_dict[field]))
    
    
        #再次判断list是否有数据,如果有数据说明查找成功,没有就是失败。
        if self.field_tree.get_children():
            #不为空
            #tk.messagebox.showinfo(title='查找字段和注释',message='查找成功,请核对表信息')  # 消息提醒弹窗,点击确定返回值为 ok
            self.display_messagebox_error_success('查找字段和注释','查找成功,请核对表信息')
        

    #根据sheet、列数获取具体数据
    def Get_Excel_value(self,successinfo):    
        filename=self.file_path #获取路径必须在mainloop后面,这个file_path在class定义必须要加self

        #打开excel获取数据
        data=self.OpenExcelFile(filename)
        #获取表名
        self.TableName_dict=self.GetExcel_TableName(data,self.sheet_value_number,self.start_row_value,self.end_row_value,self.start_col_value,self.end_col_value)
        if isinstance(self.TableName_dict,dict): 
            #获取名称成功
            #获取字段、类型、注释
            self.TableField_dict,self.TableField_dict1=self.GetExcel_TableField(data,self.sheet_value_number,self.start_row_field_value,self.end_row_field_value,self.start_col_field_value,self.end_col_field_value)
            if isinstance(self.TableField_dict,dict) and isinstance(self.TableField_dict1,dict):
                #获取字段、类型、注释成功
                #字段信息list显示
                self.show_field_list(self.TableField_dict,self.TableField_dict1)
                #for index, wifi_info in enumerate(TableField_dict):
                    #print('index为%s,wifi_info为%s'%(index, wifi_info ))
                    
                if self.mark_hive_pg_datebase=='hive':
                    try:
                        #print('这边走%s:'%self.mark_hive_pg_datebase)
                        #创建表头、表尾写法
                        self.tablename,self.string_CreateSql_1,self.string_CreateSql_3=self.CreateTableSql_1_3(self.TableName_dict,self.mark_hive_pg_datebase)
                        #创建表中写法
                        self.string_CreateSql_2,string_CreateSql_4=self.CreateTableSql_2(self.TableField_dict,self.TableField_dict1,'','',self.mark_hive_pg_datebase)
                
                        #整个建表语句写法
                        self.string_whole_CreateTableName=self.string_CreateSql_1+"\n"+self.string_CreateSql_2+"\n"+self.string_CreateSql_3
                        #print(string_whole_CreateTableName)
                        
                        #如果编写sql语句成功,返回一个标识符。
                        self.createSql_token='succrss_create_sql'
                    except Exception as e:
                        self.display_messagebox_error_success('查找表名、字段、注释','程序编辑sql语句失败')
                    
                    
                elif self.mark_hive_pg_datebase=='pg':
                    try:
                        #print('这边走%s:'%self.mark_hive_pg_datebase)
                        #创建表头、表尾写法
                        self.tablename,self.string_CreateSql_1,self.string_CreateSql_3=self.CreateTableSql_1_3(self.TableName_dict,self.mark_hive_pg_datebase)
                        #创建表中写法
                        self.string_CreateSql_2,string_CreateSql_4=self.CreateTableSql_2(self.TableField_dict,self.TableField_dict1,self.TableName_dict,self.tablename,self.mark_hive_pg_datebase)
                
                        #整个建表语句写法
                        self.string_whole_CreateTableName=self.string_CreateSql_1+"\n"+self.string_CreateSql_2+"\n"+self.string_CreateSql_3+"\n"+string_CreateSql_4
                        #print(string_whole_CreateTableName)
                        
                        #如果编写sql语句成功,返回一个标识符。
                        self.createSql_token='succrss_create_sql'
                    except Exception as e:
                        self.display_messagebox_error_success('查找表名、字段、注释','程序编辑sql语句失败')
                    
                    
                #将sql语句放入text预览,先清除text内容
                self.clear_text_value(self.view_sql_Text)
                self.view_sql_Text.insert('end', self.string_whole_CreateTableName)
                
            else:
                #获取字段、类型、注释失败
                #获取字段、类型、注释失败,弹窗之前,先把text、treelist信息删除
                self.clear_tree_value(self.field_tree)
                self.clear_text_value(self.view_sql_Text)
                self.display_messagebox_error_success('查找表名、字段、注释',self.TableField_dict)
        else:
            #获取表名称失败
            #获取表名称失败,弹窗之前,先把text、treelist信息删除
            self.clear_tree_value(self.field_tree)
            self.clear_text_value(self.view_sql_Text)
            self.display_messagebox_error_success('查找表名、字段、注释',self.TableName_dict)

    
    #保存建表文件            保存文件目录路径
    def Save_sql_file(self,file_save_path):
        #sql语句写入文件中
        try:
            ack_success=''
            #print('self.createSql_token为%s'%self.createSql_token)
            if file_save_path!='' and self.createSql_token=='succrss_create_sql':
                #print('进去保存流程self.createSql_token为%s'%self.createSql_token)
                self.sql_filename=str(self.tablename)+'.sql'
                if os.path.isfile(self.sql_filename):#判断文件是否存在
                    os.remove(self.sql_filename)#删除文件
                    #print('文件存在,'+str(self.sql_filename)+'删除成功')
                    with open(file_save_path+'/'+self.sql_filename,'w+',encoding='UTF-8') as file:
                        file.write(self.string_whole_CreateTableName)
                        file.close()
                        ack_success='success'
                        self.createSql_token='false_create_sql'
                        return ack_success
                else: #不存在
                    #print('文件不存在,'+str(self.sql_filename)+',可以创建')
                    with open(file_save_path+'/'+self.sql_filename,'w+',encoding='UTF-8') as file:
                        file.write(self.string_whole_CreateTableName)
                        file.close()
                        ack_success='success'
                        self.createSql_token='false_create_sql'
                        return ack_success
            else:
                self.display_messagebox_error_success('保存文件','请输入文件位置信息查询后,再点击保存!!')
                
        except Exception as e:
            return 'false'
    
    #弹窗模块
    def display_messagebox_error_success(self,success_error_title,success_error_info):
        tk.messagebox.showinfo(title=str(success_error_title),message=str(success_error_info))
        
    
    #保存文件成功弹窗
    def display_messagebox(self): 
        #自定义保存目录
        file_save_path = tkinter.filedialog.askdirectory(title=u'保存文件')
        #print(file_save_path)
        ack_success=self.Save_sql_file(file_save_path)
        if ack_success=='success':
            tk.messagebox.showinfo(title='保存文件',message='保存建表文件成功')  # 消息提醒弹窗,点击确定返回值为 ok
            #清空目录和位置信息
            self.clear_entry()
            
            #清空list
            self.clear_tree_value(self.field_tree)
            #清除text内容
            self.clear_text_value(self.view_sql_Text)
            
            #保存sql文件之后,删除新建的xls文件(针对原文件是xlsx文件)
            token=self.delete_xlsx_trans_xls_token
            #print('保存文件成功之后,token为%s'%token)
            if token=='delete_xls':
                delete_filename=self.filename_xls
                if os.path.isfile(delete_filename):#判断文件是否存在
                    #print('保存文件成功之后,删除文件为:%s'%delete_filename)
                    os.remove(delete_filename)
        elif ack_success=='false':
            tk.messagebox.showinfo(title='保存文件',message='保存文件失败')  # 消息提醒弹窗,点击确定返回值为 ok
            #清空目录和位置信息
            self.clear_entry()
            
            #清空list
            self.clear_tree_value(self.field_tree)
            #清除text内容
            self.clear_text_value(self.view_sql_Text)
            
            #保存sql文件之后,删除新建的xls文件(针对原文件是xlsx文件)
            token=self.delete_xlsx_trans_xls_token
            #print('保存文件失败之后,token为%s'%token)
            if token=='delete_xls':
                delete_filename=self.filename_xls
                if os.path.isfile(delete_filename):#判断文件是否存在
                   #print('保存文件失败之后,删除文件为:delete_filename%s'%delete_filename)
                   os.remove(delete_filename)
                
    #打开图片模块
    def Open_image(self):
        try:
            img=Image.open(r'./createtable_notice.png')
            img.show()
        except Exception as e: 
            self.display_messagebox_error_success('提示!!',e)

    def create_string_number(self,n):
        """生成一串指定位数的字符+数组混合的字符串"""
        m = random.randint(1, n)
        a = "".join([str(random.randint(0, 9)) for _ in range(m)])
        b = "".join([random.choice(string.ascii_letters) for _ in range(n - m)])
        return ''.join(random.sample(list(a + b), n))


    
    #点击hive数据库按钮
    def select_hive_database(self):
        self.mark_hive_pg_datebase=self.get_select_datebase.get()
        #清空目录和位置信息
        self.clear_entry()
        #清空list
        self.clear_tree_value(self.field_tree)
        #清空text
        self.clear_text_value(self.view_sql_Text)
        #print('点击数据库为:%s'%self.mark_hive_pg_datebase)
        #self.get_datebase.set('red')
        
    #点击pg数据库按钮   
    def select_pg_database(self):
        self.mark_hive_pg_datebase=self.get_select_datebase.get()
        #清空目录和位置信息
        self.clear_entry()
        #清空list
        self.clear_tree_value(self.field_tree)
        #清空text
        self.clear_text_value(self.view_sql_Text)
        #print('点击数据库为:%s'%self.mark_hive_pg_datebase)
        #self.get_datebase.set('red')
    
    #设置界面
    def SetGUI(self):
        
        self.init_window_name.title("Excel文件创建建表sql文件")
        self.init_window_name.geometry('1300x750')
        #self.init_window_name.overrideredirect(1) # 隐藏标题栏 最大化最小化按钮
        #self.init_window_name.attributes("-toolwindow", 2) # 去掉窗口最大化最小化按钮,只保留关闭
        self.init_window_name.resizable(0,0)# 禁止拉伸窗口
        ##button_filename=add_Excel_file()
        
        
        #数据库选择部分
        self.select_database_labelframe = tk.LabelFrame(self.init_window_name,width=1280, height=53,text="数据库选择")
        self.select_database_labelframe.place(x=10,y=2)
        self.hive_Radiobutton = Radiobutton(self.select_database_labelframe,text="hive数据库",variable=self.get_select_datebase,value='hive',command=self.select_hive_database)
        self.hive_Radiobutton.place(x=50,y=0)

        self.pg_Radiobutton = Radiobutton(self.select_database_labelframe,text="pg数据库",variable=self.get_select_datebase,value='pg',command=self.select_pg_database)
        self.pg_Radiobutton.place(x=200,y=0)
        
        self.tip_label = tk.Label(self.select_database_labelframe,width=80,height=1,fg="red", bg="yellow", font=("微软雅黑", 12,"bold"), text="提示:选择的Excel文件最好是xls格式的。如果是xlsx格式的,按钮响应时间有点慢!!!")
        self.tip_label.place(x=420,y=0)
        
        #self.get_datebase_hive.set('hive')
        #self.pg_Radiobutton.select() #默认hive_Radiobutton这个按钮被选中
        #print(self.hive_Radiobutton.get())
        
        #excel文件模块
        #文件编辑部分
        labelframe = tk.LabelFrame(self.init_window_name,width=680, height=300, text="Excel文件")
        #labelframe.pack()
        labelframe.place(x=10,y=60)
        self.Excel_label = tk.Label(labelframe,width=10,height=1,fg='red', font=("微软雅黑", 10), text="目录路径:")
        self.Excel_label.place(x=0,y=2)
        self.Excel_path = tk.Entry(labelframe, width=60, textvariable=self.get_value)
        self.Excel_path.place(x=80,y=5)
        self.Excel_file = tk.Button(labelframe,width=23,height=1,fg='blue', text="选择Excel文件(只支持xls格式)",command=self.add_Excel_file)
        self.Excel_file.place(x=505,y=5)
        
        #表名
        self.start_row_label_location = tk.Label(labelframe,width=22,height=1,fg='red', font=("微软雅黑", 13),text="请填写表名位置信息", anchor="sw")
        self.start_row_label_location.place(x=0,y=38)
        
        self.start_row_label = tk.Label(labelframe,width=22,height=1, text="表名开始行(填写数字):")
        self.start_row_label.place(x=0,y=70)
        self.start_row = tk.Entry(labelframe, width=15, textvariable=self.get_start_row_value)
        self.start_row.place(x=160,y=70)
        self.end_row_label = tk.Label(labelframe,width=22,height=1, text="表名结束行(填写数字):")
        self.end_row_label.place(x=0,y=100)
        self.end_row = tk.Entry(labelframe, width=15, textvariable=self.get_end_row_value)
        self.end_row.place(x=160,y=100)
       
        self.start_col_label = tk.Label(labelframe,width=22,height=1, text="表名开始列(填写字母):")
        self.start_col_label.place(x=0,y=130)
        self.start_col = tk.Entry(labelframe, width=15, textvariable=self.get_start_col_value)
        self.start_col.place(x=160,y=130)
        self.end_col_label = tk.Label(labelframe,width=22,height=1, text="表名结束列(填写字母):")
        self.end_col_label.place(x=0,y=160)
        self.end_col = tk.Entry(labelframe, width=15, textvariable=self.get_end_col_value)
        self.end_col.place(x=160,y=160)
        
        #表字段
        self.start_row_label_field_location = tk.Label(labelframe,width=28,height=1,fg='red', font=("微软雅黑", 13),text="请填写表字段、注释、类型位置信息", anchor="sw")
        self.start_row_label_field_location.place(x=320,y=38)
        
        self.start_row_label_field = tk.Label(labelframe,width=24,height=1, text="表字段开始行(填写数字):")
        self.start_row_label_field.place(x=320,y=70)
        self.start_row_field = tk.Entry(labelframe, width=15, textvariable=self.get_start_row_field_value)
        self.start_row_field.place(x=494,y=70)
        self.end_row_label_field = tk.Label(labelframe,width=24,height=1, text="表字段结束行(填写数字):")
        self.end_row_label_field.place(x=320,y=100)
        self.end_row_field = tk.Entry(labelframe, width=15, textvariable=self.get_end_row_field_value)
        self.end_row_field.place(x=494,y=100)
       
        self.start_col_label_field = tk.Label(labelframe,width=24,height=1, text="表字段开始列(填写字母):")
        self.start_col_label_field.place(x=320,y=130)
        self.start_col_field = tk.Entry(labelframe, width=15, textvariable=self.get_start_col_field_value)
        self.start_col_field.place(x=494,y=130)
        self.end_col_label_field = tk.Label(labelframe,width=24,height=1, text="表字段结束列(填写字母):")
        self.end_col_label_field.place(x=320,y=160)
        self.end_col_field = tk.Entry(labelframe, width=15, textvariable=self.get_end_col_field_value)
        self.end_col_field.place(x=494,y=160)
        
        #输入sheet数字 页面改成下拉选择框
        self.sheet_label= tk.Label(labelframe,width=24,height=2,fg='green', text="请选择Excel中sheet", font=("微软雅黑", 14), anchor="sw")
        self.sheet_label.place(x=10,y=183)
        #self.sheet_value = tk.Entry(labelframe, width=15, textvariable=self.get_sheet_value)
        #self.sheet_value.place(x=10,y=245)
        self.sheet_value=ttk.Combobox(labelframe,textvariable=self.get_sheet_value)
        self.sheet_value.place(x=15,y=240)
        #self.sheet_value['value'] = ('下拉选项1', '下拉选项2', '下拉选项3', '下拉选项4')
        #self.sheet_value.current(0)
        

        
        #填写位置信息例子按钮
        self.Excel_field = tk.Button(labelframe,width=40,height=3,fg='blue', text="填写前,一定要点击我,查看位置信息格式!!!",command=self.Open_image)
        self.Excel_field.place(x=240,y=200)
        
        #查找按钮
        self.Excel_field = tk.Button(labelframe,width=17,height=3,fg='blue', text="查找表名、字段、注释",command=self.get_start_end_row_col_value)
        self.Excel_field.place(x=540,y=200)
        
        #保存文件按钮
        self.save_sql = tk.Button(labelframe,width=5,height=7,fg='blue', text="保存建表文件",wraplength=2,command=self.display_messagebox)
        self.save_sql.place(x=615,y=61)
        

        #list模块
        #字段显示列表LabelFrame
        self.field_labelframe = tk.LabelFrame(self.init_window_name,width=680, height=375,text="字段列表")
        self.field_labelframe.place(x=10,y=370)
        
        # 定义树形结构与滚动条
        self.field_tree = ttk.Treeview(self.field_labelframe, show="headings", columns=("a", "b", "c", "d"), height=16)
        self.vbar = Scrollbar(self.field_labelframe, orient='vertical', command=self.field_tree.yview,activerelief='ridge')
        #self.vbar.pack(side = tk.RIGHT, fill = tk.Y)
        self.field_tree.configure(yscrollcommand=self.vbar.set)
        # 表格的标题
        self.field_tree.column("a", width=100, anchor="center")
        self.field_tree.column("b", width=250, anchor="center")
        self.field_tree.column("c", width=150, anchor="center")
        self.field_tree.column("d", width=150, anchor="center")
        self.field_tree.heading("a", text="序号")
        self.field_tree.heading("b", text="字段名")
        self.field_tree.heading("c", text="字段类型",)
        self.field_tree.heading("d", text="注释")
        self.field_tree.place(x=0,y=3)
       # self.field_tree.bind("<Double-1>", self.onDBClick)
        self.vbar.place(x=653,y=3,relheight=0.99) #滚动条长度,取值在0-1之间

        

        #建表sql预览模块
        self.view_sql_labelframe = tk.LabelFrame(self.init_window_name,width=590, height=685,text="建表SQL预览")
        self.view_sql_labelframe.place(x=700,y=60)
        self.view_sql_Text = tk.Text(self.view_sql_labelframe,height=50, width=80,fg='red')
        self.view_sql_Text.place(x=0,y=5)
        self.view_sql_vbar = Scrollbar(self.view_sql_labelframe, orient='vertical', command=self.view_sql_Text.yview,activerelief='ridge')
        self.view_sql_Text.configure(yscrollcommand=self.view_sql_vbar.set)
        self.view_sql_vbar.place(x=565,y=5,relheight=0.99) #滚动条长度,取值在0-1之间
        

    
if __name__=='__main__':
    init_window = tk.Tk() #获取tk对象
    ui=Excel_GUI(init_window) #tk对象传入Excel_GUI类中__init__方法,返回一个对象
    Excel_GUI.SetGUI(ui)
    init_window.mainloop()
    token=ui.delete_xlsx_trans_xls_token
    
    #print('token为%s'%token)
    if token=='delete_xls':
        #delete_filename=ui.filename_xls
        delete_filename=ui.delete_xlsx_trans_xls_list
        for i in delete_filename:
        #print('删除文件为:delete_filename%s'%delete_filename)
            if os.path.isfile(i):#判断文件是否存在
                os.remove(i)
        
    
    
    

    
   
    
    
    
    
    
    
   
    
    
    
    

六、打包好的应用

在我csdn下载资源处

有关利用python编写exe应用,实现excel文件输出建表sql文件。的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  5. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  6. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  7. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  8. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  9. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  10. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

随机推荐