决定写这篇文章的初衷是来源于一位小伙伴的问题,关于如何根据数据源用Python自动生成透视表,这个问题背后有个非常好的解决思路,让代码替我们做重复的工作,从而减轻工作量,减少出错。 Python开发的小工具实际上是将Python程序打包成exe,分享即可用,即便电脑没有安装Python环境,也可以使用,用代码提高工作效率,尽量少加班。 内容大纲明确需求:自动生成透视表【这部分可以换成你的重复性工作】安装三方依赖库:tkinter和pyinstaller代码实现:包括两部分Python生成透视表和桌面GUI联动设计打包Python程序生成exe可执行文件解决exe文件可能过大问题:安装虚拟环境需求背景 将工作中重复性的操作,利用供应商名称,月份,入库金额三个字段来生成想要的透视表格式。 安装三方依赖库 创建桌面窗口,这里使用tkinter,它是Python自带的GUI库,安装后即可使用。pipinstalltkinter 使用pyinsatller将程序打包成exe,好处是不需要将代码部署到服务器,直接将打包好的exe发给对方,就能直接使用,对于这种小而轻的功能非常友好。pipinstallpyinstaller代码实现 Excel文件生成透视表和筛选数据,文件名:exceltopivot。pyimportpandasaspdimportnumpyasnpclassExcelToPivot(object):definit(self,filename,filepath):self。filenamefilenameself。filepathfilepathexcel自动转透视表功能返回透视结果defexcelPivot(self):print(self。filepath)datapd。readexcel(self。filepath)datapivottablepd。pivottable(data,index〔供应商名称,月份〕,values〔入库金额〕,aggfuncnp。sum)returndatapivottable按条件筛选,并保存defselectdata(self,name,month):datapivottableself。excelPivot()datanewdatapivottable。query(供应商名称〔{}〕月份{}。format(name,month))datanew。toexcel({}。xlsx。format(str(self。filename)。split(。)〔0〕))return筛选完成!ifnamemain:filenameinput(请输入文件名字:)pathC:UserscherichDesktopfilenameprossExcelToPivot(filename,path)print(pross。selectdata(C,4)) 设计桌面窗口功能,文件名:opration。pyfromtkinterimportTk,Entry,Button,mainloopimporttkinter。filedialogimportexceltopivotfromtkinterimportmessageboxfromtkinterimportttkdefUpload():globalfilename,datapivottabletry:filenametkinter。filedialog。askopenfilename(title选择文件)prossexceltopivot。ExcelToPivot(str(filename)。split()〔1〕,filename)datapivottablepross。excelPivot()messagebox。showinfo(Info,转换成功!)exceptExceptionase:print(e)messagebox。showinfo(Info,转换失败!)defselect(name,month):try:print(供应商名称〔{}〕月份{}。format(name,month))datanewdatapivottable。query(供应商名称〔{}〕月份{}。format(name,month))datanew。toexcel({}。xlsx。format(str(filename)。split(。)〔0〕))messagebox。showinfo(Info,筛选完成并生成文件!)root。destroy()exceptExceptionase:print(e)messagebox。showinfo(Info,筛选失败!)rootTk()root。config(background6fb765)root。title(自动转透视表小工具)root。geometry(500x250)e1Entry(root,width30)e1。grid(row2,column0)btn1Button(root,text上传文件,commandUpload)。grid(row2,column10,pady5)box1ttk。Combobox(root)使用grid()来控制控件的位置box1。grid(row5,stickyNW)设置下拉菜单中的值box1〔value〕(A,B,C,D,供应商)通过current()设置下拉菜单选项的默认值box1。current(4)box2ttk。Combobox(root)box2。grid(row5,column1,stickyNW)box2〔value〕(1,2,3,4,5,6,7,8,9,10,11,12,月份)box2。current(12)编写回调函数,绑定执行事件deffunc(event):globalb1,b2b1box1。get()b2box2。get()绑定下拉菜单事件box1。bind(ComboboxSelected,func)box2。bind(ComboboxSelected,func)btn2Button(root,text筛选数据,commandlambda:select(b1,b2))。grid(row30,column10,pady5)mainloop() 如果运行结果如上,说明代码没有问题了,可以进行下一步。打包Python程序生成exe 打开DOS窗口并切换到两个py文件所在的目录,注意路径中不要有中文。pyinsatllerFwopration。py pyinstaller指令的常见可选参数:i给应用程序添加图标F指定打包后只生成一个exe格式的文件Donedir创建一个目录,包含exe文件,但会依赖很多文件(默认选项)cconsole,nowindowed使用控制台,无界面(默认)wwindowed,noconsole使用窗口,无控制台p添加搜索路径 在当前的目录下,将会生成两个文件夹:build和dist。dist里面就是所有可执行exe文件,发送快捷方式到桌面,点击opration。exe就能运行了,可以发它的快捷方式发送到桌面,双击就可以。解决exe文件可能过大问题 有的伙伴Python环境刚安装没多久,可能不存在这个文件过大的问题。像我的电脑里安装了Python很多的依赖包和anaconda等等,打包出来的文件居然660M,打包时间长,执行时还卡,后来经过整改缩小到31M,打包快,秒级执行。解决方案是在Windows系统下安装一个Python的虚拟环境,前提是已经在电脑上安装过Python才可以进行如下操作。 找到Python所在路径,如果忘记了,可以在电脑左下角搜索【编辑系统环境变量】【用户变量】【PATH】中找到 配置虚拟环境 虚拟环境可以理解为是Python解释器的一个副本,在这个环境你可以安装私有包,而且不会影响系统中安装的全局Python解释器。虚拟环境非常有用,可以在系统的Python解释器中避免包的混乱和版本的冲突。 重要是不同虚拟环境可以搭建不同的Python版本,创建时候选择,我们这里需要一个相对干净的Python环境,没有安装过多依赖包,避免exe打包文件过大,所以用到虚拟环境。安装虚拟环境依赖包pipinstallvirtualenvpipinstallvirtualenvwrapperwin创建虚拟环境命令mkvirtualenvpC:UserscherichAppDataLocalProgramsPythonPython38python。exepy38 进入虚拟环境,可以看到只有几个默认的Python库 这时可以测试一下代码,是否缺少相关依赖,比如我这个缺少Pandas,openpyxl,依次按照pipinstall包名安装即可,非常重要的点:pyinstaller必须重新安装,文件才会缩小。 上述操作完成后,打包就可以了,最后退出虚拟环境即可。 退出虚拟环境deactivate 整个自动化思路的实现就完成了,大家可以将整个流程套用到你现有的重复性工作中,在过程中有两个需要注意的点,如下: 尽量不要用中文路径,要不会报些莫名其妙的错误。 导包是尽量避免使用import导入不必要的包,节省打包和执行时间。 让代码自动工作,省下来的时间,摸摸鱼,打打小游戏不好么