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

루까까·2023년 8월 9일
0

Excel 자동화

목록 보기
8/25

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

1. 전체 코드

def clear_sheet_range_table(file_name: str, sheet_name: [str, int], header_y_n: bool = True, range: str = None):

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

    if range:
        pattern = r'[a-z A-Z]+'
        result = re.findall(pattern, range)
        alphabet = result
        start_column = alphabet[0]
        start_column = int(ord(start_column)) - 64
        end_column = alphabet[1]
        end_column = int(ord(end_column)) - 64

        pattern = r'\d+'
        result = re.findall(pattern, range)
        numbers = result
        start_row = int(numbers[0])
        end_row = int(numbers[1])

        for row in ws.iter_rows(min_row=start_row, max_row=end_row, min_col=start_column, max_col=end_column):
            for cell in row:
                cell.value = None

    else:

        if header_y_n:
            ws.delete_rows(2, ws.max_row)
        else:
            ws.delete_rows(1, ws.max_row)

    wb.save(file_name)

2. 코드 설명

2-1. 함수 인자 정의

def clear_sheet_range_table(file_name: str, sheet_name: [str, int], header_y_n: bool = True, range: str = None):
  • file_name은 엑셀명 기입
  • sheet_name은 엑셀 시트명 기입(위치도 입력 가능)
  • header_y_n은 머리글 삭제 유무
    • True의 경우 머리글 삭제 X
    • False의 경우 머리글 삭제 O
    • 범위 삭제의 경우 머리글 유무가 상관없음
  • range는 범위 삭제의 경우에 쓰임

2-2. 시트 삭제

range가 None값이면 시트 삭제로 할당된다.
시트 삭제 코드는 다음과 같다.

else:
    if header_y_n:
        ws.delete_rows(2, ws.max_row)
    else:
        ws.delete_rows(1, ws.max_row)
  • header_y_n의 값에 따라 지우는 범위가 달라진다.
  • 자동으로 최대행값을 계산해서 삭제해주기에 최대행 갯수를 기입할 필요가 없다.

2-3. 범위 삭제

range에 범위를 기입하면 해당 범위 삭제로 할당된다.
범위 삭제 코드는 다음과 같다.

if range:
    pattern = r'[a-z A-Z]+'
    result = re.findall(pattern, range)
    alphabet = result
    start_column = alphabet[0]
    start_column = int(ord(start_column)) - 64
    end_column = alphabet[1]
    end_column = int(ord(end_column)) - 64

    pattern = r'\d+'
    result = re.findall(pattern, range)
    numbers = result
    start_row = int(numbers[0])
    end_row = int(numbers[1])

    for row in ws.iter_rows(min_row=start_row, max_row=end_row, min_col=start_column, max_col=end_column):
        for cell in row:
            cell.value = None
  • 범위 삭제의 경우 A2:B3의 형식처럼 기입을 해주면 된다.
  • 머리글 상관없이 범위로 지정된 모든 값을 삭제 해준다.
2-3-1. 삭제 열 범위 구하기
pattern = r'[a-z A-Z]+'
result = re.findall(pattern, range)
alphabet = result
start_column = alphabet[0]
start_column = int(ord(start_column)) - 64
end_column = alphabet[1]
end_column = int(ord(end_column)) - 64
  • 정규식을 사용하여 영어로 된 부분을 추출한다.
  • 추출된 값은 ord함수를 이용하여 유니코드 정수로 변환한다.
2-3-2. 삭제 행 범위 구하기
 pattern = r'\d+'
 result = re.findall(pattern, range)
 numbers = result
 start_row = int(numbers[0])
 end_row = int(numbers[1])
  • 정규식을 사용하여 숫자로된 부분을 추출한다.
2-3-3. 범위 삭제
for row in ws.iter_rows(min_row=start_row, max_row=end_row, min_col=start_column, max_col=end_column):
        for cell in row:
            cell.value = None
  • 추출한 값들을 iter_rows함수에 기입한다.
  • 해당 cell의 값들을 none값 즉, 빈값으로 변환한다.

여담

범위 삭제의 경우 범위값이 넓으면 넓을수록 시간이 오래걸리는 단점이 있다.
원인은 2-3-3에 코드를 보면 알 수 있는데 범위로 지정된 해당 cell들을 하나하나씩 찾아서 삭제하기때문이다.

profile
기타치는 개발자

1개의 댓글

comment-user-thumbnail
2023년 8월 9일

글 잘 봤습니다.

답글 달기