You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Google Drive API获取Excel所有工作表数据并转为DataFrame

解决方案:无需本地下载访问Google Drive中Excel文件的多工作表数据

问题分析

原代码存在两个核心问题:

  • 在文件未完全下载的循环过程中就调用pd.read_excel,可能导致读取不完整或报错
  • 未指定sheet_name参数,默认仅读取第一个工作表

修正后的实现代码

import io
import pandas as pd
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseDownload

def get_excel_data(creds, sheet_id):
    # 构建Drive服务
    service = build('drive', 'v3', credentials=creds)
    
    # 完整下载文件到BytesIO
    request = service.files().get_media(fileId=sheet_id)
    file_io = io.BytesIO()
    downloader = MediaIoBaseDownload(file_io, request)
    done = False
    while not done:
        status, done = downloader.next_chunk()
    
    # 重置文件指针到开头(下载后指针停在末尾,需重置才能读取)
    file_io.seek(0)
    
    # 加载Excel文件对象,获取所有工作表名称
    excel_file = pd.ExcelFile(file_io, engine='openpyxl')
    sheet_names = excel_file.sheet_names
    
    # 定义获取指定工作表DataFrame的函数
    def get_sheet_df(sheet_name):
        return excel_file.parse(sheet_name)
    
    return sheet_names, get_sheet_df

使用示例

# 假设已通过服务账号获取到合法的creds对象
sheet_names, get_df = get_excel_data(creds, "你的Google Drive文件ID")

# 打印所有工作表名称
print("所有工作表:", sheet_names)

# 获取指定工作表的DataFrame
df_sheet1 = get_df("Sheet1")
df_sheet2 = get_df("Sheet2")

关键说明

  • 完整下载文件:必须等待downloader.next_chunk()完成后再处理文件,避免读取不完整的数据流
  • 重置文件指针:BytesIO在写入后指针会停在末尾,必须用seek(0)重置到开头才能被pd.ExcelFile正确读取
  • ExcelFile对象:通过pd.ExcelFile加载文件后,可以高效获取所有工作表名称,并且按需解析指定工作表,无需重复下载文件
  • 依赖安装:确保已安装openpyxl库(执行pip install openpyxl),用于处理.xlsx格式文件

内容的提问来源于stack exchange,提问作者Solrac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:28:32