作者 | Cherish
来源 |杰哥的IT之旅
决定写这篇文章的初衷是来源于一位小伙伴的问题,关于"如何根据数据源用 Python 自动生成透视表",这个问题背后有个非常好的解决思路,让代码替我们做重复的工作,从而减轻工作量,减少出错。
Python 开发的小工具实际上是将 Python 程序打包成 exe,分享即可用,即便电脑没有安装 Python 环境,也可以使用,用代码提高工作效率,尽量少加班。
明确需求:自动生成透视表【这部分可以换成你的重复性工作】
安装三方依赖库:tkinter 和 pyinstaller
代码实现:包括两部分 Python 生成透视表和桌面 GUI 联动设计
打包 Python 程序 生成 exe 可执行文件
解决 exe 文件可能过大问题:安装虚拟环境
pipinstalltkinter
使用 pyinsatller 将程序打包成 exe,好处是不需要将代码部署到服务器,直接将打包好的 exe 发给对方,就能直接使用,对于这种小而轻的功能非常友好。
pipinstallpyinstaller
importpandasaspd
importnumpyasnp
classExcelToPivot(object):
def__init__(self,filename,file_path):
self.file_name=filename
self.file_path=file_path
"""
excel自动转透视表功能
返回透视结果
"""
defexcel_Pivot(self):
print(self.file_path)
data=pd.read_excel(self.file_path)
data_pivot_table=pd.pivot_table(data,index=['供应商名称','月份'],values=["入库金额"],aggfunc=np.sum)
returndata_pivot_table
"""
按条件筛选,并保存
"""
defselect_data(self,name,month):
data_pivot_table=self.excel_Pivot()
data_new=data_pivot_table.query('供应商名称==["{}"]&月份=={}'.format(name,month))
data_new.to_excel('{}.xlsx'.format(str(self.file_name).split('.')[0]))
return'筛选完成!'
if__name__=='__main__':
filename=input("请输入文件名字:")
path='C:/Users/cherich/Desktop/'+filename
pross=ExcelToPivot(filename,path)
print(pross.select_data("C",4))
fromtkinterimportTk,Entry,Button,mainloop
importtkinter.filedialog
importexcel_to_pivot
fromtkinterimportmessagebox
fromtkinterimportttk
defUpload():
globalfilename,data_pivot_table
try:
filename=tkinter.filedialog.askopenfilename(title='选择文件')
pross=excel_to_pivot.ExcelToPivot(str(filename).split('/')[-1],filename)
data_pivot_table=pross.excel_Pivot()
messagebox.showinfo('Info','转换成功!')
exceptExceptionase:
print(e)
messagebox.showinfo('Info','转换失败!')
defselect(name,month):
try:
print('供应商名称==["{}"]&月份=={}'.format(name,month))
data_new=data_pivot_table.query('供应商名称==["{}"]&月份=={}'.format(name,month))
data_new.to_excel('{}.xlsx'.format(str(filename).split('.')[0]))
messagebox.showinfo('Info','筛选完成并生成文件!')
root.destroy()
exceptExceptionase:
print(e)
messagebox.showinfo('Info','筛选失败!')
root=Tk()
root.config(background="#6fb765")
root.title('自动转透视表小工具')
root.geometry('500x250')
e1=Entry(root,width=30)
e1.grid(row=2,column=0)
btn1=Button(root,text='上传文件',command=Upload).grid(row=2,column=10,pady=5)
box1=ttk.Combobox(root)
#使用grid()来控制控件的位置
box1.grid(row=5,sticky="NW")
#设置下拉菜单中的值
box1['value']=('A','B','C','D','供应商')
#通过current()设置下拉菜单选项的默认值
box1.current(4)
box2=ttk.Combobox(root)
box2.grid(row=5,column=1,sticky="NW")
box2['value']=(1,2,3,4,5,6,7,8,9,10,11,12,'月份')
box2.current(12)
#编写回调函数,绑定执行事件
deffunc(event):
globalb1,b2
b1=box1.get()
b2=box2.get()
#绑定下拉菜单事件
box1.bind("<<ComboboxSelected>>",func)
box2.bind("<<ComboboxSelected>>",func)
btn2=Button(root,text='筛选数据',command=lambda:select(b1,b2)).grid(row=30,column=10,pady=5)
mainloop()
pyinsatller-F-wopration.py
pipinstallvirtualenv
pipinstallvirtualenvwrapper-win
mkvirtualenv-p="C:\Users\cherich\AppData\Local\Programs\Python\Python38\python.exe"py38
deactivate
整个自动化思路的实现就完成了,大家可以将整个流程套用到你现有的重复性工作中,在过程中有两个需要注意的点,如下:
尽量不要用中文路径,要不会报些莫名其妙的错误。
导包是尽量避免使用 import * 导入不必要的包,节省打包和执行时间。
让代码自动工作,省下来的时间,摸摸鱼,打打小游戏不好么~
分享
点收藏
点点赞
点在看
文章转发自AI科技大本营微信公众号,版权归其所有。文章内容不代表本站立场和任何投资暗示。
Copyright © 2021.Company 元宇宙YITB.COM All rights reserved.元宇宙YITB.COM