Python编制会计凭证

首先感谢猛犸象和剑齿虎前辈以及我的一位程序员同学。

前一段时间参加了店了的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博客

https://blog.csdn.net/ibiao/article/details/77859997

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351