python自动化办公知识点整理汇总_python自动化办公小结
在日常辦公中,經常免不了和Excel打交道,每次手工處理數據,稍微不細心點。數據可能就出錯了。而且重復的任務又會占據大量的工作時間。那有沒有辦法可以解決這些問題呢?
今天介紹一種方法,可以解決日常工作的重復工作,節省時間,從而優化自己工作。今天說的就是通過Python語言的selenium+numpy+js+pandas庫。完成自動化辦公。
首先,需要通過Python+Selenium+Js 封裝一個函數get,用于在公司管理平臺下載各類所需的數據表(如果數據是直接以excel提供,則忽略此步驟)。自動化辦公目錄圖片如下:
123456.png
封裝的數據獲取的get函數:
from selenium import webdriver
import time,random
import json,os
from selenium.webdriver.support.select import Select
import cv2
'''封裝函數,自動登錄 //*[@id="img"]驗證碼xpath'''
class cook:
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(120)
try:
self.cook_login()
time.sleep(3)
if self.driver.title != '需求管理平臺':
print('cookie login fail')
'''彈出框處理#send_keys(Keys.ENTER)'''
self.driver.switch_to.alert.accept()
except:
time.sleep(2)
self.driver.delete_all_cookies()
self.driver.get('url')
self.login()
self.cookies_write()
#cookies寫入,從而每次調用可以跳過驗證碼
def cookies_write(self):
dictCookies = self.driver.get_cookies()
jsonCookies = json.dumps(dictCookies)
os.remove('C:/Users/lenovo/Downloads/cookies4.json')
time.sleep(2)
with open('C:/Users/lenovo/Downloads/cookies4.json', 'w') as f:
f.write(jsonCookies)
print(type(jsonCookies),jsonCookies)
print('收集完成cookie')
'''
:param 賬號密碼
'''
def login(self,user='賬號',pwd='密碼'):
time.sleep(1.5)
self.driver.find_element_by_id('j_username').send_keys(user)
time.sleep(1)
self.driver.find_element_by_id('j_password').send_keys(pwd)
# img_yzm = self.driver.find_element_by_xpath('//*[@id="img"]')
# img_yzm.screenshot(r'D:\360MoveData\Users\lenovo\Music\Desktop\yzm.jpg')
# time.sleep(1)
# image1 = cv2.imread(r'D:\360MoveData\Users\lenovo\Music\Desktop\yzm.jpg')
# cv2.imshow('image', image1)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
code = input('\n請輸入驗證碼:')
self.driver.find_element_by_id('code').send_keys(code)
log_in = self.driver.find_element_by_xpath("//input[@value='登錄']")
log_in.click()
while self.driver.title == '首頁登錄':
self.login()
def cook_login(self):
with open('C:/Users/lenovo/Downloads/cookies4.json', 'r') as f:
#, encoding='utf-8')
listCookies = json.loads(f.read())
self.driver.get('http://iimp.sh.cmcc/rip/login.do')
self.driver.delete_all_cookies()
for i in listCookies:
self.driver.add_cookie(i)
self.driver.get('http://iimp.sh.cmcc/rip/chaxun.do')
self.cookies_write()
''':return 網址dict'''
#返回各類數據的一個字典,從而可以通過鏈接進行下載
def back(self):
report_list = []
for link in self.driver.find_elements_by_xpath("//*[@id='sf-menu2']/li/a"):
herf = link.get_attribute('href')
text = link.get_attribute('text')
lis1 = [text, herf]
report_list.append(lis1)
report_list = dict(report_list)
return report_list
'''更改時間
:param form H5標簽的id
:param t 更改的時間'''
def alter_time(self,form, t):
js = "document.getElementById('%s').removeAttribute('readonly');" % form
self.driver.execute_script(js)
js_value = "document.getElementById('%s').value='%s'" % (form, t)
self.driver.execute_script(js_value)
'''導出報表函數'''
def report(self,name,start,end):
report_list = self.back()
if name == '政企業務需求報表':
self.driver.get(report_list['政企業務需求報表'])
self.driver.find_element_by_xpath(
'//*[@id="bd"]/div[1]/div[2]/table/tbody/tr/td/table/tbody/tr/td/input').click()
elif name == '政企KPI跟蹤報表':
self.driver.get(report_list['政企KPI跟蹤報表'])
self.driver.find_element_by_xpath(
'//*[@id="bd"]/div[1]/div[2]/table/tbody/tr/td/table/tbody/tr/td/input').click()
time.sleep(3)
elif name == '需求確認時間查詢報表':
self.driver.get(report_list['需求確認時間查詢報表'])
self.alter_time('confirmTimeStart', start)
self.alter_time('confirmTimeEnd', end)
self.driver.find_element_by_xpath('// *[ @ id = "export"]').click()
elif name == 'PATCH計劃':
self.driver.get(report_list['PATCH計劃'])
self.alter_time('planTimeStart', start)
self.alter_time('planTimeEnd', end)
self.driver.find_element_by_xpath(
'//*[@id="bd"]/div/div[2]/table/tbody/tr/td/table/tbody/tr[10]/td/input[2]').click()
elif name == '業支廠商工時報表':
self.driver.get(report_list['業支廠商工時報表'])
self.alter_time('planTimeStart', start)
self.alter_time('planTimeEnd', end)
self.driver.find_element_by_xpath(
'//*[@id="bd"]/div/div[2]/table/tbody/tr/td/table/tbody/tr[2]/td/input[2]').click()
elif name == '測試進度報表':
self.driver.get(report_list['測試進度'])
self.alter_time('planTimeStart', start)
self.alter_time('planTimeEnd', end)
time.sleep(1)
self.driver.find_element_by_xpath('//*[@id="testPerson"]').clear()
self.driver.find_element_by_xpath(
'//*[@id="bd"]/div/form/div[1]/table/tbody/tr/td/table/tbody/tr[3]/td/input[2]').click()
elif name == '缺陷工單修復時長報表':
self.driver.get(report_list['缺陷工單修復時長報表'])
self.alter_time('planOnlineTimeStart', start)
self.alter_time('planOnlineTimeEnd', end)
self.driver.find_element_by_xpath(
'//*[@id="bd"]/div/div[2]/table/tbody/tr/td/table/tbody/tr[5]/td/input[2]').click()
elif name == '需求查詢':
self.driver.get(report_list['需求查詢'])
self.alter_time('time', start)
self.alter_time('time1', end)
'''下拉選框選擇'''
Select(self.driver.find_element_by_xpath("//select[@id='remandType']")).select_by_visible_text('業務支撐')
time.sleep(2)
Select(self.driver.find_element_by_xpath("//select[@id='secondSelect']")).select_by_visible_text('集團下發')
self.driver.find_element_by_xpath("//*[@name='importBtn']").click()
elif name == '敏捷工時統計報表':
self.driver.get(report_list['敏捷工時統計報表'])
self.alter_time('planTimeStart', start)
self.alter_time('planTimeEnd', end)
self.driver.find_element_by_xpath('//*[@id="bd"]/div[1]/div[2]/table/tbody/tr/td/table/tbody/tr[4]/td/input[2]').click()
else:
print('發生錯誤,請檢查判斷條件')
def quit(self):
self.driver.quit()
準備工作完成后,然后利用Pandas對表格進行處理,處理數據的步驟:讀取、排序、篩選、去重、計算時間差、透視表、交叉表,刪除數據、時間修改以及excel的函數:計算首次上線、計算上線次數、計算最后一次上線等等。
以一個每日任務代碼為例,代碼如下:
'''政企KPI任務報表'''
from control.common.get import cook
from control.common import demand
import time, os, datetime
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
# 每次記得更新時間
start = '2020-01-01'
end = '2021-01-31'
'''政企任務的報表下載'''
report1 = cook()
report1.report('PATCH計劃', start, end)
report1.report('政企業務需求報表', start, end)
report1.report('政企KPI跟蹤報表', start, end)
time.sleep(3)
#定義需要剔除考核的工單列表
zq_data = [政企工單列表]
sj_data = [數據工單列表]
#創建,處理后數據的導出路徑
t1 = demand.ltime(0)
t1path = r'D:\數據統計\12.政企KPI日報/' + t1
if not os.path.exists(t1path):
os.makedirs(t1path)
os.chdir(t1path)
def clean():
time.sleep(2)
#數據讀取
data1 = pd.read_excel(r'C:\Users\lenovo\Downloads\政企業務需求報表.xls')
data2 = pd.read_excel(r'C:\Users\lenovo\Downloads\PATCH計劃2.xls')
df1 = data1.copy()
df1.index = df1['工單編號']
#數據排序和計算
df1.sort_values(by=['工單編號', '上線時間'], inplace=True, ascending=True)
df1['外部工時'][df1['是否重復'] == '是'] = df1[df1['是否重復'] == '是']['外部工時'] / 2
'''刪除指定的工單'''
for i in zq_data:
demand.drop_data(df1, i)
'''修改時間'''
df1.loc[工單編號1, '上線時間'] = '2018-04-24'
df1.loc[工單編號2, '上線時間'] = '2018-03-30'
df1.loc[工單編號3, '創建時間'] = '2018-06-12'
df1.loc[工單編號4, '創建時間'] = '2018-06-12'
df1.loc[工單編號5, '創建時間'] = '2018-06-28'
#更改值為時間格式
df1['需求確認'] = pd.to_datetime(df1['需求確認']) # ,format='%Y-%m-%d')
df1['到達時間'] = pd.to_datetime(df1['到達時間'])
df1['上線時間'] = pd.to_datetime(df1['上線時間'])
lst = df1[df1['到達時間'].isnull()].工單編號.unique().tolist()
print(lst)
#替換指定工單時間
for i in lst:
df1.loc[i]['到達時間'] = df1.loc[i]['需求確認'] - datetime.timedelta(2)
df1.loc['政企-2018-17184', '到達時間'] = pd.to_datetime('2018-12-08')
# 修改時間為年-月-日 去除時分秒
df1['需求確認'] = df1['需求確認'].apply(lambda x: x.strftime('%Y-%m-%d'))
df1['到達時間'] = df1['到達時間'].apply(lambda x: x.strftime('%Y-%m-%d'))
df1['上線時間'] = df1['上線時間'].apply(lambda x: x.strftime('%Y-%m-%d'))
df2 = data2.copy()
df2.index = df2['工單編號']
df2['計劃上線時間'] = pd.to_datetime(df2['計劃上線時間'])
df2.sort_values(by='計劃上線時間', inplace=True, ascending=True)
#計算最后一次上線工單
df2 = df2.groupby('工單編號').last()
df2['計劃上線時間'] = df2['計劃上線時間'].apply(lambda x: x.strftime('%Y-%m-%d'))
# 篩選出指定部門的工單
df2 = df2[df2['提出部門'].str.contains('數據業務中心') | df2['提出部門'].str.contains('產品運營支撐中心') | df2['提出部門'].str.contains('客戶響應與產品運營中心')]
# 篩選出指定需求負責人的工單,后期用字典實現篩選
df2 = df2[df2['需求負責人'].str.contains('name1') | df2['需求負責人'].str.contains('name2') |
df2['需求負責人'].str.contains('name3') | df2['需求負責人'].str.contains('name4') |
df2['需求負責人'].str.contains('name5') | df2['需求負責人'].str.contains('name6') |
df2['需求負責人'].str.contains('name7') | df2['需求負責人'].str.contains('name8') |
df2['需求負責人'].str.contains('name9') | df2['需求負責人'].str.contains('name10') |
df2['需求負責人'].str.contains('name11') | df2['需求負責人'].str.contains('name12')]
# 刪除指定的行
for i in sj_data:
try:
demand.drop_data(df2, i)
except:
print('無法刪除的行:%s' % i)
df2['工單編號'] = df2.index
data3 = pd.read_excel(r'D:\360MoveData\Users\lenovo\Music\Desktop\svn\政企KPI日報.xlsx')
data3.index = data3['工單編號']
a = data3[data3.index.str.contains('數據')][['需求確認', '到達時間']]
a['需求確認'] = pd.to_datetime(a['需求確認'])
a['到達時間'] = pd.to_datetime(a['到達時間'])
a['需求確認'] = a['需求確認'].apply(lambda x: x.strftime('%Y-%m-%d'))
a['到達時間'] = a['到達時間'].apply(lambda x: x.strftime('%Y-%m-%d'))
#兩張數據表合并
df2 = pd.merge(df2, a, left_index=True, right_index=True, how='left')
concat2 = df2[['工單編號', '工單名稱', '工單簡介', '創建人', '需求負責人', '創建時間', '需求確認', '計劃上線時間', '到達時間']]
#修改列名
concat2.rename(columns={'計劃上線時間': '上線時間', '工單簡介': '簡介'}, inplace=True)
df = pd.concat([df1, concat2])
#數據排序,后期用insert插入方式實現
df = df[['工單編號', '工單名稱', '簡介', '創建人', '需求負責人', '創建時間', '需求確認', '上線時間', '到達時間',
'期望上線時間', '需求期望上線時間', '到達總控時間', '一級總控拆分', '來源部門', '工單大類', '工單類型',
'一級業務標簽', '二級業務標簽', '一級指標庫標簽', '二級指標庫標簽', '三級指標庫標簽', '上線次數', '外部工時',
'是否重復']]
print('數據已經處理完成,正在導出中……')
os.chdir(r'D:\360MoveData\Users\lenovo\Music\Desktop')
# 寫入Excel,并導出
shet = pd.ExcelWriter('政企KPI日報.xlsx')
df.to_excel(shet, sheet_name='政企KPI報表', index=False)
df1.to_excel(shet, sheet_name='政企需求表')
df2.to_excel(shet, sheet_name='patch計劃表')
shet.close()
print('本次政企據共%i條' % len(df1))
print('本次數據共%i條' % len(df2))
print('本次政企日報數據共%i條' % len(df))
print('\n在' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '分,導出處理后數據')
通過自動化,以前每次一小時左右完成的數據處理任務,現在只需要幾分鐘就可以完成。而且自動化處理的數據準確性高,防止手工操作可能由于一些原因導致數據的不準確性。自動化省出來工作時間,從而可以用于繼續封裝其他任務,提高整體效率。從而進入一個良性循環,低成本,高回報。
總結
以上是生活随笔為你收集整理的python自动化办公知识点整理汇总_python自动化办公小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022国内汽车召回盘点 特斯拉成“召回
- 下一篇: 新年换笔记本的最佳选择!华为笔记本斩获1