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

从SharePoint读取/下载Excel遇403错误,求解决方法

SharePoint Excel文件下载/读取(解决403 Forbidden问题)

问题根源

你遇到的403错误核心来自两点:

  1. 认证方式不兼容:企业级SharePoint(如EY内部部署或SharePoint Online)基本不支持HTTPBasicAuth,需用NTLM或OAuth2认证
  2. URL格式错误:当前链接里的%10是错误编码(空格应编码为%20),且带:x:/r/的是预览链接,并非直接下载端点

修正步骤与解决方案

第一步:修正URL

先把链接中的%10替换为%20,再选以下两种有效URL格式之一:

  • 直接下载链接:将预览链接的:x:/r/改为:x:/d/,追加&download=1参数,示例:
    https://sites.ey.com/:x:/d/sites/TProjects-Analytics/Dgs/Analytics%20Analytics/Test.xlsx?d=w9d887d3b4ee579e35tdkka&download=1
    
  • SharePoint API端点:使用服务器相对路径的API链接,示例:
    https://sites.ey.com/sites/TProjects-Analytics/_api/web/getfilebyserverrelativeurl('/sites/TProjects-Analytics/Dgs/Analytics Analytics/Test.xlsx')/$value
    

第二步:选择对应认证方式

方案1:内部部署SharePoint(AD域环境)- NTLM认证

适合企业内部基于Active Directory的SharePoint,先安装依赖库:

pip install requests_ntlm pandas openpyxl

代码示例:

import requests
from requests_ntlm import HttpNtlmAuth
import pandas as pd

# 替换为修正后的URL
file_url = "https://sites.ey.com/:x:/d/sites/TProjects-Analytics/Dgs/Analytics%20Analytics/Test.xlsx?d=w9d887d3b4ee579e35tdkka&download=1"
# AD域账号需加域名前缀,比如 EY\\abc 或完整邮箱(视域配置而定)
username = "EY\\abc@gmail.com"
password = "Password12@"

# 发起请求并认证
resp = requests.get(file_url, auth=HttpNtlmAuth(username, password))
resp.raise_for_status()  # 请求失败直接抛出异常

# 保存到本地
with open('Test.xlsx', 'wb') as f:
    f.write(resp.content)

# 读取为DataFrame
df = pd.read_excel('Test.xlsx', engine='openpyxl')
print(df.head())

方案2:SharePoint Online(Office 365)- 专用库认证

适合云版SharePoint,使用官方推荐的库处理认证,先安装依赖:

pip install office365-rest-python-client pandas openpyxl

代码示例:

from office365.sharepoint.client_context import ClientContext
from office365.runtime.auth.user_credential import UserCredential
import pandas as pd
import io

site_url = "https://sites.ey.com/sites/TProjects-Analytics"
username = "abc@gmail.com"
password = "Password12@"
# 文件的服务器相对路径(从站点根目录开始)
file_relative_path = "/sites/TProjects-Analytics/Dgs/Analytics Analytics/Test.xlsx"

# 初始化SharePoint上下文
ctx = ClientContext(site_url).with_credentials(UserCredential(username, password))
# 获取文件内容
file_content = ctx.web.get_file_by_server_relative_url(file_relative_path).read().execute_query()

# 保存到本地
with open('Test.xlsx', 'wb') as f:
    f.write(file_content)

# 直接读取为DataFrame(无需保存本地)
df = pd.read_excel(io.BytesIO(file_content), engine='openpyxl')
print(df.head())

额外注意事项

  • 权限验证:先在浏览器用相同账号打开文件链接,确认能正常下载,排除账号权限问题
  • MFA影响:若账号开启多因素认证,上述密码认证方式失效,需改用设备码认证或应用权限(可参考office365库的DeviceCodeCredential用法)
  • 编码检查:确保URL中所有特殊字符都正确编码(比如空格→%20),避免URL解析错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:17:51