반응형

 

엑셀을 쉽게 다루는 파이썬 모듈 openpyxl

 

openpyxl은 엑셀 데이터의 읽고, 쓰고, 수정하기, 엑셀 파일을 열고, 수정하고, 저장하기 등등 엑셀로 할 수 있는 모든 것들을 쉽게 할 수 있도록 API를 제공해주는 파이썬 라이브러리입니다. 공식 문서 링크는 다음과 같습니다.

 

https://openpyxl.readthedocs.io/en/stable/

 

openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files — openpyxl 3.0.9 documentation

Install openpyxl using pip. It is advisable to do this in a Python virtualenv without system packages: Warning To be able to include images (jpeg, png, bmp,…) into an openpyxl file, you will also need the “pillow” library that can be installed with:

openpyxl.readthedocs.io

 

pip로 설치하는 방법은 다음과 같습니다.

 

pip install openpyxl

 

 

 

엑셀 데이터 가져오기

 

이미 있는 엑셀 파일을 가져오기 위해서 openpyxl의 load_workbook 함수를 사용합니다.

 

from openpyxl import load_workbook

# excel_path = "엑셀파일의경로"
workbook = load_workbook(excel_path)

 

엑셀 파일은 여러 시트들을 가질 수 있습니다. 특정 시트에 다음과 같은 방법으로 접근할 수 있습니다.

 

# sheet_name = "시트 이름"
worksheet = workbook[sheet_name]

 

시트까지는 접근했는데 시트 안에서 특정 셀의 값을 가져오는 방법은 다음과 같습니다.

 

# i = 행 인덱스
# j = 열 인덱스
cell_value = worksheet.cell(row=i, column=j).value

 

엑셀에 대해 필요한 작업들을 다 마친 후에는 워크북을 닫아줍니다.

 

workbook.close()

 

 

 

엑셀 데이터 수정하기

 

엑셀 데이터를 수정하기 위해 존재하는 엑셀 파일을 위에서 설명한 방법대로 열어줍니다.

 

from openpyxl import load_workbook

# excel_path = "엑셀파일의경로"
# sheet_name = "시트 이름"
workbook = load_workbook(excel_path)
worksheet = workbook[sheet_name]

 

이제부터 이 워크시트에 5행5열부터 6행6열까지 총 2*2 개 데이터를 수정해야 하는 상황을 가정하겠습니다.

수정할 새 데이터는 다음과 같습니다.

a b
c d

new_data = [["a", "b"], ["c", "d"]]

 

2차원 데이터이므로 단순히 이중 포문으로 코드를 만들 수 있습니다.

 

row_start_index = 5
column_start_index = 5
row_size = 2
column_size = 2
new_data = [["a", "b"], ["c", "d"]]

for row_index in range(0, row_size):
    for column_index in range(0, column_size):
        worksheet.cell(
            row=row_start_index + row_index,
            column=column_start_index + column_index,
            value=new_data[row_index][column_index],
        )

 

좀 더 유연하게 모든 2차원 리스트에 대해 수정할 수 있는 함수를 만들었습니다.

 

def update_range(
    new_data: list,
    excel_path: str,
    sheet_name: str,
    row_start_index: int,
    column_start_index: int,
):
    if not new_data:
        return

    workbook = load_workbook(excel_path)
    worksheet = workbook[sheet_name]

    row_size = len(new_data)
    column_size = len(new_data[0])
    
    for row_index in range(0, row_size):
        for column_index in range(0, column_size):
            worksheet.cell(
                row=row_start_index + row_index,
                column=column_start_index + column_index,
                value=new_data[row_index][column_index],
            )

    workbook.save(excel_path)
    workbook.close()

 

데이터를 수정한 후에는 workbook.save(새 엑셀 경로)을 실행해야 저장 완료가 됩니다.

 

 

 

셀의 값들 삭제하기

 

엑셀 셀의 값들을 행 기준으로 삭제하는 방법입니다. worksheet 의 delete_rows 메소드를 활용합니다.

 

def delete_rows(excel_path: str, sheet_name: str, index: int = 1, amount: int = 1):
    workbook = load_workbook(excel_path)
    worksheet = workbook[sheet_name]
    worksheet.delete_rows(index, amount)

    workbook.save(excel_path)

 

예를 들어 index = 5, amount = 10 이면 5번째 행부터 14번째 행까지 총 10개의 행이 삭제됩니다.

 

 

 

reference: github repo

 

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기