大数跨境
0
0

告别手动录入!Python批量上传Excel数据到飞书多维表格

告别手动录入!Python批量上传Excel数据到飞书多维表格 大话数据分析
2025-06-24
1
导读:Python+飞书多维表格,实现办公自动化!

还在一行行复制粘贴 Excel 数据到飞书表格?今天,就让 Python 带你告别这种“体力活”!无论你是数据分析师、运营、还是职场打工人,只需一个脚本,就能轻松将本地的 Excel 数据批量上传到飞书多维表格,省时省力,还能一键同步多人协作。

该脚本不仅能清空旧数据、自动识别日期格式,还能按批次快速写入,真正实现自动化办公的第一步!这篇文章将手把手带你实现——从代码编写到实战应用,一次性搞定!接下来就一起学习如何使用Python批量将本地数据上传至飞书多维表格。

首先,打开飞书,点击多维表格,新建一个空白的飞书多维表格。

新建一个空白的多维表。

默认的多维表格包含文本、单选、日期、附件四个数据字段。

将我们需要上传的数据中标题行复制粘贴过来,点击识别为字段名。

双击多维表格标题行,将字段类型修改为我们需要的字段类型。

修改完的字段类型如下,接着点击右上角的多维表格插件。

点击自定义插件。

点击获取授权码。

如下即为多维表格的授权码,通过该授权码可以读取和编辑多维表格。

接着点击探索插件市场。

在插件市场选择开发工具。

点击使用。

在开发工具中可以看到在右侧显示该多维表格的Base ID(appToken)Table(数据表) ID,用于标记特定的多维表格标记。

获取基础信息以后,接着就开始就开始编写Python代码,用于将本地数据上传到飞书多维表格中,注意,要将数据上传到飞书多维表格,需要的Python版本要高一点,推荐3.12版本。

import sysprint("当前 Python 版本是:", sys.version)

接着使用命令行下载baseopensdk。

!pip install https://lf3-static.bytednsdoc.com/obj/eden-cn/lmeh7phbozvhoz/base-open-sdk/baseopensdk-0.0.13-py3-none-any.whl

打印baseopensdk基础信息。

!pip show baseopensdk

接下来编写Python代码,代码整体可以实现下面几个功能,首先清空飞书多维表格数据,每次更新数据都会替换之前的数据,然后将每条数据记录正确格式化,比如将文本类型的日期数据转化为日期型数据,最后,批量上传Excel数据,完整版代码可以参考:

