公司员工经常性出差,返程后需要进行差旅费报账,而由于国家对国企的严格规范,公司财务系统十分专业,因而使得员工日常差旅费报账流程比较严谨,填写字段较多,因而差旅费报账耗时较长。鉴于此,我们希望可以利用技术手段,为公司报账系统配一个“小助手”,最大限度地完成报账系统填写以及电子单据填写的自动化。
解决方案的选择
实现办公自动化的最佳解决方案一定是编程。办公自动化的核心是实现文档、系统的自动处理,这种有明确流程的任务使用编程语言来固化是再合适不过的。鉴于python语言的强大功能,我们计划使用它来实现文档和网页的自动处理,从而实现办公自动化。
接下来需要选取处理模块。Python语言处理网页信息的方式为网络爬虫,其可用的模块有多种选项:urllib、requests、beautifulsoup、selenium等,其中前三者广泛用于静态网页的爬取,效率较高,但爬取灵活性略差;后者通过模拟浏览器人工操作,可完成各种基本的键盘鼠标操作,如单双击、填写表单、回车等,使用灵活,但效率比前三者低一些。综合考量,我们选择selenium模块来处理报账信息的网页填写,而对于效率问题,此模块处理效率还是远高于人工,已能够满足要求。对于word和excel文档的填写,我们选用简单好用的docx和openpyxl模块。
然后选择浏览器。鉴于Chrome浏览器成熟稳定,全球使用广泛,且此浏览器具有完美支持Python语言调用的Chromedriver驱动,因而选择Chrome浏览器登陆报账系统。
功能的实现
该程序的整体思路:首先将报账信息全部聚合在一张表格中,然后通过openpyxl模块读取表格信息,通过selenium自动操控浏览器,将报账信息按字段要求填写在报账平台里,同时读取报账平台报账单号等信息,最后通过docx和openpyxl模块将所需信息填至报账所需电子文档模板中。以下是详细分解步骤:
1、制作一张报账信息汇总表,只需填写姓名、行程、住宿等必要信息,重复字段、默认字段均被省略。相关保留字段已固化至Excel表格的下拉表单中。
2、开始码代码,首先导入各种模块。
#导入selenium库from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support.ui import Selectfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support.select import Selectfrom selenium.webdriver.common.action_chains import ActionChains#导入excel库import openpyxlfrom openpyxl.styles import Border,Side,Font#导入word库import docxfrom docx import Document from docx.shared import Ptfrom docx.oxml.ns import qnfrom docx.enum.text import WD_PARAGRAPH_ALIGNMENT#其他import time,datetime,re
3、使用openpyxl模块读取报账信息汇总表中的数据信息。该模块对单元格读写的语句十分简洁,完整代码如下。
#######%$^%&表格数据录入:File='报账信息汇总.xlsx'wb = openpyxl.load_workbook(File)wb.encoding='utf-8'ws = wb["基本信息"]bumen=ws['A2'].value#部门print(bumen,end='\n')name=ws['B2'].value#姓名print(name,end='\n')why=ws['C2'].value#出差事由print(why,end='\n')kind=ws['D2'].value#出差类型print(kind,end='\n')startdate=ws['E2'].value#出发时间print(startdate,end='\n')enddate=ws['F2'].value#到达时间print(enddate,end='\n')trafficnum=ws['G2'].value#循环读取行程明细print(trafficnum,end='\n')trafficpay=ws['H2'].value#交通补贴print(trafficpay,end='\n')mealpay=ws['I2'].value#伙食补贴print(mealpay,end='\n')fapiao=ws['J2'].value#发票有无print(fapiao,end='\n')if startdate==enddate: time0=startdateelse: time0=startdate+'至'+enddatezhaiyao='常州移动'+bumen+name+'报销本人于'+time0+why+'差旅费'print(zhaiyao)hotelpay=[]fapiaonum=ws['K2'].value#发票数量if fapiao=='是': print(fapiaonum) hotelpay=[] fapiaoNO=[] fapiaoID=[] duty=[] for i in range(fapiaonum):#依次填写每张发票信息 hotelpay.append(ws['L'+str(i+2)].value)#住宿费 fapiaoNO.append(ws['M'+str(i+2)].value)#发票代码 fapiaoID.append(ws['N'+str(i+2)].value)#发票号码 duty.append(ws['O'+str(i+2)].value)#税点 print(hotelpay) print(type(hotelpay)) print(fapiaoNO) print(type(fapiaoNO)) print(fapiaoID) print(duty)travelNO=ws['Q2'].value#出差审批单号user=ws['R2'].value#password=ws['S2'].value######读取行程信息ws = wb["行程明细"]startaddr=[]endaddr=[]godate=[]arrivedate=[]traffictool=[]
4、使用selenium模块操控Chrome浏览器,完成OA登录、报账系统进入及报账信息填写,selenium使用”find_element_by_id”等方法对网页元素定位,此步骤需要进入开发者模式查看网页代码(Chrome可使用F12快捷键),对照网页源代码可定位网页所有元素。如下所示,定位到OA密码的input框的id属性为"password",我们就可以使用driver.find_element_by_id("password")的方式定位到这个input框:
Selenium提供了常用鼠标操作”.send_keys”、”.click”等方法,”.send_keys”为键盘输入,可用于填写表单,”.click”为鼠标点击,可用于按钮点击、下拉菜单选择等。如上图,在定位密码输入框后即可以使用”.send_keys(你的密码)”完成密码自动填写,完整代码为driver.find_element_by_name("password").send_keys(你的密码)。
下面展示了OA登录的完整代码,由于需要手动填写验证码,故做了一个while循环监测是否已登录成功。报账单填写代码类似。
driver = webdriver.Chrome()driver.get("http://emis.js.cmcc/")driver.maximize_window()locator = (By.ID,"userid") ele = WebDriverWait(driver,10).until(EC.presence_of_element_located(locator))ddd=driver.find_element_by_id("userid")ddd.clear()ddd.send_keys(user) #账号locator1 = (By.ID,"password") try: ele = WebDriverWait(driver,10).until(EC.presence_of_element_located(locator1)) driver.find_element_by_name("password").send_keys(password)#密码except: print("1ele can't find")####这里留手动输入图片验证码locator2 = (By.ID,"veryCode") try: ele = WebDriverWait(driver,10).until(EC.presence_of_element_located(locator2)) driver.find_element_by_id("veryCode").click() #time.sleep(1) #密码except: print("2ele can't find")#######################################while 1: try: elex = driver.find_element_by_id("welcomeMsg").text except: elex='' if name in elex[:4]:break#登录成功 time.sleep(5)
5、最后使用docx、openpyxl模块”.load_workbook”、”.add_run”等方法对报账文档进行报账单号等相关字段的填写及格式控制。下面展示了填写垫付说明word的完整代码:
######垫付说明word:document = Document('员工垫付说明(差旅费).docx')p = document.paragraphs[2]p0=p.textp.clear()print(p0)p01=re.sub('[A-Za-z0-9]+',NO,p0)print(p01)####报账单:p011=p01[:3]run1 = p.add_run(p011)font = run1.fontfont.size = Pt(14)####单号加下划线:zhong=re.search('中',p01).span()p012=p01[3:zhong[0]]print(zhong[0])print(p012)run2 = p.add_run(p012)font = run2.fontfont.name=u'宋体'font.size = Pt(14)run2.underline = True####后面的-员工:gong=re.search('员工',p01).span()p013=p01[zhong[0]:gong[1]]run3 = p.add_run(p013)font = run3.fontfont.size = Pt(14)####员工名字:xian=re.search('先行垫付',p01).span()p014=p01[gong[1]:xian[0]]run4 = p.add_run(' '+name+' ')#####namefont = run4.fontfont.size = Pt(14)run4.underline = True#####后面:p015=p01[xian[0]:]run5 = p.add_run(p015)font = run5.fontfont.size = Pt(14)document.save('员工垫付说明(差旅费).docx')
整体使用效果展示
1、
填写报账信息汇总表,包含基本信息以及行程信息2
个sheet
,共计25
2、运行程序,程序将自动操控浏览器,使用Chromedriver打开Chrome浏览器,登录OA。
自动进入报账平台,自动新建一张差旅费报账单,并自动填写相关内容。
同步自动读取报账单号等信息,并将信息填写至电子报账文档相应字段。
至此,程序已自动完成报账单新建和填写以及报销电子文档填写,之后只需一键提交报账单、一键打印电子文档即可。总结起来就是,表格一填,程序一挂,全部搞定,这酸爽,不敢相信!妈妈再也不用担心我的报账了!
(阙晓航 13906110972)
公司员工经常性出差,返程后需要进行差旅费报账,而由于国家对国企的严格规范,公司财务系统十分专业,因而使得员工日常差旅费报账流程比较严谨,填写字段较多,因而差旅费报账耗时较长。鉴于此,我们希望可以利用技术手段,为公司报账系统配一个“小助手”,最大限度地完成报账系统填写以及电子单据填写的自动化。解决方案的选择实现办公自动化的最佳解决方案一定是编程。办公自动化的核心是实现文档、系统的自动处理,...
Python
学习(3)计算个人所得税前言一.
Python
准备二.
Python
仿真三. 仿真结果四. 小结
随着人工智能研究的不断兴起,
Python
的应用也在不断上升,由于
Python
语言的简洁性、易读性以及可扩展性,特别是在开源工具和深度学习方向中各种神经网络的应用,使得
Python
已经成为最受欢迎的
程序
设计语言之一。由于完全开源,加上简单
易学、易读、易维护、以及其可移植性、解释性、可扩展性、可扩充性、可嵌入性:
丰富的库等等,自己在学习与工作中也时常接触到
Python
,这个系列文章的话主要就
pip install
python
-docx
然后在pycharm中用import 语句引导安装:
from docx import Document #给pycharm导入这个模块,才能在pycharm中执行word文档操作
下面这几个包,是
加载一个Jupyter插件后,无需写代码就能做数据分析,还帮你生成相应代码?
没错,只需要加载这个名为Mito的小工具包,用
Python
做数据分析,变得和用Excel一样简单:
绝了,这6个精挑细选的机器学习资料简直太香了
Python
编程从入门到实战,看这一篇足够了
Python
开发者的 10 大编程开发环境(IDE),第一款是我的最爱
以 Excel 为代表的
电子
表格是探索数据集的最重要、最具适应性的方式之一。它可以帮助对数据类型进行必要的更改、创建新特征、对数据进行排序以及从
用
python
最麻烦的就是导入所需要的包,
实现
这个
自动
登录需要下载time包用来给浏览器做一个缓冲等待时间;selenium用来启动浏览器、填写用户信息、提交等;PIL用来截图;
百度的Aip用来获取截图中的验证码。这里我会详细介绍如何导入这些包
提示:以下是本篇文章正文内容,下面案例可供参考
一、前期准备
导入包,这里我主要介绍百度的aip如何去下载,其他如果没有包的话,用pip下载就可以了。