要解决这个问题,需要使用 Microsoft Graph API 与 OneDrive 进行交互。首先,需要授权用户进行访问:
from msal import PublicClientApplication
app = PublicClientApplication(client_id='',
authority='https://login.microsoftonline.com/common')
result = None
accounts = app.get_accounts()
if accounts:
chosen = accounts[0]
result = app.acquire_token_silent(scopes=['User.Read', 'Files.Read.All'],
account=chosen)
if not result:
flow = app.initiate_device_flow(scopes=['User.Read', 'Files.Read.All'])
print(flow['message'])
result = app.acquire_token_by_device_flow(flow)
接下来,需要使用得到的访问令牌获取 OneDrive 中所有 Excel 文件。可以使用 https://graph.microsoft.com/v1.0/me/drive/root:/path/to/folder:/children
的 API 来获取指定文件夹下的所有文件。需要将 path/to/folder
替换为实际的文件夹路径。
import requests
url = 'https://graph.microsoft.com/v1.0/me/drive/root:/path/to/folder:/children'
headers = {'Authorization': f'Bearer {result["access_token"]}'}
response = requests.get(url, headers=headers)
if response.status_code == 200:
files = response.json()['value']
else:
print(response.text)
最后,可以使用 openpyxl
模块来遍历 Excel 文件。
import openpyxl
for file in files:
if file['file']['mimeType'] == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
url = file['@microsoft.graph.downloadUrl']
response = requests.get(url, headers=headers)
workbook = openpyxl.load_workbook(filename='temp.xlsx', data_only=True)
sheets = workbook.sheetnames
for sheet in sheets:
worksheet = workbook[sheet]
for row in worksheet.iter_rows():
for cell in row:
print(cell.value)