[excel - python - uipath] 엑셀 자동화에 대해서 알아보자(9-2)

루까까·2023년 10월 4일
0

Excel 자동화

목록 보기
18/25

이번 시간에는 Find First/Last Data Row activity를 python 코드로 구현해보는 시간을 가져보자.
(uipath Find First/Last Data Row activity 알아보기)

1. 전체 코드

def find_first_last_data_row(file_name: str, sheet_name: [str, int], skip: int, header: bool = True,
                             first_row_offset: int = 0, last_row_offset: int = 0):
    wb = load_workbook(file_name)
    ws = wb[sheet_name]

    data = []

    for row in ws.iter_rows(values_only=True):
        if all(value is None for value in row):
            skip -= 1
            if skip == -1:
                break
        data.append(row)

    if header:
        df = pd.DataFrame(data[1:], columns=data[0])
    else:
        df = pd.DataFrame(data[1:], columns=None)

    while True:

        last_row_is_nan = df.iloc[-1].isna().all()
        if last_row_is_nan:
            df = df.drop(df.index[-1])
        else:
            break

    first_row_index = df.iloc[0].name - first_row_offset + 2

    last_row_index = df.iloc[-1].name - last_row_offset + 2
    if last_row_index < -1:
        last_row_index = -1

    return first_row_index, last_row_index

2. 코드설명

2-1. 함수 인자 설명

def find_first_last_data_row(file_name: str, sheet_name: [str, int], skip: int, header: bool = True,
                             first_row_offset: int = 0, last_row_offset: int = 0):
  • file_name은 엑셀명 기입
  • sheet_name은 엑셀 시트명 기입(위치도 입력 가능)
  • skip은 건너뛸 빈행을 기입
  • header는 머리글의 포함여부를 확인(bool값만 가능하면 기본적으로 True값만 가능하다.)
  • first_row_offset은 첫번째 행 인덱스를 의미한다.
    • 해당 값을 통해 첫번째 행을 몇번 건너뛸 것인지를 의미한다.
    • 예를들어 해당값이 1이면 첫번째 행에서 -1을 한값이 첫번째 행 값으로 반환 된다.
  • last_row_offset은 마지막 행 인덱스를 의미한다.
    • 해당 값을 통해 마지막 행을 몇번 건너뛸 것인지를 의미한다.
    • 예를들어 해당값이 1이면 마지막 행에서 -1을 한값이 마지막행 값으로 반환된다.

2-2. Excel값 호출

wb = load_workbook(file_name)
ws = wb[sheet_name]

data = []

for row in ws.iter_rows(values_only=True):
    if all(value is None for value in row):
        skip -= 1
        if skip == -1:
            break
    data.append(row)

if header:
    df = pd.DataFrame(data[1:], columns=data[0])
else:
    df = pd.DataFrame(data[1:], columns=None)
  • data라는 임의의 list를 생성한다.
  • iter_rows함수를 통해 data 변수에 값을 추가한다.
    • 물론 해당 로직에서 위에서 인입주었던 함수 인자 'skip'값에 따라 data에 값을 추가할지 안할지 결정한다.
    • 원리는 간단하다. 빈행을 만날때마다, skip을 -1을 해주면 skip이 -1이 도달하면 그 즉시 값을 쌓는 것을 멈춘다.
  • data에 모든 값을 추가하였으면 pandas에 DataFrame함수를 통해 df라는 데이터프레임을 생성한다.
    • 해당 데이터프레임을 생성할때 인입주었던 함수 인자 'header'에 따라 해당 데이터프레임의 헤더를 결정지은다.

2-3 첫번째 행, 마지막 행 반환

first_row_index = df.iloc[0].name - first_row_offset + 2
last_row_index = df.iloc[-1].name - last_row_offset + 2

if last_row_index < -1:
    last_row_index = -1

return first_row_index, last_row_index
  • 위에서 구한 데이터프레임을 바탕으로 iloc함수를 이용하여 첫번째 행과 마지막 행을 구한다.
  • 마지막 행이 -1보다 아래이면 -1로 고정시킨다.
profile
기타치는 개발자

0개의 댓글