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


利用python的xlrd包来解析excel(xlrd包只支持xls格式文件)
利用python的tkinter包来设计GUI界面
界面分成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之间

代码如下:
#数据库选择部分
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后面的函数
代码如下:
#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之间
如果输入的文件是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)
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))
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)')
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)+' ,请查看开始行、结束行、开始列、结束列是否填写正确!!'
#根据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))
我这里使用的是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下载资源处
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用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时
我的目标是转换表单输入,例如“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看起来疯狂不安全。所以,功能正常,
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
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上找到一个类似的问题
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我想用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中编写命令行实用程序
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除