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

news2024/11/24 1:28:57

编辑在线表格

    • 一 目的
    • 二 实现效果
    • 三 实现过程简介
      • 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('不需要扩展列表')

小结

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年Q2京东大家电市场前瞻分析报告(含电商销售数据)

今年Q2,京东平台各个主要家电板块的表现分化较为明显,各个细分的子版块在今年第二季度的业绩都各有亮点,部分品类甚至还出现了较大的市场格局变化。 这一期,我们率先来分析一下京东四个大家电品类的行业大盘变动情况。我们将从行业…

51单片机LCD12864温度曲线显示温度温控系统加热制冷控制

实践制作DIY- GC00155-温度曲线显示温度温控系统 一、功能说明: 基于51单片机设计-温度曲线显示温度温控系统 二、功能说明: STC89C52单片机LCD12864显示器DS18B20温度传感器1个红色LED灯模拟加热1个绿色LED灯模拟制冷4个按键(温度下限加减键…

递归总结

递归每次自己调用自己,每次调用自己后函数的数据会较上次缩减,而且最后缩减至无需继续递归。内层函数调用完成,外层函数才算调用完成 n的阶乘伪代码 外层必须逐级向里面递,最后再向外归。 public class 递归_02 {public static vo…

ITIL 4—监控和事态管理实践

1 关于本文 本文为监控和事态管理实践提供了实用指南。它分为五个主要部分,内容包括: 有关实践的一般信息监控和事态管理的流程和活动及其在服务价值链中的角色监控和事态管理中涉及的组织和人员支持监控和事态管理的信息和技术合作伙伴和供应商对监控…

A_003.adb常用命令使用介绍

1.adb工作原理说明 adb命令是调试控制手机过程中用的比较多工具。adb是一个C/S架构的应用程序,主要由三部分组成: (1)、运行在电脑端的adb client程序 在电脑终端中执行adb --help可以查看当前支持的adb命令。当在命令行执行程序adb相关命令的时候,adb程序尝试连接到主机上…

VUE根据图片做图片形状的词云效果

VUE根据图片形状制作词云效果 针筒图片:(是png) 效果图:(文章底部有完整代码) 限制横竖显示, 在两种颜色中随机。 爱心图片:(是白底的png) 效果图&#xff…

什么是CI/CD?让你的项目变得更加敏捷!

在今天这个快速变化的时代,开发者们需要与时俱进,不断提升自己的工作效率。在这篇文章里,将一起探讨如何使用CI/CD和Github Action让你的项目更加高效,快速响应市场变化。 一、什么是CI? CI(持续集成&…

【Java面试丨并发编程】线程的基础知识

一、进程与线程的区别 1. 进程 程序是由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存在指令运行过程中还需要用到磁盘、网络等设备进程就是用来加载指令、管理内存、管理IO的当一个程序被…

青岛大学_王卓老师【数据结构与算法】Week05_08_顺序栈的操作2_学习笔记

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础…

C++学习 内存分区模型

内存分区模型 C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理。全局区:存放全局变量和静态变量以及常量。栈区:由编译器自动分配释放,存放函数的参数值&#…

【TI毫米波雷达笔记】DCA1000EVM+mmWave Studio数据采集的MIMO模式设置(多天线发射工作模式)

【TI毫米波雷达笔记】DCA1000EVMmmWave Studio数据采集的MIMO模式设置(多天线发射工作模式) 以IWR6843AOP为例 其为3发4收的雷达 MIMO模式有两种 TDM-MIMO和BPM-MIMO TDM-MIMO模式(时分复用) TDM-MIMO模式是最简单和常用的MIM…

Vector - CANoe - CAPL文件加密

目录 为什么会有CAPL文件加密需求? 加密文件介绍 “*.can”和“*.cin” 文件创建 <

win11安装virtual box和vagrant,附带centos7镜像

环境检查 1. 开启CPU虚拟化 修规bios配置 configuration -> Intel Virtual Technology 改为 enabled 2. 关闭hyper-v 以管理员启动 powershell&#xff0c;执行&#xff1a; bcdedit /set hypervisorlaunchtype off 3. 关闭wsl虚拟机 以管理员启动 powershell&#x…

C#探索之路(10):实现一个简单应用的功能——志愿填报

C#探索之路(10)&#xff1a;实现一个简单应用的功能——志愿填报 文章目录 C#探索之路(10)&#xff1a;实现一个简单应用的功能——志愿填报1、前景&#xff1a;2、需求分析3、功能实现3.1、界面交互-输入3.2、界面交互-输出 3、代码示例&#xff1a;4、效果图&#xff1a;5、总…

利用缓存模拟进度条(c实现)

代码如下&#xff1a; #include <stdio.h> #include <Windows.h>int main() {int total 100;int progress 0;char progressBar[101] {};while (progress < total) {progressBar[progress] #;printf("[%-100s] %d%%", progressBar, progress);ffl…

音视频开发实战03-FFmpeg命令行工具移植

一&#xff0c;背景 作为一个音视频开发者&#xff0c;在日常工作中经常会使用ffmpeg 命令来做很多事比如转码ffmpeg -y -i test.mov -g 150 -s 1280x720 -codec libx265 -r 25 test_h265.mp4 &#xff0c;水平翻转视频&#xff1a;ffmpeg -i src.mp4 -vf hflip -acodec copy …

爬虫相关知识与面试题目

常见的反爬虫和应对方法 参考:https://www.cnblogs.com/bsdr/p/5151891.html 0x01 常见的反爬虫 这几天在爬一个网站&#xff0c;网站做了很多反爬虫工作&#xff0c;爬起来有些艰难&#xff0c;花了一些时间才绕过反爬虫。在这里把我写爬虫以来遇到的各种反爬虫策略和应对的…

判断 Mac显卡 mps 是否可以正常运行

文章目录 Mac MPS介绍判断 Mac mps 是否可以正常运行Mac 指定 mps 进行推理示例Mac M1 GPU 训练 相比 CPU 速度提升对比&#x1f4d9; 开心搬砖每一天 Mac MPS介绍 使用 Apple 的 Metal Performance Shaders (MPS) 作为 PyTorch 的后端来启用加速 GPU 训练。 MPS 后端扩展了 P…

SpringBoot源码分析(5)--createApplicationContext创建应用上下文

文章目录 一、前言二、ApplicationContext简述2.1、Spring IOC容器实现方式 三、createApplicationContext/创建应用上下文3.1、DefaultResourceLoader3.2、AbstractApplicationContext3.3、GenericApplicationContext3.3.1、SimpleAliasRegistry3.3.2、DefaultSingletonBeanRe…

ARM中栈的种类与运用

1. 栈的概念 栈&#xff0c;本身是一段内存&#xff0c;程序运行时用于保存一些临时数据&#xff0c;如局部变量、参数、返回地址等等。 学习了数据结构&#xff0c;对栈的概念相信大家都不陌生&#xff0c;后进先出的数据结构&#xff0c;即最后进栈的元素最先出栈。但是在C语…