腾讯、飞书等在线表格自动化编辑--python

编辑在线表格

    • 一 目的
    • 二 实现效果
    • 三 实现过程简介
      • 1、本地操作表格之后进入导入在线文档
      • 2、直接操作在线文档
    • 四 实现步骤讲解
      • 1、实现方法的选择
      • 2、导入类库
      • 3、设置浏览器代理直接操作已打开浏览器
      • 4、在线文档登录
      • 5、在线文档表格数据操作
      • 6、行数不够自动添加行数
    • 五 代码实现
    • 小结

一 目的

我们在工作中时长会用到一些在线表格实现多人协作,但是有事会遇到一些例如数据的录入等人工操作过于麻烦,或者需要周期性的操作,我们希望使用自动化的方式在指定的数据源获取数据然后按照指定的要求填入在线表格

二 实现效果

【GIF】

三 实现过程简介

有两种实现方式:

1、本地操作表格之后进入导入在线文档

本地实现表格的操作就不多说,有多种方式来实现,无非是导入在线表格,这里我们也是需要提前登录才行,一般的上传导入重名也不会出现覆盖的情况所以我们相当于生成一个新的表格,
在操作之前我们可以下载旧的表格数据,再次基础上进行操作
然后再上传导入,导入之前记得删除原表格

2、直接操作在线文档

实现在线文档的编辑三步走:
1、设置浏览器和代理调用UI自动化操作的时候直接操作已打开的浏览器
2、登录在线文档:在打开的浏览器打开并登录在线文档--此文直接进入需要操作的文档
3、通过键盘操作来实现文档内容的增删改查【登录用户要具备相应的权限】

本文只要讲解第二种方式。

四 实现步骤讲解

1、实现方法的选择

在接到需求的时候首先想到的就是接口的方式,没办法谁让它最为习惯也最为稳定呢,但是在调研过程中发现两个比价难以突破的问题:
1、接口请求时需要使用cookie,存在多个cookie而且有时效性,无法实现保持可用cookie
2、在线表格内容发生变更接口保存数据后分析难度比较高
最终放弃此方式,因为本身对自动化有所研究就考虑使用UI自动化的方式来实现,有存在新的问题
1、登录:UI自动化打开新网页需要登录【已解决】
2、表格内容属于画布里面,只能定位到画布,画布内部无法精确定位到每个表格【已解决】

2、导入类库

from selenium import webdriver #调用webdriver
from selenium.webdriver.chrome.options import Options #设置浏览器初始化内容
from selenium.webdriver.common.by import By #定位元素
from selenium.webdriver.common.keys import Keys #键盘操作

3、设置浏览器代理直接操作已打开浏览器

保持登录–取巧:发现在线文档只要登录之后不主动退出/长时间不操作则都可以一直保持登录,那我们就可以直接操作已经登录的在线文档不就好啦,但是用过selenium的都知道,调用webdriver默认会打开一个纯净的浏览器,后来想到一个就是我不打开新的浏览器,直接操作已经打开的浏览器是不是就能实现。
下面是实现过程:
(1)打开浏览器设置端口调试代理和数据存储:

# 进入浏览器的安装目录中【可以在任务管理器跳转过去】打开CMD窗口执行下面命令既可【注意端口号和用户数据存储位置是可以改的】
chrome.exe --remote-debugging-port=9222 --user-data-dir="G:\test"
#9222 是端口号,最好不要和本机其他端口号冲突,G:\test打开的浏览器用户数据存储,这里设置一个存在的目录既可
#回车之后会打开一个空白的浏览器,在这个浏览器上登录就行,

(2)webdriver的初始化中写入调试的数据就可以操作打开的浏览器,而不是重新打开新的

chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

此时再执行脚本就是操作我们上面打开的浏览器,不是冲洗打开空白浏览器啦

4、在线文档登录

没啥可多说的,上一步打开的浏览器扫码之类的登录就行

5、在线文档表格数据操作

本来想着修改哪一行数据直接定位哪一行双击修改既可,但是出现了一个小意外:表格是在一个画布上,想定位画布上的表格发现不能进行下一步的定位啦,这让我毫升的郁闷呢
在这里插入图片描述
最终查阅了一些资料找寻到了两种可行的办法
(1)坐标定位
我们可以定位到画布,画布是有坐标的,我们可以通过不断变更坐标的位置来实现表格定位,
但是有一个弊端,如果表格大小发生变更了,那之前的坐标都需要调整,而且还要手动去滑动表格

ele = 画布定位
ActionChains(driver).move_to_element_with_offset(ele,X,Y).send_keys('输入内容')

最终此种方法不好用被舍弃
(2)通过键盘的操作
发现我们可以通过剪片的HOME键、TAB键、ENTER键,以及上下键实现表格定位
在表格的最上方输入框是在画布之外的可以进行增删改查等操作
在这里插入图片描述

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)

