更新钉钉文档封装好的代码

news/2024/6/17 17:52:28 标签: 钉钉, python, 开发语言
import json
import requests

class OperateKnowledgeBaseExcel():
    robot_code = ''       #机器人
    agent_id = ''         
    app_key = ''          #机器人密钥  获取方法见我的其他博客
    app_secret = ''       #机器人密钥

    def __init__(self,union_id, workbook_id, worksheet_id=''):
        self.union_id = union_id
        self.workbook_id = workbook_id  # 获取方式:... > 文档信息 > 表格ID
        self.worksheet_id =  worksheet_id # 获取方式:self.get_workbook_sheet_names() 拿到所有sheet名称和id
        if not self.union_id:
            raise Exception('请先设置union_id')

        self.access_token = self.get_access_token()

    def get_access_token(self):
        """ 获取token: https://open.dingtalk.com/document/orgapp/obtain-orgapp-token """
        headers = {'Content-Type': "application/x-www-form-urlencoded"}
        url = f"https://oapi.dingtalk.com/gettoken/?appkey={self.app_key}&appsecret={self.app_secret}"
        resp = requests.get(url, headers=headers)
        # print(resp.json()['access_token'])
        return resp.json()['access_token']

    def get_workbook_sheet_names(self):
        """
        获取工作表信息,包含工作表名称、工作表id
        开发者文档:https://open.dingtalk.com/document/orgapp/obtain-all-worksheets
        """
        url = f'https://oapi.dingtalk.com/v1.0/doc/workbooks/{self.workbook_id}/sheets?operatorId={self.union_id}'
        headers = {
            'Content-Type': "application/json",
            'Host': 'api.dingtalk.com',
            'x-acs-dingtalk-access-token': self.access_token
        }
        resp = requests.get(url, headers=headers)
        # print(resp.json())
        return resp.json()

    def get_worksheet_describe(self):
        """
        获取工作表的描述
        开发者文档:https://open.dingtalk.com/document/orgapp/obtain-worksheet-properties
        """
        url = f'https://oapi.dingtalk.com/v1.0/doc/workbooks/{self.workbook_id}/sheets/{self.worksheet_id}?operatorId={self.union_id}'
        headers = {
            'Content-Type': "application/json",
            'Host': 'api.dingtalk.com',
            'x-acs-dingtalk-access-token': self.access_token
        }
        resp = requests.get(url, headers=headers)
        # print(resp.json())
        return resp.json()

    def get_all_cells_area(self):
        """ 获取表格的全部区域,如:A1:D4 """
        worksheet_describe = self.get_worksheet_describe()
        last_row = worksheet_describe['lastNonEmptyRow']
        last_column = worksheet_describe['lastNonEmptyColumn']
        range_address = f'A1:{get_column_letter(last_column + 1)}{last_row + 1}'
        return range_address

    def read(self, range_address=False):
        """
        读取工作表数据
        开发者文档:https://open.dingtalk.com/document/orgapp/get-cell-properties
        """
        if not range_address:  # 如果没有指定读取区域,则读取整个工作表
            range_address = self.get_all_cells_area()
        url = f'https://oapi.dingtalk.com/v1.0/doc/workbooks/{self.workbook_id}/sheets/{self.worksheet_id}/ranges/{range_address}?select=values&operatorId={self.union_id}'
        headers = {
            'Content-Type': "application/json",
            'Host': 'api.dingtalk.com',
            'x-acs-dingtalk-access-token': self.access_token
        }
        resp = requests.get(url, headers=headers)
        data = pd.DataFrame(columns=resp.json()['values'][0], data=resp.json()['values'][1:])
        data.replace('', pd.NA, inplace=True)
        return data

    def update(self, range_address, values):
        """
        更新工作表指定区域的数据
        开发者文档:https://open.dingtalk.com/document/orgapp/get-cell-properties
        :param range_address: 更新区域,如:A2:B3
        :param values: 更新的数据,如:[['张三', 18], ['李四', 19]]
        """
        url = f'https://oapi.dingtalk.com/v1.0/doc/workbooks/{self.workbook_id}/sheets/{self.worksheet_id}/ranges/{range_address}?operatorId={self.union_id}'
        headers = {
            'Content-Type': "application/json",
            'Host': 'api.dingtalk.com',
            'x-acs-dingtalk-access-token': self.access_token
        }
        data = {"values": values}
        resp = requests.put(url, data=json.dumps(data), headers=headers)
        print("更新工作表区域:", resp.json())

    def delete(self, range_address=False):
        """
        清空工作表指定区域的数据,仅清除数据,不清除格式
        开发者文档:https://open.dingtalk.com/document/orgapp/get-cell-properties
        """
        if not range_address:  # 如果没有指定读取区域,则清空整个工作表
            range_address = self.get_all_cells_area()

        url = f'https://oapi.dingtalk.com/v1.0/doc/workbooks/{self.workbook_id}/sheets/{self.worksheet_id}/ranges/{range_address}/clearData?operatorId={self.union_id}'
        headers = {
            'Content-Type': "application/json",
            'Host': 'api.dingtalk.com',
            'x-acs-dingtalk-access-token': self.access_token
        }
        resp = requests.post(url, headers=headers)
        print('清空工作表区域:', resp.json())


