无法Python直连SharePoint列表,求提升多列表整合效率的方案
我完全理解你的痛点——通过Excel中转刷新确实效率极低,尤其是数据量较大的时候,内存占用还高。针对你的情况,这里有几个更高效的方案,同时也会解决你遇到的SSL证书问题:
方案1:使用Microsoft Graph API直接获取数据(推荐)
这是微软官方推荐的现代化方式,绕过Excel中转,直接从SharePoint拉取数据,速度和稳定性都有质的提升,还能避免Excel带来的内存开销。
步骤:
- 注册Azure AD应用:在Azure门户里注册一个应用,授予
Sites.Read.All(或更精细的列表读取权限)的应用权限,获取租户ID、客户端ID和客户端密钥。 - 用Python调用Graph API:使用
azure-identity和msgraph-core库完成认证,直接请求列表数据并转成DataFrame处理。
示例代码:
from azure.identity import ClientSecretCredential from msgraph.core import GraphClient import pandas as pd # 替换为你的认证信息 tenant_id = "你的租户ID" client_id = "你的客户端ID" client_secret = "你的客户端密钥" # 初始化认证与客户端 credential = ClientSecretCredential(tenant_id, client_id, client_secret) client = GraphClient(credential=credential) # 替换为你的站点ID和列表ID site_id = "你的SharePoint站点ID" list_id = "你的目标列表ID" response = client.get(f"/sites/{site_id}/lists/{list_id}/items?expand=fields") data = response.json() # 转换为DataFrame items = [item['fields'] for item in data['value']] df = pd.DataFrame(items) # 处理分页数据(如果列表项较多) while '@odata.nextLink' in data: response = client.get(data['@odata.nextLink']) data = response.json() items.extend([item['fields'] for item in data['value']]) df = pd.DataFrame(items)
方案2:修复SSL证书问题,使用Office365 REST Python Client
你遇到的SSL错误通常是因为Python无法验证企业内部的SSL证书,用更成熟的Office365-REST-Python-Client库可以解决这个问题,同时直接操作SharePoint列表。
解决SSL错误的两种方式:
- 指定企业CA证书路径(生产环境推荐):
from office365.sharepoint.client_context import ClientContext from office365.runtime.auth.client_credential import ClientCredential import ssl # 替换为你的认证信息和站点URL client_id = "你的客户端ID" client_secret = "你的客户端密钥" site_url = "https://sharepoint.xxx.com/sites/你的站点" # 加载企业CA证书(替换为你的证书文件路径) ssl_context = ssl.create_default_context(cafile="/path/to/company/ca_cert.pem") ctx = ClientContext(site_url).with_credentials(ClientCredential(client_id, client_secret)) ctx._pending_request.ssl_context = ssl_context # 获取列表数据 list_obj = ctx.web.lists.get_by_title("你的列表名称") items = list_obj.items.select(["Title", "字段1", "字段2"]).get().execute_query() df = pd.DataFrame([item.properties for item in items])
- 临时禁用证书验证(仅限测试环境):
# 初始化ClientContext后添加这行 ctx._pending_request.verify = False
注意:生产环境不建议这么做,会带来安全风险。
方案3:用Power Automate定时同步数据到数据库
如果你的报表不需要实时数据,可以用Power Automate(微软流)每天定时把多个SharePoint列表同步到SQL数据库(比如Azure SQL、本地SQLite)或CSV文件,然后Python直接读取本地数据源,速度会快很多。
大致步骤:
- 创建一个Power Automate流,触发条件设为「每天定时」。
- 添加「获取SharePoint列表项」动作,逐个拉取需要的列表数据。
- 添加「插入行到SQL表」动作,把数据同步到数据库(如果用CSV就选「创建文件」动作)。
- Python代码直接连接数据库查询数据,整合生成报表。
方案4:优化Excel中转的现有流程(临时过渡)
如果暂时不想换其他方案,可以优化Excel的刷新逻辑来提速:
- 禁用Excel界面刷新:用
win32com.client控制Excel时,关闭屏幕更新和弹窗提示,减少不必要的资源消耗:
import win32com.client as win32 excel = win32.gencache.EnsureDispatch('Excel.Application') excel.ScreenUpdating = False excel.DisplayAlerts = False wb = excel.Workbooks.Open("你的Excel文件路径") # 只刷新指定的SharePoint连接,避免全量刷新 for conn in wb.Connections: if "SharePoint" in conn.Name: conn.Refresh() wb.Save() wb.Close() excel.ScreenUpdating = True excel.DisplayAlerts = True excel.Quit()
- 拆分大文件:如果Excel里有多个SharePoint连接,拆分到不同文件单独刷新,再用Python合并结果,减少单个文件的内存占用。
以上几个方案里,方案1和方案3是长期最优解,能彻底解决速度问题;方案2适合需要直接操作SharePoint的场景;方案4可以作为临时过渡方案。
内容的提问来源于stack exchange,提问作者Alex Huong Tran
相关产品推荐
相关产品推荐

