如何从共享OneDrive链接将xlsx文件导入R并回传至OneDrive
问题原因
你使用的OneDrive共享链接是网页预览链接,而非直接指向文件资源的下载链接,因此curl_download实际下载的是网页HTML内容,不是真实的xlsx文件,导致readxl无法识别解析。
可行解决方案
方案1:修改共享链接为直接下载格式
OneDrive个人版的共享链接可通过简单修改转换为直接下载链接:
- 将原链接中类似
/:x:/g/的片段替换为/:u:/ - 在链接末尾添加参数
&download=1
修改后的链接示例(基于你提供的原链接):
https://onedrive.live.com/:u:/g/personal/D7F26BE16D487B10/EYJxLYphlkRFogUmL7LhO4QBEym63JCSoZVQXXgeXG6ptA?resid=D7F26BE16D487B10!s8a2d718296614544a205262fb2e13b84&ithint=file%2Cxlsx&e=Oj2gQq&migratedtospo=true&redeem=aHR0cHM6Ly8xZHJ2Lm1zL3gvYy9kN2YyNmJlMTZkNDg3YjEwL0VZSnhMWXBobGtSRm9nVW1MN0xoTzRRQkV5bTYzSkNTb1pWUVhYZ2VYRzZwdEE_ZT1PajJnUXE&download=1
使用修改后的链接重新运行代码:
library(curl) library(readxl) # 替换为修改后的直接下载链接 url <- "https://onedrive.live.com/:u:/g/personal/D7F26BE16D487B10/EYJxLYphlkRFogUmL7LhO4QBEym63JCSoZVQXXgeXG6ptA?resid=D7F26BE16D487B10!s8a2d718296614544a205262fb2e13b84&ithint=file%2Cxlsx&e=Oj2gQq&migratedtospo=true&redeem=aHR0cHM6Ly8xZHJ2Lm1zL3gvYy9kN2YyNmJlMTZkNDg3YjEwL0VZSnhMWXBobGtSRm9nVW1MN0xoTzRRQkV5bTYzSkNTb1pWUVhYZ2VYRzZwdEE_ZT1PajJnUXE&download=1" temp_file <- tempfile(fileext = ".xlsx") curl_download(url, temp_file) data <- read_excel(temp_file) head(data)
方案2:使用onedrive R包直接操作(推荐)
该包可直接连接OneDrive,无需手动处理链接,支持一键下载/上传:
- 安装并加载包:
install.packages("onedrive") library(onedrive)
- 授权登录(首次运行会弹出网页授权窗口,用你的账号登录即可):
od_auth()
- 下载目标文件:
temp_file <- tempfile(fileext = ".xlsx") # 替换为文件在OneDrive中的相对路径,或使用文件ID od_download(path = "目标文件夹/你的文件.xlsx", dest = temp_file) data <- read_excel(temp_file)
- 处理数据后上传回OneDrive:
# 导出处理后的数据 write_excel_csv(data, "processed_data.xlsx") # 上传到OneDrive指定路径 od_upload("processed_data.xlsx", path = "目标文件夹/processed_data.xlsx")
方案3:通过Microsoft Graph API手动调用
适合需要更灵活控制的场景:
- 在Azure AD注册应用,获取客户端ID和客户端密钥
- 获取访问令牌:
library(httr) token_url <- "https://login.microsoftonline.com/common/oauth2/v2.0/token" response <- POST(token_url, body = list( client_id = "你的客户端ID", client_secret = "你的客户端密钥", grant_type = "client_credentials", scope = "https://graph.microsoft.com/.default" ), encode = "form") token <- content(response)$access_token
- 下载文件(需先通过Graph API查询文件的Drive ID和Item ID):
temp_file <- tempfile(fileext = ".xlsx") download_url <- "https://graph.microsoft.com/v1.0/drives/{你的Drive ID}/items/{你的文件Item ID}/content" GET(download_url, add_headers(Authorization = paste("Bearer", token)), write_disk(temp_file, overwrite = TRUE)) data <- read_excel(temp_file)
- 上传处理后的文件:
write_excel_csv(data, "processed_data.xlsx") upload_url <- "https://graph.microsoft.com/v1.0/drives/{你的Drive ID}/items/{目标文件夹Item ID}:/processed_data.xlsx:/content" PUT(upload_url, add_headers(Authorization = paste("Bearer", token)), body = upload_file("processed_data.xlsx"))
内容的提问来源于stack exchange,提问作者gerard
相关产品推荐
相关产品推荐

