본문 바로가기
Office.com

[Onedrive Online]Python을 사용하여 web Onedrive의 엑셀 파일 편집,업로드,다운로드 하기

by Mr.noobiest 2023. 4. 5.

 

https://~~~~~~~/~~~~~~/onedrive.aspx

로 구성되어 있는 Onedrive에 Python을 사용하여 접근하고 내부에 적재된 파일을 수정하는 코드를 간략하게 작성해보았습니다.

 

 

-하고자 하는 동작-

1) 로컬 PC에  있는 Excel 파일('File_Path/File_Name.xlsx')을 원드라이브에 이미 올린 Excel파일이랑 합친다.
or
2) 로컬 PC에  있는 Excel 파일('File_Path/File_Name.xlsx')을 원드라이브에 이미 올린 Excel파일에 덮어씌운다.

 

 

 


-코드를 사용하기전  선작업-

1) Azure에 가서 아래 값들을 가져와야 한다.

TENANT_ID = ''
CLIENT_ID = ''
SECRET_ID =''
AUTHORITY = 'https://login.microsoftonline.com/' + TENANT_ID
ENDPOINT = 'https://graph.microsoft.com/v1.0'

 

1) https://portal.azure.com/#home

2) https://portal.azure.com/#allservices/category/All 모든 서비스로 이동한다.

3) 앱 등록 검색

4) 새 등록

5) 웹

 

6) 생성된 앱 > 인증서 및 암호 > 클라이언트 비밀 > + 새 클라이언트  암호 원하느 기간을 선택한 후 생성

생성된 값과 비밀 ID를 잘 보관한다.

7) 앱 > API  사용 권한 > +  권한 추가 > Microsoft API > mocrosoft Graph > 위임된 권한 > File로  검색  > 원하는 기능들을 선택한다.

 

여기까지 완료한 뒤 개요를 가면 아래와 같이 ID값들을  볼 수 있다.

 

 

 

TENANT_ID = 디렉터리(테넌트)ID

CLIENT_ID =  애플리케이션(클라이언트)ID

SECRET_ID= 인증서 암호 > 값

 

위에서 나옵 값들을 잘 보관해두도록 하자


 

 

 

-일단 1)번부터 구현해보자.

1) 로컬 PC에  있는 Excel 파일('File_Path/File_Name.xlsx')을 원드라이브에 이미 올린 Excel파일이랑 합친다.

 

import pandas as pd
import os
import datetime
from O365.excel import WorkBook
from O365 import Account, FileSystemTokenBackend


#기생성된 o365_token.txt를 사용하여 원드라이브 서버에 접속하기
TENANT_ID = ''
CLIENT_ID = ''
SECRET_ID =''
AUTHORITY = 'https://login.microsoftonline.com/' + TENANT_ID
ENDPOINT = 'https://graph.microsoft.com/v1.0'
credentials = (CLIENT_ID, SECRET_ID)
token_backend = FileSystemTokenBackend(token_filename='/o365_token.txt')
account = Account(credentials, token_backend=token_backend)

storage = account.storage()  
drives = storage.get_drives()
my_drive = storage.get_default_drive()  # or get_drive('drive-id')
root_folder = my_drive.get_root_folder()

 

## Option_1) 기존파일을 덮어쓰기
uploaded_file = root_folder.upload_file(item='File_Path/File_Name.xlsx')

 

## Option_2) 기존파일아래에 Append형식으로 추가하기
file_name='File_Name.xlsx'
for item in root_folder.get_items():
    if item.name==file_name:  
        excel_file = WorkBook(item)  # my_file_instance should be an instance of File.
        ws = excel_file.get_worksheet('worksheet_Name')
        used_range=ws.get_used_range()
        used_values=used_range.values
#         used_df=pd.DataFrame(used_values)[1:]
#        used_df.columns=used_values[0]
        my_data=new_data.values.tolist()
        row_len=len(new_data)
        start_rownum=used_range.row_count
        append_range=ws.get_range('my_worksheet!A{}:L{}'.format(start_rownum+1,start_rownum+row_len))
        append_range.values=my_data
        append_range.update()
    else:
        pass

 

위 부분에서 각 변수는 다음을 나타낸다.

1) excel_file-> 실제엑셀 파일을 연결한다.

2) ws -> 연결된 엑셀 파일내의 특정 시트에 연결한다.

3) used_range -> 연결된 시트에서 특정 범위를 지정한다 <- 이때 직접 범위를 지정해도 되지만, get_used_range()를 사용하면 현재 사용중인 모든 범위를 자동으로 선택해준다.

 

4) used_df -> user_range를 사용하여 구한 used_values를 사용하여 dataframe형태로 저장한다.

5) get_range -> 3)에서 사용한 get_used_range()와 비슷하지만 이것을 직접 범위를 지정해주는것이다, 코드상에서는 

(마지막 범위+1) : (새롭게 추가되는 데이터의 길이)를 범위로 지정하였다.

 

6) 지정된 범위에 값을 넣어준다.

 

주의할점은 범위지정을 잘못하면 에러가 발생하는 것은 물론 이미 있는 데이터에도 영향을 줄수 있으니 주의할것.

코드 실행전 백업본을 먼저 생성하는것을 권장한다.

 


 

2) 로컬 PC에  있는 Excel 파일('File_Path/File_Name.xlsx')을 원드라이브에 이미 올린 Excel파일에 덮어씌운다.

1)번 방법보다 2)번방법이  훨씬 간단하다.

 

먼저 자신이 업로드하고 싶은 파일을 xlsx형식으로 저장한다(로컬저장)

excel_location="엑셀 파일이 저장된 경로/엑셀파일명.xlsx"

 

file_name='File_Name.xlsx'
for item in root_folder.get_items():
    if item.name==file_name:  
      root_folder.upload_file(item=excel_location) 

for문을 잘 활용하여 경로내의 있는 다른 경로에도 접근하여 1),2)방법을 모두 사용가능하다.

 

 

다음은 onedrive가 아닌 sharepoint에 있는 파일도 수정,삭제,변경하는 방법을 올리겠다.

 

 

 

728x90
반응형