一 目的
我們在工作中時長會用到一些在線表格實現(xiàn)多人協(xié)作,但是有事會遇到一些例如數(shù)據(jù)的錄入等人工操作過于麻煩,或者需要周期性的操作,我們希望使用自動化的方式在指定的數(shù)據(jù)源獲取數(shù)據(jù)然后按照指定的要求填入在線表格
二 實現(xiàn)效果
【GIF】
三 實現(xiàn)過程簡介
有兩種實現(xiàn)方式:
1、本地操作表格之后進(jìn)入導(dǎo)入在線文檔
本地實現(xiàn)表格的操作就不多說,有多種方式來實現(xiàn),無非是導(dǎo)入在線表格,這里我們也是需要提前登錄才行,一般的上傳導(dǎo)入重名也不會出現(xiàn)覆蓋的情況所以我們相當(dāng)于生成一個新的表格,
在操作之前我們可以下載舊的表格數(shù)據(jù),再次基礎(chǔ)上進(jìn)行操作
然后再上傳導(dǎo)入,導(dǎo)入之前記得刪除原表格
2、直接操作在線文檔
實現(xiàn)在線文檔的編輯三步走:
1、設(shè)置瀏覽器和代理調(diào)用UI自動化操作的時候直接操作已打開的瀏覽器
2、登錄在線文檔:在打開的瀏覽器打開并登錄在線文檔--此文直接進(jìn)入需要操作的文檔
3、通過鍵盤操作來實現(xiàn)文檔內(nèi)容的增刪改查【登錄用戶要具備相應(yīng)的權(quán)限】
本文只要講解第二種方式。
四 實現(xiàn)步驟講解
1、實現(xiàn)方法的選擇
在接到需求的時候首先想到的就是接口的方式,沒辦法誰讓它最為習(xí)慣也最為穩(wěn)定呢,但是在調(diào)研過程中發(fā)現(xiàn)兩個比價難以突破的問題:
1、接口請求時需要使用cookie,存在多個cookie而且有時效性,無法實現(xiàn)保持可用cookie
2、在線表格內(nèi)容發(fā)生變更接口保存數(shù)據(jù)后分析難度比較高
最終放棄此方式,因為本身對自動化有所研究就考慮使用UI自動化的方式來實現(xiàn),有存在新的問題
1、登錄:UI自動化打開新網(wǎng)頁需要登錄【已解決】
2、表格內(nèi)容屬于畫布里面,只能定位到畫布,畫布內(nèi)部無法精確定位到每個表格【已解決】
2、導(dǎo)入類庫
from selenium import webdriver #調(diào)用webdriver
from selenium.webdriver.chrome.options import Options #設(shè)置瀏覽器初始化內(nèi)容
from selenium.webdriver.common.by import By #定位元素
from selenium.webdriver.common.keys import Keys #鍵盤操作
3、設(shè)置瀏覽器代理直接操作已打開瀏覽器
保持登錄–取巧:發(fā)現(xiàn)在線文檔只要登錄之后不主動退出/長時間不操作則都可以一直保持登錄,那我們就可以直接操作已經(jīng)登錄的在線文檔不就好啦,但是用過selenium的都知道,調(diào)用webdriver默認(rèn)會打開一個純凈的瀏覽器,后來想到一個就是我不打開新的瀏覽器,直接操作已經(jīng)打開的瀏覽器是不是就能實現(xiàn)。
下面是實現(xiàn)過程:
(1)打開瀏覽器設(shè)置端口調(diào)試代理和數(shù)據(jù)存儲:
# 進(jìn)入瀏覽器的安裝目錄中【可以在任務(wù)管理器跳轉(zhuǎn)過去】打開CMD窗口執(zhí)行下面命令既可【注意端口號和用戶數(shù)據(jù)存儲位置是可以改的】
chrome.exe --remote-debugging-port=9222 --user-data-dir="G:\test"
#9222 是端口號,最好不要和本機(jī)其他端口號沖突,G:\test打開的瀏覽器用戶數(shù)據(jù)存儲,這里設(shè)置一個存在的目錄既可
#回車之后會打開一個空白的瀏覽器,在這個瀏覽器上登錄就行,
(2)webdriver的初始化中寫入調(diào)試的數(shù)據(jù)就可以操作打開的瀏覽器,而不是重新打開新的
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
此時再執(zhí)行腳本就是操作我們上面打開的瀏覽器,不是沖洗打開空白瀏覽器啦
4、在線文檔登錄
沒啥可多說的,上一步打開的瀏覽器掃碼之類的登錄就行
5、在線文檔表格數(shù)據(jù)操作
本來想著修改哪一行數(shù)據(jù)直接定位哪一行雙擊修改既可,但是出現(xiàn)了一個小意外:表格是在一個畫布上,想定位畫布上的表格發(fā)現(xiàn)不能進(jìn)行下一步的定位啦,這讓我毫升的郁悶?zāi)?br>
最終查閱了一些資料找尋到了兩種可行的辦法
(1)坐標(biāo)定位
我們可以定位到畫布,畫布是有坐標(biāo)的,我們可以通過不斷變更坐標(biāo)的位置來實現(xiàn)表格定位,
但是有一個弊端,如果表格大小發(fā)生變更了,那之前的坐標(biāo)都需要調(diào)整,而且還要手動去滑動表格
ele = 畫布定位
ActionChains(driver).move_to_element_with_offset(ele,X,Y).send_keys('輸入內(nèi)容')
最終此種方法不好用被舍棄
(2)通過鍵盤的操作
發(fā)現(xiàn)我們可以通過剪片的HOME鍵、TAB鍵、ENTER鍵,以及上下鍵實現(xiàn)表格定位
在表格的最上方輸入框是在畫布之外的可以進(jìn)行增刪改查等操作
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.HOME)
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.CONTROL, Keys.UP)
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.ENTER)
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.TAB)
然后我們根據(jù)獲取到的數(shù)據(jù)來進(jìn)行判斷、修改、刪除等操作,也可以進(jìn)行追加寫入,一般是按行寫入
# 這是每行需要寫入的數(shù)據(jù),當(dāng)前就設(shè)置了一行,如果更多的話使用列表就行
list = [1,2,3,54]
# 獲取第一列數(shù)據(jù)
driver.find_element(By.XPATH,'//*[@id="alloy-simple-text-editor"]').click()
txt = driver.find_element(By.XPATH,'//*[@id="alloy-simple-text-editor"]/p').text
# 判斷為空輸入數(shù)據(jù),否則進(jìn)入下一行,追加的方式添加數(shù)據(jù)
if txt =='':
for i in range(len(list)):
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]/p').send_keys(list[i])
driver.find_element(By.XPATH,'//*[@id="alloy-simple-text-editor"]').send_keys(Keys.TAB)#進(jìn)入下一個單元格
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.ENTER) # 進(jìn)入下一個行
6、行數(shù)不夠自動添加行數(shù)
我們都知道插入數(shù)據(jù)的時候在線表格一般只加載200行,需要更多就自己添加,這里我們就可以使用最下方的添加按鈕添加行,當(dāng)然我們要檢測出現(xiàn)添加按鈕–也就是到最后一行之后才點擊添加文章來源:http://www.zghlxwxcb.cn/news/detail-558382.html
# 行數(shù)不夠添加行數(shù)
try:
driver.find_element(By.XPATH, '//*[text()="添加"]').click()
except:
print('不需要擴(kuò)展列表')
五 代碼實現(xiàn)
完整代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-558382.html
# -*- coding: utf-8 -*-
'''
@Time : 2023/7/12 15:39
@File : 在線文檔寫入數(shù)據(jù).py
'''
'''
實現(xiàn)在線文檔的編輯三步走:
1、設(shè)置瀏覽器和代理調(diào)用UI自動化操作的時候直接操作已打開的瀏覽器
2、登錄在線文檔:在打開的瀏覽器打開并登錄在線文檔--此文直接進(jìn)入需要操作的文檔
3、通過鍵盤操作來實現(xiàn)文檔內(nèi)容的增刪改查【登錄用戶要具備相應(yīng)的權(quán)限】
'''
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# 文件存儲位置打開瀏覽器
# chrome.exe --remote-debugging-port=9222 --user-data-dir="G:\test"
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://docs.qq.com/sheet/DTEtLSW5NWldEcWJE?tab=gqke19')
print(driver.title)
j = 0 #使用變量來定位列表
# 移動焦點到第一行第一列
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.HOME)
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.CONTROL, Keys.UP)
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.ENTER)
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.TAB)
# 這是每行需要寫入的數(shù)據(jù),當(dāng)前就設(shè)置了一行,如果更多的話使用列表就行
list = [1,2,3,54]
for i in range(300):#循環(huán)行,這里是操作最大行數(shù)
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.HOME) #先跳到當(dāng)前行的第一列
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').click()
s = driver.find_element(By.XPATH,'//*[@class="bar-label"]').text #獲取此行的行數(shù)
a = int(s[1:])-1 #將A**去除A,留下數(shù)字,如果你的排序為行的相差則減去幾即可
print(a)
# 獲取第一列數(shù)據(jù)
driver.find_element(By.XPATH,'//*[@id="alloy-simple-text-editor"]').click()
txt = driver.find_element(By.XPATH,'//*[@id="alloy-simple-text-editor"]/p').text
# 判斷為空輸入數(shù)據(jù),否則進(jìn)入下一行,追加的方式添加數(shù)據(jù)
if txt =='':
for i in range(len(list)):
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]/p').send_keys(list[i])
driver.find_element(By.XPATH,'//*[@id="alloy-simple-text-editor"]').send_keys(Keys.TAB)#進(jìn)入下一個單元格
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.ENTER) # 進(jìn)入下一個行
# 行數(shù)不夠添加行數(shù)
try:
driver.find_element(By.XPATH, '//*[text()="添加"]').click()
except:
print('不需要擴(kuò)展列表')
小結(jié)
到了這里,關(guān)于騰訊、飛書等在線表格自動化編輯--python的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!