userid = ''    #钉钉账号
workid = ''    #文档id

def worksheetinsert(df,number=1,worksheetid=''):
    if df.empty:
        return
    # 转换列索引为Excel的列名称
    def col_num_to_letter(col_num):
        string = ""
        while col_num > 0:
            col_num, remainder = divmod(col_num-1, 26)
            string = chr(65 + remainder) + string
        return string
    # 获取行数和列数
    num_rows, num_cols = df.shape

    # 因为包括列名,所以行数需要加1
    range = f"A{number}:{col_num_to_letter(num_cols)}{num_rows + number}"
    print(range)

    # 将数据转换为列表形式
    values = df.values.tolist()
    values = [df.columns.tolist()] + [[str(item) for item in row] for row in values]

    # 构造字典对象
    data = values
    try:
        temp = OperateKnowledgeBaseExcel(userid,workid,worksheetid).read()
        OperateKnowledgeBaseExcel(userid,workid,worksheetid).delete()
    except:
        pass
    OperateKnowledgeBaseExcel(userid,workid,worksheetid).update(range,data)

df = 

excelsheet_json = OperateKnowledgeBaseExcel(userid,workid).get_workbook_sheet_names()
excelsheet = {item['name']: item['id'] for item in excelsheet_json['value']}


#指定表sheet名插入
worksheetinsert(df,number=1,worksheetid=excelsheet['XXX'])
  1. 获取访问令牌:通过设置机器人的密钥和密钥获取访问令牌。

  2. 获取工作表信息:获取工作表的名称和ID。

  3. 获取工作表描述:获取工作表的描述信息。

  4. 获取全部单元格区域:获取工作表的全部区域。

  5. 读取数据:读取指定区域的数据,并将其转换为DataFrame格式返回。

  6. 更新数据:更新指定区域的数据。

  7. 清空数据:清空指定区域的数据,但保留格式。

  8. 插入数据到指定表格:将DataFrame格式的数据插入到指定的工作表中。


http://www.niftyadmin.cn/n/5271680.html

相关文章

苹果明年春季将发布多款新品!

大家期待已久的iPad系列终于要迎来更新了,据彭博社记者马克古尔曼最新爆料称,苹果为了提振下滑的iPad销售,计划在2024年初对iPad系列进行重大更新,包括2款不同尺寸的新iPad Air和新iPad Pro,这些机型都将有显著的变化。…

QUIC在零信任解决方案的落地实践

一 前言 ZTNA为以“网络为中心”的传统企业体系架构向以“身份为中心”的新型企业安全体系架构转变,提供解决方案。随着传统网络边界不断弱化,企业SaaS规模化日益增多,给终端安全访问接入创造了多元化的空间。其中BYOD办公方式尤为突出&#…

【JAVA】CyclicBarrier源码解析以及示例

文章目录 前言CyclicBarrier源码解析以及示例主要成员变量核心方法 应用场景任务分解与合并应用示例 并行计算应用示例 游戏开发应用示例输出结果 数据加载应用示例 并发工具的协同应用示例 CyclicBarrier和CountDownLatch的区别循环性:计数器的变化:用途…

bottom-up-attention-vqa-master 成功复现!!!

代码地址 1、create_dictionary.py 建立词典和使用预训练的glove向量 (1)create_dictionary() 遍历每个question文件取出所关注的question部分,qs 遍历qs,对每个问题的文本内容进行分词,并将分词结果添加到字典中&…

实现滚动穿透,保留原本元素的事件,仅实现滚动穿透

网络上都是一堆解决滚动穿透的,却没有一条是实现滚动穿透的方案。 小程序或者某些组件会有滚动穿透,但是如果是自己要造轮子,在某些场景下就需要去实现滚动穿透。比如我打开一个可滑动的弹框,在弹框上打开一个可滑动的组件&#…

Flink系列之:窗口Top-N

Flink系列之:窗口Top-N 一、窗口Top-N二、示例:在窗口聚合后进行窗口 Top-N三、在窗口表值函数后进行窗口 Top-N四、限制 一、窗口Top-N 适用于流、批一体窗口 Top-N 是特殊的 Top-N,它返回每个分区键的每个窗口的N个最小或最大值。与普通To…

SpringSecurity源码学习六:授权

目录 1. 用户权限2. 资源权限2.1 自定义资源权限2.2 权限注解2.2.1 默认注解2.2.2 自定义注解2.2.3 注解初始化和保存 3. 代码示例4. 源码解析4.1 投票器4.1.1 投票器不同实现类的含义4.1.2 默认投票器WebExpressionVoter 5. 总结 SpringSecurity的授权是依赖于过滤器FilterSec…

React 实现列表页和列表详情页功能

1.简介 本篇文章将会基于react 实现列表页和列表详情的功能,后续会完善更多的功能细节。 2.实现 a.app.js 入口类,实现路由功能 import ./App.css; import {BrowserRouter, Route, Routes} from react-router-dom; import {UserList} from "./p…