import pandas as pdimport timeimport loggingimport refrom datetime import datetimefrom baseopensdk import BaseClientfrom baseopensdk.api.base.v1 import * # ========== 配置 ==========APP_TOKEN = " XXXXXXXXX " #修改为你的实际 APP_TOKENPERSONAL_BASE_TOKEN = " XXXXXXXXX " #修改为你的实际PERSONAL_BASE_TOKEN TABLE_ID = " XXXXXXXXX "  #修改为你的实际TABLE_ID EXCEL_PATH = r" 2025年5月销售数据.xlsx"  # 修改为你的实际路径 # ========== 日志配置 ==========logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s:%(message)s')logger = logging.getLogger("飞书上传") # ========== 工具函数 ==========def parse_date_string(date_str):    """将字符串日期转换为13位时间戳"""    if pd.isnull(date_str) or str(date_str).strip() == "":        return None    date_str = str(date_str).strip()    formats = [        '%Y-%m-%d''%Y/%m/%d''%Y.%m.%d',        '%Y-%m-%d %H:%M:%S''%Y/%m/%d %H:%M:%S',        '%Y年%m月%d日'    ]    date_str = re.sub(r'[^\d\-/年月日\s:.]''', date_str)    for fmt in formats:        try:            dt = datetime.strptime(date_str, fmt)            return int(dt.timestamp() * 1000)        except:            continue    try:        dt = pd.to_datetime(date_str, errors='coerce')        return int(dt.timestamp() * 1000if not pd.isnull(dt) else None    except:        return None def convert_row(row):    converted = {}    for col, val in row.items():        if pd.isnull(val):            converted[col] = None        elif "日期" in str(col) or "时间" in str(col):            converted[col] = parse_date_string(val)        elif isinstance(val, float):            converted[col] = round(val, 4)        elif isinstance(val, int):            converted[col] = val        else:            converted[col] = str(val).strip()    return converted def clear_table_data(client, table_id):    """清除飞书表格中的所有记录"""    logger.info("开始清空飞书多维表格记录...")    all_records = []    page_token = None    while True:        builder = ListAppTableRecordRequest.builder().table_id(table_id).page_size(500)        if page_token:            builder.page_token(page_token)        resp = client.base.v1.app_table_record.list(builder.build())        if resp.code != 0:            logger.error(f"获取记录失败: {resp.msg}")            return False        items = resp.data.items or []        all_records += [r.record_id for r in items]        if not getattr(resp.data, "has_more"False):            break        page_token = resp.data.page_token    for i in range(0len(all_records), 500):        batch = all_records[i:i+500]        req = BatchDeleteAppTableRecordRequest.builder().table_id(table_id).request_body(            BatchDeleteAppTableRecordRequestBody.builder().records(batch).build()        ).build()        del_res = client.base.v1.app_table_record.batch_delete(req)        if del_res.code != 0:            logger.error(f"删除失败: {del_res.msg}")            return False        logger.info(f"删除成功 {len(batch)} 条记录")        time.sleep(0.2)    return True def upload_to_feishu():    """上传本地 Excel 到飞书多维表格"""    logger.info("开始读取 Excel 文件...")    try:        df = pd.read_excel(EXCEL_PATH)        logger.info(f"成功读取 {len(df)} 条记录")    except Exception as e:        logger.error(f"读取 Excel 失败: {e}")        return     logger.info("创建飞书客户端...")    try:        client = BaseClient.builder()\            .app_token(APP_TOKEN)\            .personal_base_token(PERSONAL_BASE_TOKEN)\            .build()    except Exception as e:        logger.error(f"飞书客户端创建失败: {e}")        return     if not clear_table_data(client, TABLE_ID):        logger.warning("清空表格失败,终止上传")        return     logger.info("开始上传数据...")    records = []    for _, row in df.iterrows():        fields = convert_row(row)        fields = {k: v for k, v in fields.items() if v is not None}        if fields:            records.append({"fields": fields})     for i in range(0len(records), 500):        batch = records[i:i+500]        req = BatchCreateAppTableRecordRequest.builder()\            .table_id(TABLE_ID)\            .request_body(BatchCreateAppTableRecordRequestBody.builder().records(batch).build())\            .build()        res = client.base.v1.app_table_record.batch_create(req)        if res.code == 0:            logger.info(f"上传成功 {len(batch)} 条")        else:            logger.error(f"上传失败: {res.msg}")        time.sleep(0.2)     logger.info("所有数据上传完成") if __name__ == "__main__":upload_to_feishu()

可以看到,已经将数据成功上传到飞书多维表格中,速度超快。

飞书是一个强大的协作工具,而 Python 则是自动化的利器,将它们结合起来,不仅能解放双手,更能释放你的创造力!希望这篇文章能帮你迈出自动化办公的第一步,感兴趣的同学可以实践一下。

后台回复数据分析入门,获取数据分析入门资料
加入数据分析资料群,一起交流数据分析知识

关注和星标『大话数据分析』

和作者一起学习数据分析!

👆点击关注|设为星标|干货速递👆

前蚂蚁金服数据运营,现京东经营分析,公众号、知乎、头条「大话数据分析」主理人,专注于数据分析的实践与分享,掌握Python、SQL、PowerBI、Excel等数据分析工具,擅长运用技术解决企业实际问题。

【声明】内容源于网络
0
0
大话数据分析
数据分析的收集者、整理者、分享者、实践者
内容 408
粉丝 0
大话数据分析 数据分析的收集者、整理者、分享者、实践者
总阅读780
粉丝0
内容408