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

루까까·2023년 10월 14일
0

Excel 자동화

목록 보기
20/25

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

1. 전체 코드

def find_replace_value(file_name: str, sheet_name: [str, int], find_values= [str, int],
                       replace_values: [str, int] = None) -> list:

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

    data = []

    for row in ws.iter_rows(values_only=True):
        data.append(row)

    df = pd.DataFrame(data[1:], columns=data[0])

    indices = np.where(df.values == find_values)
    rows, cols = indices[0], indices[1]
    result_list = []

    n = 0
    for row in rows:
        row = int(row) + 2
        col = cols[n]
        col = int(col) + 1
        result_list.append(get_column_letter(col)+str(row))
        n += 1

    if replace_values is not None:

        for i in result_list:
            ws[i].value = replace_values

        wb.save(file_name)

    return result_list

2. 코드 설명

2-1. 함수 인자 설명

def find_replace_value(file_name: str, sheet_name: [str, int], find_values= [str, int], 
replace_values: [str, int] = None) -> list:
  • file_name은 엑셀명 기입
  • sheet_name은 엑셀 시트명 기입(위치도 입력 가능)
  • find_values는 내가 찾고자 하는 값을 기입
    • 해당 값을 찾았으면 위치를 반환하며 해당 type은 list이다.
    • 해당 반환 type이 list인 이유는 똑같은 값을 여러개 찾을 경우를 대비해서다.
    • ex) ["A1","B2"]로 반환
  • replace_values는 내가 찾은 값을 어떤값으로 변경할지 기입
    • 변경할 값이 없다면 None 혹은 기입을 안해도 된다.

2-2. 데이터 호출

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

data = []

for row in ws.iter_rows(values_only=True):
    data.append(row)

df = pd.DataFrame(data[1:], columns=data[0])
  • openpyxl의 iter_rows함수를 이용하여 data라는 list에 값을 추가한다.
  • 해당 값을 pandas의 DataFrame함수를 이용하여 df라는 데이터프레임으로 변환한다.

2-2. find_values

indices = np.where(df.values == find_values)
rows, cols = indices[0], indices[1]
result_list = []

n = 0
for row in rows:
    row = int(row) + 2
    col = cols[n]
    col = int(col) + 1
    result_list.append(get_column_letter(col)+str(row))
    n += 1
  • numpy의 where함수를 이용하여 사용자가 찾고자 하는 값을 찾은 뒤, indices에 저장한다.
    • indices의 첫번째 값은(해당 값은 numpy.ndarray type이다.) row값이며 두번째 값은 col값이다.
  • 해당값을 for문은 이용하여 cell 위치를 찾고, 그 값을 result_list에 저장시킨다.

2-3. replace_values

if replace_values is not None:

    for i in result_list:
        ws[i].value = replace_values

    wb.save(file_name)

return result_list
  • 만약 replace_values가 있다면 find_values에서 찾은 result_list와 openpyxl의 value를 이용하여 cell값을 변경한다.

여담

기존 uipath의 경우 수식을 찾거나 변경하는 것을 지원하지 않았다.하지만 python의 경우 openpyxl을 활용하였기에 수식값을 읽을 수 있어 수식을 찾거나 변경하는 것이 가능하다.
하지만 단점으로는 수식값이 아닌 수식이 보여지는 값으로 찾을 수가 없다는 단점이 존재한다.

여담2

uipath의 경우 세가지 기능을 지원하였는데
1. 찾기
2. 바꾸기
3. 모두 바꾸기
이지만 현재 필자가 만든 기능을 1,3기능을 지원한다.

profile
기타치는 개발자

0개의 댓글