首頁 > 軟體

Python操作xlwings的範例詳解

2022-07-27 18:02:25

阿里雲產品費用巡檢,一般流程是登入賬號,再逐項核對填寫。雖然簡單,但如果帳號多表格多,帳號間的資料有關聯,填寫起來就比較費力氣。幾張表格,可能從下載資料到核寫完畢,輾轉半個小時。

因此在保留excel原檔案格式不變的基礎上,自動填寫相關數值變得重要。

python操作excel的模組多,xlrd,pandas,xlwings,openpyxl。經常搞不清這麼多功能類似的模組有什麼區別,這裡發現xlwings可以派上用場,因為我有個保留excel格式的需求,檔案格式:

表1-1

注意:主要修改第10、11行,其它不變。

資料來源

通過爬蟲登入阿里雲,下載資料寫入csv。帶上日期,如data_07-25.csv

表1-2

爬蟲指令碼

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time,os,glob,csv
from datetime import datetime

options = Options()
options.add_argument('--disable-infobars')
options.add_argument('--incognito')
# options.add_argument('--headless')
bro = webdriver.Chrome(executable_path='C:drf2drf2chromedriver.exe', chrome_options=options)
bro.maximize_window()
bro.get('https://www.aliyun.com/')
bro.implicitly_wait(10)

#點選首頁的登入按鈕
bro.find_element_by_xpath('//*[@id="J_3207526240"]/div/div/div[1]/div[2]/div[2]/a[4]').click()
time.sleep(1)
#點選RAM使用者
bro.find_element_by_xpath('//*[@id="root"]/div/div[2]/div/div[2]/div[1]/div[2]/div[2]/div/div[2]/div[2]/span/div').click()

u = bro.find_element_by_xpath('//*[@id="--aliyun-xconsole-app"]/div[1]/div[2]/div/div/div[1]/div[2]/div/div/div[2]/div/div/div/form/div[1]/div[2]/div[1]/span/input')
#使用者名稱
u.send_keys('')
time.sleep(5)
#點選下一步
bro.find_element_by_xpath('//*[@id="--aliyun-xconsole-app"]/div[1]/div[2]/div/div/div[1]/div[2]/div/div/div[2]/div/div/div/form/div[5]/button/span').click()
p = bro.find_element_by_xpath('//*[@id="--aliyun-xconsole-app"]/div[1]/div[2]/div/div/div[1]/div[2]/div/div/div[2]/div/div/div/form/div[2]/div[2]/span/input')
#密碼
p.send_keys('')
time.sleep(5)
# 點選登入按鈕
bro.find_element_by_xpath('//*[@id="--aliyun-xconsole-app"]/div[1]/div[2]/div/div/div[1]/div[2]/div/div/div[2]/div/div/div/form/div[5]/button/span').click()
time.sleep(3)
# 點選控制檯
bro.find_element_by_xpath(
    '//*[@id="J_3207526240"]/div/div/div[1]/div[2]/div[2]/a[3]').click()
time.sleep(6)
#切換視窗
bro.switch_to.window(bro.window_handles[-1])
# 點選費用
bro.find_element_by_xpath(
    '/html/body/div[1]/div/div/nav/div[1]/a').click()
time.sleep(3)
bro.switch_to.window(bro.window_handles[-1])
available_credit = bro.find_element_by_xpath('//*[@id="app__home"]/div/div/div/div[2]/div[1]/div[1]/div[2]/div/div[1]/span[1]/span').text
time.sleep(3)
#點選帳單詳情
bro.find_element_by_xpath(
    '//*[@id="root-app"]/div[1]/div/div[6]/div[3]/a').click()
time.sleep(1.5)
#點選產品量價彙總
bro.find_element_by_xpath(
    '//*[@id="app__ent-expense"]/div/div/div[1]/div[1]/div/div/div/ul/li[4]/div/span').click()
time.sleep(1.5)

trs = bro.find_elements_by_xpath('//tbody/tr[position()> 1]')

for f in os.listdir('C:/Users/Administrator/Desktop/費用巡檢/'):
    if f.startswith('fee'):
        os.remove('C:/Users/Administrator/Desktop/費用巡檢/%s' % f)
with open('C:/Users/Administrator/Desktop/費用巡檢/fee_%s.csv' % datetime.now().__format__('%m-%d'), 'a+', newline='', encoding='gb18030') as f:
    f_csv = csv.writer(f)
    f_csv.writerow(['可用額度',available_credit.split(' ')[1]])
    for tr in trs:
        tr = tr.text.split('n')
        f_csv.writerow([tr[0],tr[1].split(' ')[1]])

bro.quit()

上手

pandas讀取表1-2的資料

為了方便識別,變數名直接用中文了

import pandas as pd

df = pd.read_csv('data_%s.csv' % datetime.now().__format__('%m-%d'), encoding='gbk', names=['內容', '金額'])
內容安全 = eval(df.iloc[5, 1])
系統簡訊 = 0
雲伺服器ECS流量 = eval(df.iloc[4, 1])
物件儲存 = eval(df.iloc[8, 1])
檔案儲存 = eval(df.iloc[6, 1])
視訊點播 = eval(df.iloc[11, 1])
巨量資料 = eval(df.iloc[2, 1]) + eval(df.iloc[7, 1])
CDN = eval(df.iloc[1, 1])
紀錄檔服務 = eval(df.iloc[10, 1])
塊儲存 = eval(df.iloc[3, 1])
合計 = round(內容安全 + 系統簡訊 + 雲伺服器ECS流量 + 物件儲存 + 檔案儲存 + 視訊點播 + 巨量資料 + CDN + 紀錄檔服務 + 塊儲存, 2)
餘額 = eval(df.iloc[0, 1].replace(',', ''))

xlwings獲取表1-1sheet

import xlwings as xw
from datetime import datetime
import os

app = xw.App(visible=False,add_book=False)
app.display_alerts = False
app.screen_updating = False

wb = app.books.open(filename)
ws = wb.sheets[0]

xlwings修改表1-1資料

# 修改第10行,expand引數可以方便的按順序一行寫完
ws.range('B10').options(expand='table').value = [內容安全, 系統簡訊, 雲伺服器ECS流量, 物件儲存, 檔案儲存, 視訊點播, 巨量資料, CDN, 紀錄檔服務, 塊儲存, 合計,
                                                    餘額]

# 修改第11行
ws.range('e41').value = '本月(%s月)已使用%s元,實際賬戶餘額為%s元。' % (datetime.now().month, 合計, 餘額)
path = 'D:/桌面/巡檢/%s' % datetime.now().__format__('%m-%d')
if not os.path.exists(path):
    os.mkdir(path)
wb.save(os.path.join(path,'教育費用_%s.xlsx' % datetime.now().__format__('%m-%d')))
wb.close()
app.quit()

總結

通過使用xlwings自動修改表格,我的6張表格從原先的操作半小時,到現在滑鼠duang~duang~duang~幾下即可做好。減少上百次的複製貼上點選後,工作更輕鬆了。

到此這篇關於Python操作xlwings的範例詳解的文章就介紹到這了,更多相關Python xlwings內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com