然后我们根据获取到的数据来进行判断、修改、删除等操作,也可以进行追加写入,一般是按行写入

# 这是每行需要写入的数据,当前就设置了一行,如果更多的话使用列表就行
list = [1,2,3,54]
# 获取第一列数据
driver.find_element(By.XPATH,'//*[@id="alloy-simple-text-editor"]').click()
txt = driver.find_element(By.XPATH,'//*[@id="alloy-simple-text-editor"]/p').text
# 判断为空输入数据,否则进入下一行,追加的方式添加数据
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)#进入下一个单元格
driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.ENTER)  # 进入下一个行

6、行数不够自动添加行数

我们都知道插入数据的时候在线表格一般只加载200行,需要更多就自己添加,这里我们就可以使用最下方的添加按钮添加行,当然我们要检测出现添加按钮–也就是到最后一行之后才点击添加

    # 行数不够添加行数
    try:
        driver.find_element(By.XPATH, '//*[text()="添加"]').click()
    except:
        print('不需要扩展列表')

五 代码实现

完整代码

# -*- coding: utf-8 -*-
'''
@Time    : 2023/7/12 15:39
@File    : 在线文档写入数据.py
'''

'''
实现在线文档的编辑三步走:
1、设置浏览器和代理调用UI自动化操作的时候直接操作已打开的浏览器
2、登录在线文档:在打开的浏览器打开并登录在线文档--此文直接进入需要操作的文档
3、通过键盘操作来实现文档内容的增删改查【登录用户要具备相应的权限】
'''
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)
# 这是每行需要写入的数据,当前就设置了一行,如果更多的话使用列表就行
list = [1,2,3,54]

for i in range(300):#循环行,这里是操作最大行数
    driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.HOME) #先跳到当前行的第一列
    driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').click()
    s = driver.find_element(By.XPATH,'//*[@class="bar-label"]').text #获取此行的行数
    a = int(s[1:])-1 #将A**去除A,留下数字,如果你的排序为行的相差则减去几即可
    print(a)

    # 获取第一列数据
    driver.find_element(By.XPATH,'//*[@id="alloy-simple-text-editor"]').click()
    txt = driver.find_element(By.XPATH,'//*[@id="alloy-simple-text-editor"]/p').text
    # 判断为空输入数据,否则进入下一行,追加的方式添加数据
    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)#进入下一个单元格
    driver.find_element(By.XPATH, '//*[@id="alloy-simple-text-editor"]').send_keys(Keys.ENTER)  # 进入下一个行

    # 行数不够添加行数
    try:
        driver.find_element(By.XPATH, '//*[text()="添加"]').click()
    except:
        print('不需要扩展列表')

小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/39252.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据采集专家----4通道AD采集子卡推荐

FMC136是一款4通道250MHz采样率16位AD采集FMC子卡,符合VITA57规范,可以作为一个理想的IO模块耦合至FPGA前端,4通道AD通过高带宽的FMC连接器(HPC)连接至FPGA从而大大降低了系统信号延迟。 该板卡支持板上可编程采样时钟…

css 禁止多次点击导致的选中了目标div的文字

