首先感谢猛犸象和剑齿虎前辈以及我的一位程序员同学。
前一段时间参加了店了的ERP系统协调开始,我就一直在找合适的提高工作效率的方法。我是公司里的会计,日常工作就是敲会计凭证,这是一个重复度非常高的工作。慢慢的在网上发现了Python,很幸运的发现了一篇文章:就是猛犸象和剑齿虎前辈的python——实现ERP软件自动化操作 - 简书。又在我一位程序员同学和搜索引擎的帮助下慢慢完成了第一个Python脚本。
基本思路是用Python语言读取excel文件,导入数据,再编写一个Python脚本操作键盘鼠标,代替人工把数据录入财务软件里,每天只需要制作好excel表格,运行脚本,就可以让电脑代替手工操作点点点输入输入输入,能节约很多时间,保住我们珍贵的三万天。理论上来说,平常使用ERP软件,用友,金蝶,各种系统软件的都是可以用这个方法的,但是具体适用程度不一样,对我来说,如果我们的收银可以及时准确的把数据录入到excel表格中,我每天跑跑脚本,就能搞定一部分凭证。原来十五张凭证要用两个小时,现在可能不到一个小时就可以结束。
刚开始的时候我有一个笼统的想法:从公司的层面来考虑,最理想的状态,就是任何一笔业务中的任何一个数据只需要输入一次,就可以沿途生成各种所需要的成果,用于公司的分析和管理。这样需要做的会更多,要打通公司内使用的各个系统软件,各种excel表格,构成一个完整的体系。后面发现早都有类似的管理方案和软件开发了,有公司在这样做了。
回归正题,这个脚本主要用到Python中的三个模块:
1,pyautogui模块
主要功能是:根据屏幕分辨率模拟鼠标移动,包括相对移动(鼠标在当前位置上下移动,左右移动),绝对移动(鼠标移动到固定位置)
根据屏幕分辨率模拟鼠标点击,包括鼠标左击,右击,中击,单击,双击,鼠标拖拽。
支持键盘按键和英文输入,包括单独按键和组合按键。
在这个脚本里主要是用来操控键盘鼠标把固定的值输入财务软件里。
2,pyperclip模块
这个模块是为了解决pyautogui模块不支持中文输入补充的,pyperclip模块可以把指定文本复制到粘贴板上,再用pygutogui模块输入“Ctrl”,“V”把中文输入财务软件里。
3,openpyxl模块
可以读取和修改excel文件,在这里主要是excel的读取。
下面按照一个脚本细写一下,这个脚本不是第一个脚本,是后来慢慢完善出来的改进版,更为使用,又用到erp,用友,金蝶的同学应该可以很方便拿去用。
“#”字符在Python中是做代码注释的意思,这一行代码中“#”后面的部分不会被执行。
# 首先,将四个模块倒入程序中而后可以用这三个模块的功能,time模块只用到了一个函数用于防止程序中间出错,不好终止的问题。
import pyautogui
import pyperclip
import openpyxl
import time
# 接着读取execl的数据,这里运用到了Python中的赋值,将指定路径的excel文件命名为wb,也可以其他。”data_only=True参数表示仅仅载入excel的数据,不载入excel的函数。Python中区分字母大小写。
wb = openpyxl.load_workbook('F:\工作\凭证模版.xlsx', data_only=True)
# 选择excel文件中的工作薄“sheet3”命名为“sheet”
sheet = wb.get_sheet_by_name('Sheet3')
# 读取excel中的最大行
max_row = sheet.max_row
# pyautogui.PAUSE函数在pyautogui中含义是每一步停留时间间隔,模块默认值是0.1秒,不过我用的财务软件反应不过来,因此延长了时间设置成了0.5秒。
pyautogui.PAUSE = 0.5
# 这是一个程序校验,具体我也不懂。可以参考底下的引用文档。
pyautogui.FAILSAFE = True
# 开始操作鼠标了,click财务软件的选项就可以了,click()函数里边的值是我电脑屏幕里的纵坐标和横坐标。
pyautogui.click(270, 160) # 增加凭证
# for x in range(4, 6)循环表示把x分别赋值为整数4,5,6,依次代入程序中运行,第一次运行中所有用x的地方,x的值均为4。4跑完之后,程序按照5再循环一次,以此类推。循环是程序代替人工重复工作的关键,这里的x表示为excel表格中的行数,从第4行循环到第6行。
for x in range(4, 6):
# 这里引入了变量i,并将变量i赋值为0,从而能在后面解决凭证录入界面逐行下移的问题
i = 0
# 这个是一个操作键盘按键的函数,只需要把按键名称输入其中就可以了。
pyautogui.hotkey('Backspace')
# 复制excel中的值到粘贴板上,value表示(x,1)单元格中的值,这一步是复制日期
pyperclip.copy(sheet.cell(x, 1).value)
# 这一步是粘贴日期
pyautogui.hotkey('ctrl', 'v')
# 鼠标点击第一行摘要区域
pyautogui.click(316, 256)
# 复制摘要
pyperclip.copy(sheet.cell(x, 2).value)
# 粘贴摘要
pyautogui.hotkey('ctrl', 'v')
# 这里引入了excel表格的列循环,表格设计时excel列数表示科目对应的值。从格式上看,y的循环置于x的循环之下表示,每次x循环时,y都会循环一遍。
for y in range(9, 36):
# while True和if..elif...else是两组条件判断循环,当下边出现break时,while True循环会被终止,否则会出现死循环。设计这个循环的目的是为了判断会计科目下是否存在值,存在值才需要输入到软件里,不存在值不需要输入到软件里。而在Python是区分0值和空值的,因此又加入None。str()的意思是将从excel中提取的值类型转化为字符串,从而能够判断是否等于字符串形式的0。
while True:
if str(sheet.cell(x, y).value) == '0':
break
elif sheet.cell(x, y).value is None:
break
else:
# 这里表示y每循环一次且if判断有值,i会增加1.
i = i + 1
# 点击科目栏。436是凭证界面科目栏的纵坐标,23是凭 证界面每行的间距。这样鼠标就会依次移动到下一行了。
pyautogui.click(436, 256 + (i - 1) * 23)
# 输入科目编码。因为科目编码是数字,可以用pyautogui中自带的函数输入软件中。
pyautogui.typewrite(str(sheet.cell(1, y).value))
# 判断是否有辅助核算。有些会计科目有辅助核算,有些没有,所以写了一个判断函数。
if sheet.cell(x, y + 27).value is not None:
# 点击辅助核算
pyautogui.click(pyautogui.moveRel(114, 0))
# 复制辅助核算
pyperclip.copy(sheet.cell(x, y + 27).value)
# 输入辅助核算
pyautogui.hotkey('ctrl', 'v')
# 辅助核算确认
pyautogui.click(1140, 400)
# 判断金额在借方还是贷方。会计科目中分借贷方,而这在财务软件中是不同的位置,所以需要判断一下。
if str(sheet.cell(2, y).value) == '借':
# 点击借方金额
pyautogui.click(780, 256 + (i - 1) * 23)
# 输入借方金额
pyautogui.typewrite(str(sheet.cell(x, y).value))
else:
# 点击贷方金额
pyautogui.click(900, 256 + (i - 1) * 23)
# 输入贷方金额
pyautogui.typewrite(str(sheet.cell(x, y).value))
# 判断是否有数量核算。部分科目有数量核算,会再次改变财务软件的输入形式,因此要用判断函数把这部分找出来,让它们按照另一条路线行驶。
if str(sheet.cell(1, y).value) == '600101':
# 点击放大镜
pyautogui.click(950, 256 + (i - 1) * 23)
# 输入数量
pyautogui.typewrite('1')
pyautogui.doubleClick(1000, 430)
# 点击确认
pyautogui.click(910, 610)
elif str(sheet.cell(1, y).value) == '140501':
# 点击放大镜
pyautogui.click(830, 256 + (i - 1) * 23)
# 输入数量
pyautogui.typewrite('1')
pyautogui.doubleClick(1000, 430)
# 点击确认
pyautogui.click(910, 610)
elif str(sheet.cell(1, y).value) == '64010101':
# 点击放大镜
pyautogui.click(950, 256 + (i - 1) * 23)
# 输入数量
pyautogui.typewrite('1')
pyautogui.doubleClick(1000, 430)
# 点击确认
pyautogui.click(910, 610)
break
# 这是最后一步,也是最让人喜欢的一步,从格式上看它和y的遍历循 环并列,附属于x的遍历循环之下,也就意味着,x的遍历循环结束之后,该程序才会结束。
pyautogui.click(460, 160)
#程序暂停5秒,用于发生错误的时候终止程序运行。
time.sleep(5)
Python的功能很强大,比如批量操作excel、ppt和Word这些提高工作效率的事情,对平常的工作都很有帮助。
参考文章:
pyautogui自动化控制鼠标和键盘操作_Python_灵动的艺术的博客-CSDN博客
https://blog.csdn.net/weixin_43430036/article/details/84650938
openpyxl官方手册 - 简书
https://www.jianshu.com/p/3f348b7552a7
pyautogui (一)_Python_静心学习、耐心沉淀-CSDN博客
网友评论