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

루까까·2023년 8월 20일
0

Excel 자동화

목록 보기
12/25

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

1. Delete Column

1-1. 전체 코드

def delete_column(file_name: str, sheet_name: [str, int], column: str):

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

    df = pd.read_excel(file_name, sheet_name=sheet_name)
    try:
        column_index = df.columns.get_loc(column) + 1
        ws.delete_cols(column_index)
        wb.save(file_name)

    except:
        pattern = r'[a-z A-Z]+'
        result = re.findall(pattern, column)
        alphabet = result
        alphabet_count = len(alphabet)
        if alphabet_count == 1:
            ws.delete_cols(int(ord(alphabet[0])) - 64)
            wb.save(file_name)
        elif alphabet_count == 2 and ':' in column:
            start_column = alphabet[0]
            end_column = alphabet[1]
            delete_numbers = int(ord(end_column)) - int(ord(start_column)) + 1
            ws.delete_cols(int(ord(start_column)) - 64, amount=delete_numbers)
            wb.save(file_name)
        elif ',' in column:
            column_split_str = column.split(',')
            column_split_int = [int(ord(i)) for i in column_split_str]
            column_split_int = sorted(column_split_int, reverse=True)
            for i in column_split_int:
                ws.delete_cols(i - 64)
                wb.save(file_name)
    

1-2. 코드 설명

1-2-1. 함수 인자 설명

def delete_column(file_name: str, sheet_name: [str, int], column: str):
  • file_name은 호출 엑셀명 기입
  • sheet_name은 호출 엑셀 시트명 기입(위치도 입력 가능)
  • column은 지우고자 하는 컬럼명 기입
    • 단일 컬럼명 기입 가능(ex.A)
      • 머리글 이름도 가능
    • 연속되는 복수 컬러명 기입 가능(ex.A:B)
      • :로 구분 지어야 함
    • 불연속되는 복수 컬러명 기입 가능(ex.A,C,E)
      • , 로 구분지어야 함

1-2-2. 단일 컬럼 삭제

try:
    column_index = df.columns.get_loc(column) + 1
    ws.delete_cols(column_index)
    wb.save(file_name)

except:
    pattern = r'[a-z A-Z]+'
    result = re.findall(pattern, column)
    alphabet = result
    alphabet_count = len(alphabet)
    if alphabet_count == 1:
        ws.delete_cols(int(ord(alphabet[0])) - 64)
        wb.save(file_name)
  • get_loc 함수를 통해 기입한 컬럼명의 위치를 int값으로 반환
  • 실패 시, 컬럼으로 적었다고 인식하여 예외처리로 넘어감
  • 영어명을 추출하여 추출한 list가 하나일 경우 해당 컬럼명 삭제 및 저장

1-2-3. 연속적인 복수 컬럼들 삭제

 elif alphabet_count == 2 and ':' in column:
    start_column = alphabet[0]
    end_column = alphabet[1]
    delete_numbers = int(ord(end_column)) - int(ord(start_column)) + 1
    ws.delete_cols(int(ord(start_column)) - 64, amount=delete_numbers)
    wb.save(file_name)
  • 알파벳 정규식을 통해 추출된 값이 두개 그리고 기입한 컬럼명이 :이 포함될 경우를 연속적인 복수 컬럼이라고 인지
    • ex) A:B
  • 연속적인 복수 컬럼들이기에 amount를 이용해서 한번에 삭제

1-2-4. 불연속적인 복수 컬럼들 삭제

elif ',' in column:
    column_split_str = column.split(',')
    column_split_int = [int(ord(i)) for i in column_split_str]
    column_split_int = sorted(column_split_int, reverse=True)
    for i in column_split_int:
        ws.delete_cols(i - 64)
        wb.save(file_name)
  • 위에 조건들을 제외한 나머지 분류 중, ','를 포함한 컬러명일 경우 불연속적인 복수컬럼이라고 인지
    • ex) A,D,F
  • 먼저 추출한 값들을 ord함수를 통해 알파벳(str형)을 int형으로 바꾸어 준다.
  • 바꾼 값을 내림차순으로 정렬
  • for문은 이용하여 해당 위치 컬럼 삭제

