pandas通过Office365 API上传DataFrame为Excel到SharePoint时文件无法打开
问题根因
你的上传逻辑里df.to_excel(excel_writer='teste.xlsx')调用方式有误:当excel_writer参数传入本地路径字符串时,pandas会直接把Excel内容写入磁盘对应路径的文件,该方法的返回值是None。你把None作为文件内容传给上传接口,最终SharePoint上存储的是损坏的无效文件,自然无法正常打开。
你提到部署环境是云函数,本身本地磁盘写入权限、临时文件清理都有额外限制,写本地文件再上传的方案本身也不适配这个场景。
修复方法
用Python标准库的BytesIO在内存中生成Excel二进制内容,全程不落地本地文件,直接把内存中的有效内容上传即可,不需要额外安装第三方依赖。
修正后的可运行代码:
import pandas as pd from io import BytesIO from office365.runtime.auth.client_credential import ClientCredential from office365.sharepoint.client_context import ClientContext # 原有鉴权逻辑无需修改 client_credentials = ClientCredential(var_client_id, var_client_secret) ctx = ClientContext(var_sp_site).with_credentials(client_credentials) df = pd.DataFrame(sql_table) var_relative_url = "sharepoint_path/sharepoint_path" target_folder = ctx.web.get_folder_by_server_relative_url(var_relative_url) # 初始化内存流承接Excel内容 buffer = BytesIO() # DataFrame直接写入内存流,index=False可避免导出多余的行索引列,可根据自身需求调整 df.to_excel(excel_writer=buffer, index=False) # 将流指针重置到起始位置,否则读取到的内容为空 buffer.seek(0) # 读取内存中的二进制内容上传 target_folder.upload_file( content=buffer.read(), file_name='teste.xlsx' ).execute_query() # 可选:关闭内存流释放资源 buffer.close()
补充说明
- 如果需要导出多sheet、带单元格格式的复杂Excel,只需要把
BytesIO对象传入pd.ExcelWriter做后续配置即可,逻辑不变,依然不需要生成本地文件 - 该方案完全在内存中完成文件生成和读取,适配无本地磁盘写入权限的云函数、容器环境
内容的提问来源于stack exchange,提问作者Phelipe
相关产品推荐
相关产品推荐

