ui.py #!/usr/bin/python# encoding:utf-8from Tkinter import *import win32uiimport xlrdimport xlwtimport tkMessageBoximport itertools #获取数列子集函数from pyExcelerator import *file_is_open = []htbh = [] #合同编号yhqyf = [] #用户
#!/usr/bin/python # encoding:utf-8 from Tkinter import * import win32ui import xlrd import xlwt import tkMessageBox import itertools #获取数列子集函数 from pyExcelerator import * file_is_open = [] htbh = [] #合同编号 yhqyf = [] #用户签约方 htmc = [] #合同名称 htzje = [] #合同总金额 kpzje = [] #开票总金额 whkje = [] #未回款金额 whkje_shuju = [] #筛选出来的相关未回款金额数据合集 htbh_shuju = [] #筛选出来的相关合同编号数据合集 htmc_shuju = [] #筛选出来的相关合同名称数据合集 htzje_shuju = [] #筛选出来的相关合同总金额合集 jieguoji = [] #最终筛选出来的相关结果存放位置 cal_num = 0 #计算次数 def open_file(): dlg = win32ui.CreateFileDialog(1) # 1表示打开文件对话框 dlg.SetOFNInitialDir('') # 设置打开文件对话框中的初始显示目录 dlg.DoModal() filename = dlg.GetPathName() # 获取选择的文件名称 print filename.decode('gbk') # print excel_data.get_sheets try: excel_data = xlrd.open_workbook(filename) # 打开选择的execl文件 except: print '没有选择文件!' return if filename.decode('gbk') in file_is_open: # 如果文件被读取了,弹框报错 print filename.decode('gbk') for tt in range(0, len(file_is_open)): print file_is_open[tt] tkMessageBox.showinfo('info', '文件已经读取过,请选择新文件') return file_is_open.append(filename.decode('gbk')) # 如果文件没有读取过,存入到文件列表中 if excel_data.nsheets > 1: # 如果sheet页大于一个,则生成选择窗口选择相关的页面进行处理 xuanze = Tk() # 建立选择sheet的窗口 xuanze.title("选择sheet页") # xuanze.resizable(width=True, height=True) Label(xuanze, text=u'请选择需要统计的sheet页').pack() # print excel_data.nsheets #打印excel中sheet页的个数 for i in excel_data.sheet_names(): # 建立相关的sheet页按钮 b = Button(xuanze, text=i, command=lambda t=xuanze, c=excel_data, m=i: duqushuju(t, c, m), width=30, height=2).pack() Button(xuanze, text='取消', command=xuanze.destroy, width=30, height=2).pack() xuanze.mainloop() else: duqushuju('', excel_data, excel_data.sheet_names()[0]) # 只有一个sheet页的excel直接读取 def int2bin(n, count=20): """returns the binary of integer n, using count number of digits""" return "".join([str((n >> y) & 1) for y in range(count - 1, -1, -1)]) def duqushuju(xuanze, excel_data, i): if xuanze: # 如果传过来的窗口界面非空,则将选择窗口关闭 xuanze.destroy() table_shuju = excel_data.sheet_by_name(i) # 按照按钮选择的sheet页面读取内容 excel_nrows = table_shuju.nrows # 获得sheet页总行数 excel_ncols = table_shuju.ncols # 获得sheet页总列数 col_htbh = 0 #合同编号 col_yhqyf = 0 #用户签约方 col_htmc = 0 #合同名称 col_htzje = 0 #合同总金额 col_kpzje = 0 #开票总金额 col_whkje = 0 #未回款金额 for row_num in range(0, excel_nrows): # 循环读取数据 for col_num in range(0, excel_ncols): if table_shuju.cell_value(row_num, col_num) == u'合同编号': # 找到表头,读取相关列信息 for lieming in range(0, excel_ncols): if table_shuju.cell_value(row_num, lieming) == u'合同编号': col_htbh = lieming if table_shuju.cell_value(row_num, lieming) == u'用户签约方': col_yhqyf = lieming if table_shuju.cell_value(row_num, lieming) == u'合同名称': col_htmc = lieming if table_shuju.cell_value(row_num, lieming) == u'合同总金额': col_htzje = lieming if table_shuju.cell_value(row_num, lieming) == u'开票总金额': col_kpzje = lieming if table_shuju.cell_value(row_num, lieming) == u'未回款金额': col_whkje = lieming continue if(col_whkje == 0): continue htbh.append(table_shuju.cell_value(row_num, col_htbh)) # 合同编号 yhqyf.append(table_shuju.cell_value(row_num, col_yhqyf)) # 用户签约方 htmc.append(table_shuju.cell_value(row_num, col_htmc)) # 合同名称 htzje.append(table_shuju.cell_value(row_num, col_htzje)) # 合同总金额 kpzje.append(table_shuju.cell_value(row_num, col_kpzje)) # 开票总金额 whkje.append(table_shuju.cell_value(row_num, col_whkje)) # 未回款金额 tkMessageBox.showinfo('info', '文件数据读取结束') def shaixuan(): if len(file_is_open) == 0: tkMessageBox.showinfo('info', '先读取文件!!') return if len(whkje) == 0: tkMessageBox.showinfo('info', '文件中找不到相关数据,请检查是否存在“合同编号”、“合同名称”、“开票总金额”、“未回款金额”等列!!') return for i in range(1,len(whkje)): if (yhqyf[i] == gongsimingcheng.get().strip()) and (kpzje[i] > 0) and whkje[i] > 0 : whkje_shuju.append(whkje[i]) htbh_shuju.append(htbh[i]) htmc_shuju.append(htmc[i]) def tongjishuju(): if (gongsimingcheng.get() == '') or (float(jieguo.get()) <= 0): tkMessageBox.showinfo('info','请填写相关参数进行计算') return shaixuan() if len(whkje_shuju) == 0: tkMessageBox.showinfo('info', '没有需要计算的数据,请检查开票总金额和未回款金额!!') return # if len(whkje_shuju) > 20: # tkMessageBox.showinfo('info', '符合条件的数据大于20个了,小心电脑内存被占满,减少点吧') # exit() w = Workbook() # 创建一个工作簿 sheet1 = w.add_sheet(u'结果统计') # 创建员工工作统计表 style = XFStyle() #设置单元格样式 borders = xlwt.Borders() borders.left = 1 borders.right = 1 borders.top = 1 borders.bottom = 1 style.borders=borders for i in range(10): # 设置列宽 sheet1.col(i).width = 256 * 15 style.num_format_str='0.00' write_line = 1 # chaxunguocheng.set('共计%0f个循环,请稍等' % 2**len(whkje_shuju)) num_shuju = len(whkje_shuju) tkMessageBox.showinfo('info', num_shuju) zongshu = 2 ** num_shuju while i < zongshu : qiuhe=0.0 whkje_tmp = [] htbh_tmp = [] htmc_tmp = [] pailie = int2bin(i,num_shuju) for j in range(num_shuju): qiuhe=qiuhe + whkje_shuju[j] * int(pailie[j]) if pailie[j] == '0': whkje_tmp.append(whkje_shuju[j]) htbh_tmp.append(htbh_shuju[j]) htmc_tmp.append(htmc_shuju[j]) if qiuhe == float(jieguo.get()): for t in range(len(whkje_tmp)): sheet1.write(write_line, t + 1, htbh_tmp[t], style) sheet1.write(write_line+1, t+1, htmc_tmp[t],style) sheet1.write(write_line+2, t+1, whkje_tmp[t],style) write_line = write_line + 4 # for kk in range(len(whkje_shuju)): # whkje_zuhe = [] # htbh_zuhe = [] # htmc_zuhe = [] # whkje_zuhe =list(itertools.combinations(whkje_shuju,kk)) # htbh_zuhe = list(itertools.combinations(htbh_shuju, kk)) # htmc_zuhe = list(itertools.combinations(htmc_shuju, kk)) # for jj in range(len(whkje_zuhe)): # xiangjia = 0 # for tt in range(len(whkje_zuhe[jj])): # xiangjia = xiangjia + whkje_zuhe[jj][tt] # # print xiangjia,jieguo.get() # if xiangjia == float(jieguo.get()): # # print htbh_zuhe[jj],htmc_zuhe[jj],whkje_zuhe[jj] # sheet1.write(write_line, 0, u'合同编号:', style) # sheet1.write(write_line + 1, 0, u'合同名称:') # sheet1.write(write_line + 2, 0, u'未回款金额:', style) # for qq in range(len(whkje_zuhe[jj])): # sheet1.write(write_line, qq+1, htbh_zuhe[jj][qq],style) # sheet1.write(write_line+1, qq+1, htmc_zuhe[jj][qq],style) # sheet1.write(write_line+2, qq+1, whkje_zuhe[jj][qq],style) # write_line = write_line + 4 if write_line == 1: tkMessageBox.showinfo('info', '没有数字相加满足条件,请检查') jiemian.destroy() exit() dlg = win32ui.CreateFileDialog(0, None, None, 0, "*.xls") dlg.SetOFNInitialDir('') dlg.DoModal() file_name = dlg.GetPathName() if 'xls' not in file_name: file_name = file_name + '.xls' w.save(file_name) tkMessageBox.showinfo('info', '写入完成') jiemian.destroy() exit() def shaixuan_baifenbi(): if len(file_is_open) == 0: tkMessageBox.showinfo('info', '先读取文件!!') return if len(htzje) == 0: tkMessageBox.showinfo('info', '文件中找不到相关数据,请检查是否存在“合同总金额”、“合同名称”等列!!') return for i in range(1,len(htzje)): if (yhqyf[i] == gongsimingcheng.get().strip()) and (htzje[i] > 0) : htzje_shuju.append(htzje[i]) htbh_shuju.append(htbh[i]) htmc_shuju.append(htmc[i]) def baifenbi(): if len(file_is_open) == 0: tkMessageBox.showinfo('info', '先读取文件!!') return if float(baifenbi_num.get()) == 0: tkMessageBox.showinfo('info','请填写金额') return shaixuan_baifenbi() if len(htzje_shuju) == 0: tkMessageBox.showinfo('info','筛选后找不到相关公司数据,请检查公司名称') return w = Workbook() # 创建一个工作簿 sheet1 = w.add_sheet(u'百分比统计') # 创建员工工作统计表 style = XFStyle() #设置单元格样式 borders = xlwt.Borders() borders.left = 1 borders.right = 1 borders.top = 1 borders.bottom = 1 style.borders=borders for i in range(10): # 设置列宽 sheet1.col(i).width = 256 * 15 style.num_format_str='0.00' sheet1.write(0, 0, u'合同编号:', style) sheet1.write(0, 1, u'合同名称:', style) sheet1.write(0, 2, u'合同总金额:', style) sheet1.write(0, 3, u'计算百分比:', style) write_line = 1 # print len(htzje_shuju) for jj in range(len(htzje_shuju)): sheet1.write(write_line, 0, htbh_shuju[jj],style) sheet1.write(write_line, 1, htmc_shuju[jj],style) sheet1.write(write_line, 2, htzje_shuju[jj],style) sheet1.write(write_line, 3, '%.02f%%' % (float(baifenbi_num.get())*100/float(htzje_shuju[jj])), style) write_line = write_line + 1 dlg = win32ui.CreateFileDialog(0, None, None, 0, "*.xls") dlg.SetOFNInitialDir('') dlg.DoModal() file_name = dlg.GetPathName() if 'xls' not in file_name: file_name = file_name + '.xls' w.save(file_name) tkMessageBox.showinfo('info', '写入完成') tkMessageBox.OKCANCEL jiemian.destroy() exit() jiemian = Tk() jiemian.geometry('300x460') jiemian.title("求和") jiemian.resizable(width=True, height=True) Label(jiemian).pack() Button(jiemian, text='选择文件', command=open_file, width=20, height=1).pack() Label(jiemian, text='\n请填写公司名').pack() chushishuju0 = StringVar() chushishuju0.set('') gongsimingcheng = Entry(jiemian,textvariable=chushishuju0) gongsimingcheng.pack() gongsimingcheng['state'] = 'normal' Label(jiemian, text='\n请填最终结果').pack() chushishuju1 = StringVar() chushishuju1.set(0) jieguo = Entry(jiemian,textvariable=chushishuju1) jieguo.pack() jieguo['state'] = 'normal' chaxunguocheng = StringVar() # chaxunguocheng.set('查询过程显示') Label(jiemian,textvariable=chaxunguocheng).pack() Button(jiemian, text='计算组合选项', command=tongjishuju, width=20, height=1).pack() chushishuju2 = StringVar() chushishuju2.set(1) Label(jiemian, text='\n请填写回款金额').pack() baifenbi_num = Entry(jiemian,textvariable=chushishuju2) baifenbi_num.pack() baifenbi_num['state'] = 'normal' Label(jiemian,text='').pack() Button(jiemian, text='计算百分比', command=baifenbi, width=20, height=1).pack() Label(jiemian,text='').pack() Button(jiemian, text='退出', command=jiemian.destroy, width=30, height=1).pack() jiemian.mainloop()