像下面这样的情况,就可以用这种方法避免掉 禁止多次点击,导致的,选中了目标div的文字 或者 禁止多次点击,导致,html结构被选中显示出来 .targetDiv {-webkit-user-select: none;-moz-user-select: none;-ms-user-sel…

6.3.6 利用Wireshark进行协议分析(六)----网页提取过程的协议分析

6.3.6 利用Wireshark进行协议分析(六)----网页提取过程的协议分析 利用Wireshark捕获网页访问过程中产生的应用协议报文,还原Web服务中报文的交互过程,为了防止网页直接从本地缓存中获取,我们首先需要清空浏览器保存的…

Vue3 概述

文章目录 Vue3 概述概述Vue3对比Vue2优势选项式API和组合式API使用create-vue创建项目概述创建项目目录结构 使用vue-cli创建项目概述创建项目目录结构 Vue3 概述 概述 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTM…

关于 Eclipse 的一场 “三角关系”

上个世纪 90 年代,世界上的计算机要么不联网,要么在企业内部联网。但是,在互联网的概念下,计算机之间共享信息和资源的需求成为了必要。 1995 年 5 月,Java 横空出世。Java 的父亲是当时凭借 Solaris 操作系统风头正盛…

go初识iris框架(二) - get,post请求和数据格式

继初步了解iris后 文章目录 获取url路径获取数据get请求post请求获取JSON数据格式JSON返回值获取XML数据格式XML返回值 获取url路径 package mainimport "github.com/kataras/iris/v12"func main(){app : iris.New()app.Get("/hello",func(ctx iris.Conte…

Vue 安装 Vue-router 路由安装以及使用

vue-router 是 Vue 的一个插件库,适用于构建单页面应用。 单页面应用:整个应用中只有一个完整的页面,切换页面就是替换页面中的内容。 工作原理:当浏览器的路径发生改变时,路由器会自动显示路径所对应的组件。 嵌套…

Redis的数据淘汰策略了解吗?

面试官:Redis数据淘汰策略了解吗? 我:知道。嗯~~ 当Redis中的内存不够用时,此时再向Redis中添加新的key,Redis就会按照某种规则将内存中的数据删除掉。这种数据的删除规则被称为内存的淘汰策略。 面试官:…

JAVA开发(记一次504 gateway timeout错误排查过程)

一、问题与背景: 最近在发布一个web项目,在测试环境都是可以的,发布到生产环境通过IP访问也是可以的,但是通过域名访问就出现504 gateway timeout。通过postman去测试接口也是一样。ip和端口都可以通,域名却不行&…

C#List转IList方法

最近工作中使用到了C#的List和IList。 这里参考百度上的资料&#xff0c;总结一下。 IList使用命名空间&#xff1a; using System.Collections; List<T>类:表示可通过索引访问的对象的强类型列表&#xff0c;提供用于对列表进行搜索、排序和操作的方法。 IList<T&…

3.10 Bootstrap 标签

文章目录 Bootstrap 标签标签 Bootstrap 标签 下面将讲解 Bootstrap 标签。标签可用于计数、提示或页面上其他的标记显示。使用 class .label 来显示标签&#xff0c;如下面的实例所示&#xff1a; <span class"label label-default">Label</span></…

Docker 应用容器引擎 (一)

Docker 应用容器引擎 Docker是什么 是一个开源的应用容器引擎&#xff0c;基于GO语言开发并遵循了apache2.0协议开源 是在linux容器里运行应用的开源工具 是一种轻量级的“虚拟机” Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的…

23款奔驰S400豪华型升级4D旋转高音,提升车内氛围

奔驰加装4D旋转高音&#xff0c;让高音“有型有色”,高端4D环绕立体声音响系统的视觉效果同样令人印象深刻&#xff1a;系统启动时&#xff0c;安装在前车门后视镜三角板中的两个高音头会与同色车内氛围灯一块亮起&#xff0c;同时向外旋出10mm至最佳效果位置&#xff0c;以提高…

阿里云声音复刻

阿里云声音复刻 个性化人声定制 阿里云个性化人声定制是智能语音交互产品自学习平台下的一部分 使用方式&#xff1a;https://help.aliyun.com/document_detail/456006.html 方式一&#xff1a;控制台界面定制使用方式 方式二&#xff1a;通过OpenAPI定制&#xff1a;在该页…

matplotlib从起点出发(1)_Tutorial_1

0 系列简介 这个系列&#xff0c;小白从起点出发开始整理matplotlib库的基本使用及相关技巧。小白的主要思路是沿着官网的tutorials先学习matplotlib的基础功能&#xff0c;然后针对官网总结的Cheat Sheets及其中的知识点查漏补缺。作为一个工具库&#xff0c;小白认为只要能够…

NodeJS实现支付宝沙箱支付②③

文章目录 前言版权声明Alipay SDK 沙箱环境简介Node环境要求沙箱环境配置下载所需模块准备前端静态页面以及Node服务器文件夹规范AlipaySdk 配置准备AlipaySdk 代码演示 Alipay实例化 ~ alipay.sdk 文件 AlipayForm ~ alipayForm文件 AlipayFormStatus ~ alipayForm文件 …

长城汽车Hi4技术品牌成果初现,大象转身必将势不可挡

今年1-6月&#xff0c;长城汽车销售52万辆&#xff0c;新能源车型销售9.3万辆&#xff0c;同比增长47%&#xff1b;智能新能源新产品密集上市&#xff0c;新能源销量与占比逐月攀升&#xff0c;6月销售超2.6万辆&#xff0c;占比突破25%&#xff0c;皆创历史新高&#xff1b; 全…

智慧数据驱动:基于smardaten构建多维数据可视化大屏

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【uni-app】常用图标、头像汇总

在做小程序的时候&#xff0c;有时候需要各种图标和头像素材&#xff0c;而百度一堆基本都是收费的。所以&#xff0c;整理一些免费好用的图标&#xff0c;头像库&#xff1a; 1、iconfont-阿里巴巴矢量图标库 基本上常用的矢量图标&#xff0c;在这儿都有&#xff0c;而且可…

【极简 亲测】已拦截跨源请求:同源策略禁止读取位于....的远程资源。(原因:CORS 头缺少 ‘Access-Control-Allow-Origin‘)

CORS是Cross-Origin Resource Sharing。 解决 首先这个是浏览器层面的拦截。下面的方法都是解除浏览器拦截的方式。 解除了之后还是有可能其他方面有问题的&#xff0c;但是那个会提示其他错误。 比如CORs Failed之类的&#xff0c;这个是没收到response&#xff0c;大概率是…