본문 바로가기
Office.com

[MS 365] How to Using Python, connect one drive(+ excel + share point) Python코드를 사용하여, MS 365를 DB처럼 쓰기 -2

by Mr.noobiest 2024. 4. 2.

 

Azure App


1편에서는 Sharepoint와의 연결을 위한 Azure 앱 등록을 진행했다.

 

[MS 365] How to Using Python, connect one drive(+ excel + share point) Python코드를 사용하여, MS 365를 DB처럼 쓰기 -

Python으로 MS 365 데이터를 가져다 쓰기 MS365는 마소에서 만든 프로그램(엑셀/파워포인트 등)를 웹에서도 사용할 수 있게 만든 웹 어플리케이션이다, 제대로 사용하려면 유료인 경우가 많지만, 외

mrnoobiest.tistory.com

 

1편에서 구한 연결 정보들을 사용하여 python코드를 작성할 수 있다.

 


 

 

 

1) Sharepoint에 있는 엑셀 데이터를 수정하는 코드(Append하기)

 

같은 컬럼인 데이터를 맨 아래(7열)에 이어서 병합하기


1) 업로드할 Excel 파일('File_Path/File_Name.xlsx')을 Onedrive에 이미 올린 Excel파일이랑 합칠것이다.

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


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)

#o365_token.txt는 위의 연결정보들을 사용하여 생성되는 token값을 o365_token.txt란 곳에 저장한다는 의미다.
#별도로 생성할 필요없이 코드 실행시 FileSysttemTokenBackend가 생성해주는것이다.
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()
root_folder = my_drive.get_root_folder()


# 업로드할 xlsx를 원드라이브에 업로드하기
uploaded_file = root_folder.upload_file(item='File_Path/File_Name.xlsx')


#기존파일아래에 Append형식으로 추가하기
file_name='기존 File_Name.xlsx'
for item in root_folder.get_items():
    if item.name==file_name:  
        excel_file = WorkBook(item)
        ws = excel_file.get_worksheet('worksheet_Name')
        used_range=ws.get_used_range()
        used_values=used_range.values
        my_data=new_data.values.tolist()
        row_len=len(new_data)
        start_rownum=used_range.row_count
        
        #컬럼의 길이를 잘 맞추어야 한다.(A열 ~ L열 부분은 본인이 입력할 열을 입력한다.)
        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) 어떤 Excel 파일('File_Path/File_Name.xlsx')을 원드라이브에 이미 올린 Excel파일에 덮어씌운다.(Overwrite)

 

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

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

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


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)

#o365_token.txt는 위의 연결정보들을 사용하여 생성되는 token값을 o365_token.txt란 곳에 저장한다는 의미다.
#별도로 생성할 필요없이 코드 실행시 FileSysttemTokenBackend가 생성해주는것이다.
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()
root_folder = my_drive.get_root_folder()


# 업로드할 xlsx를 원드라이브에 업로드하기
uploaded_file = root_folder.upload_file(item='File_Path/File_Name.xlsx')



#기존파일아래에 Append형식으로 추가하기
file_name='기존 File_Name.xlsx'
for item in root_folder.get_items():
    if item.name==file_name:  
    
    	############################
        root_folder.upload_file(item=excel_location) #<--이거만 입력하면 끝.
        ############################
        
    else:
        pass

 


 

 

다른 경로로 이동하는 법


for문을 잘 활용하여 경로내의 있는 다른 경로에도 접근할 수도 있다.

아래는 다른 경로를 서칭하여 해당 경로로 이동하는 예시 코드다.

first_folder_name='경로1'
folder_name="경로2"
file_name="엑셀 파일명.xlsx"    
sheet_name='Sheet1 시트명'


drive_items = root_storage.site_storage.get_drives()[0].get_items()

first_folder = next((item for item in drive_items if item.name == first_folder_name), None)

if first_folder is not None:
    second_folder = next((item for item in first_folder.get_items() if item.name == folder_name), None)
if second_folder is not None:
    my_file = next((item for item in second_folder.get_items() if item.name == file_name), None)

 

 

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

 

끝.

728x90
반응형