2. Delete Rows

2-1. 전체 코드

def delete_rows(file_name: str, sheet_name: [str, int], row: [str, int]):

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

    try:
        row_index = int(row)
        ws.delete_rows(idx=row_index)
        wb.save(file_name)
    except:
        if '-' in row:
            pattern = r'\d+'
            result = re.findall(pattern, row)
            numbers = result
            row_index = int(numbers[1]) - int(numbers[0]) + 1
            for i in range(row_index):
                ws.delete_rows(idx=int(numbers[0]))
                wb.save(file_name)
        elif ',' in row:
            pattern = r'\d+'
            result = re.findall(pattern, row)
            numbers = [int(i) for i in result]
            numbers = sorted(numbers, reverse=True)
            for i in numbers:
                ws.delete_rows(idx=i)
                wb.save(file_name)

2-2. 코드 설명

2-2-1. 함수 인자 설명

def delete_rows(file_name: str, sheet_name: [str, int], row: [str, int]):
  • file_name은 호출 엑셀명 기입
  • sheet_name은 호출 엑셀 시트명 기입(위치도 입력 가능)
  • row은 지우고자 하는 행 기입
    • 단일 행 기입 가능
      • (ex.1)
    • 단일 행의 경우에만 int형 str형 가능
    • 복수 행의 경우는 str형으로만 기입
    • 연속되는 복수 행 기입 가능(ex.1-4)
      • -로 구분지어야 함
    • 불연속되는 복수 행 기입 가능(ex.1,4,6)
      • , 로 구분지어야 함

2-2-2. 단일 행 삭제

    try:
        row_index = int(row)
        ws.delete_rows(idx=row_index)
        wb.save(file_name)
  • 기입한 행값을 int형으로 변환 시도
  • 해당 변환이 가능하다면 단일행으로 인지
    • 숫자값이 아닌 다른값들(ex.'-',''')값들은 예외처리로 넘어감
  • 해당 행 삭제

2-2-3. 연속적인 복수행들 삭제

if '-' in row:
    pattern = r'\d+'
    result = re.findall(pattern, row)
    numbers = result
    row_index = int(numbers[1]) - int(numbers[0]) + 1
    for i in range(row_index):
        ws.delete_rows(idx=int(numbers[0]))
        wb.save(file_name)
  • 기입한 행값에 '-'이 있으면 연속적인 복수행으로 인지
  • 정규식을 이용하여 숫자값들 추출
  • 추출된 숫자값들을 이용하여 삭제 범위 계산
  • 복수행 삭제

2-2-4. 불연속적인 복수행들 삭제

elif ',' in row:
    pattern = r'\d+'
    result = re.findall(pattern, row)
    numbers = [int(i) for i in result]
    numbers = sorted(numbers, reverse=True)
    for i in numbers:
        ws.delete_rows(idx=i)
        wb.save(file_name)
  • 기입한 행값에 ','이 있으면 불연속적인 복수행으로 인지
  • 정규식을 이용하여 숫자값들 추출
  • 추출된 숫자값들을 str형에서 int형 변환
  • 변환된 list 내림차순으로 정렬
  • for문을 이용하여 해당행들 삭제

여담

위에서 설명한 코드들 중에서 귀찮에 내림차순으로 정렬 후, 삭제하는 코드가 섞여 있는 경우가 있다.
그냥 기입 된 순으로 삭제를 하면 되지 않을까? 라는 생각이 있을수도 있지만
delete_rows or delete_cols의 경우 삭제 후, 위로 밀기 or 왼쪽으로 밀기 기능으로 되기 때문에 내가 지우고자 하는 위치값들이 변화한다.
따라서 내림차순으로 정렬 후, 가장 위에서부터(row의 경우) 또는 가장 오른쪽에서 부터(column의 경우) 삭제를 진행하면 위의 경우를 해결 할 수 있다.

profile
기타치는 개발자

0개의 댓글