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

无法Python直连SharePoint列表,求提升多列表整合效率的方案

提升SharePoint列表数据获取速度的可行方案

我完全理解你的痛点——通过Excel中转刷新确实效率极低,尤其是数据量较大的时候,内存占用还高。针对你的情况,这里有几个更高效的方案,同时也会解决你遇到的SSL证书问题:

方案1:使用Microsoft Graph API直接获取数据(推荐)

这是微软官方推荐的现代化方式,绕过Excel中转,直接从SharePoint拉取数据,速度和稳定性都有质的提升,还能避免Excel带来的内存开销。

步骤:

  1. 注册Azure AD应用:在Azure门户里注册一个应用,授予Sites.Read.All(或更精细的列表读取权限)的应用权限,获取租户ID、客户端ID和客户端密钥。
  2. 用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错误的两种方式:

  1. 指定企业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])
  1. 临时禁用证书验证(仅限测试环境):
# 初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:12:55