본문 바로가기

자동화

[202407] 엑셀 파일 합치기 프로그램 [필터 제거, 컬럼 추출 포함](다운로드)

반응형
dist_optimize_vm_v3.exe
19.84MB

 

Link Button 패스워드 페이지 이동

개요

엑셀 파일을 다루다 보면 여러 소스에서 받은 다양한 파일들을 하나의 파일로 합쳐야 하는 경우가 많습니다. 특히 데이터 분석이나 보고서를 작성할 때 여러 파일의 데이터를 통합해야 하는 경우가 발생합니다. 이번 블로그 글에서는 사용자 친화적인 Python GUI 프로그램을 통해 여러 개의 엑셀 파일을 하나로 합치고, 필요한 데이터만 추출하는 방법을 소개합니다.

주요 기능

이 프로그램은 다음과 같은 기능들을 제공합니다:

  1. 디렉토리 선택: 사용자가 엑셀 파일들이 있는 디렉토리를 선택할 수 있습니다.
  2. 필터 제거: 엑셀 파일의 필터를 제거하여 모든 데이터를 표시합니다.
  3. 특정 컬럼 추출: 사용자가 선택한 특정 컬럼만 추출하여 데이터를 결합합니다.
  4. 엑셀 파일 결합: 선택한 디렉토리의 모든 엑셀 파일을 하나의 파일로 결합합니다.
  5. 결과 저장: 결합된 데이터를 새로운 엑셀 파일로 저장합니다.

기능 설명

1. 디렉토리 선택

사용자가 엑셀 파일들이 있는 디렉토리를 선택할 수 있도록 합니다. tkinterfiledialog.askdirectory 함수를 사용하여 디렉토리를 선택하고, 선택한 디렉토리를 라벨에 표시합니다.

def select_directory():
    directory = filedialog.askdirectory()
    directory_label.config(text=directory)
    return directory

2. 특정 컬럼 추출

사용자가 입력한 특정 컬럼만 추출합니다. 사용자는 슬래시('/')로 구분하여 여러 컬럼 이름을 입력할 수 있습니다. 이 함수는 입력된 컬럼 이름을 리스트로 변환합니다.

def get_column_names():
    columns_input = entry_columns.get()
    column_names = columns_input.split('/')
    return column_names

3. 필터 제거

선택한 디렉토리의 모든 엑셀 파일에서 필터를 제거합니다. 엑셀 파일의 첫 번째 시트를 선택하고, 모든 필터를 제거한 후 데이터프레임으로 변환하여 저장합니다.

def unfilter_sheet():
    directory = directory_label.cget("text")
    if not directory:
        result_label.config(text="디렉토리를 선택하세요.")
        return

    all_files = glob.glob(os.path.join(directory, "*.xlsx"))
    if not all_files:
        result_label.config(text="엑셀 파일이 없습니다.")
        return

    for file in all_files:
        try:
            file_name = os.path.basename(file)
            print(file_name)
            workbook = load_workbook(file)

            sheet = workbook[workbook.sheetnames[0]]

            for row in sheet:
                if sheet.row_dimensions[row[0].row].hidden == False:
                    if row[0].row == 1:
                        header = [i.value for i in row]
                        df = pd.DataFrame(columns=header)
                    else:
                        df.loc[len(df)] = [i.value for i in row]

            output_file = os.path.join(directory, file_name)
            df.to_excel(output_file, index=False)
            unfilter_label.config(text='--------필터제거 완료--------')

        except Exception as e:
            print(f"파일 '{file}' : {e}")
            unfilter_label.config(text=f"파일 '{file}' : {e}")
            continue

4. 엑셀 파일 결합

선택한 디렉토리의 모든 엑셀 파일을 하나의 파일로 결합합니다. 각 파일에서 유효한 컬럼을 필터링하여 데이터프레임에 추가하고, 각 파일의 행 수를 요약한 후 결과를 새로운 엑셀 파일로 저장합니다.

def concatenate_excel_files():
    print('*********************')
    directory = directory_label.cget("text")
    if not directory:
        result_label.config(text="디렉토리를 선택하세요.")
        return

    all_files = glob.glob(os.path.join(directory, "*.xlsx"))
    if not all_files:
        result_label.config(text="엑셀 파일이 없습니다.")
        return

    concatenated_data = pd.DataFrame()
    summary_data = []
    for file in all_files:
        try:
            file_name = os.path.basename(file)
            print(file_name)
            workbook = load_workbook(file)

            sheet = workbook[workbook.sheetnames[0]]

            for merged_cell_range in sheet.merged_cells.ranges:
                sheet.unmerge_cells(merged_cell_range)

            workbook.save(file)
            data_in_file = pd.read_excel(file)

        except Exception as e:
            print(f"파일 '{file}' : {e}")
            continue

        valid_columns = [col for col in get_column_names() if col in data_in_file.columns]

        if valid_columns:
            filtered_data = data_in_file[valid_columns]
            dropna_data = filtered_data.dropna()
            row_count = len(dropna_data) if not dropna_data.empty else 0
            print(row_count)
            concatenated_data = pd.concat([concatenated_data, dropna_data], ignore_index=True)
            summary_data.append([file_name, row_count])

    summary_df = pd.DataFrame(summary_data, columns=['엑셀명', '행의 개수'])

    if concatenated_data.empty:
        result_label.config(text="열 없음")
        return

    c_time = datetime.now()
    t = f"{c_time.year}.{c_time.month}.{c_time.day}.{c_time.hour}.{c_time.minute}"    
    output_file = os.path.join("C:/output", f"{t}concatenated.xlsx")
    with pd.ExcelWriter(output_file) as writer:
        concatenated_data.to_excel(writer, index=False, sheet_name='data')
        summary_df.to_excel(writer, index=False, sheet_name='summary')
        result_label.config(text=f"합쳐진 파일 저장됨: {output_file}")

    print(output_file)
    print('저장 완료')

5. 사용 방법

  1. 프로그램 실행: 위 코드를 실행하여 GUI 프로그램을 시작합니다.
  2. 디렉토리 선택: "디렉토리 선택" 버튼을 클릭하여 엑셀 파일들이 있는 폴더를 선택합니다.
  3. 필터 제거: "필터 해제" 버튼을 클릭하여 선택한 디렉토리의 모든 엑셀 파일에서 필터를 제거합니다.
  4. 컬럼 입력: 필요한 컬럼 이름을 '/'로 구분하여 입력합니다.
  5. 엑셀 파일 합치기: "엑셀 파일 합치기" 버튼을 클릭하여 모든 파일을 하나의 엑셀 파일로 합칩니다.

결론

이 프로그램은 여러 엑셀 파일을 통합하고 필요한 데이터만 추출하는 과정을 매우 간단하게 만듭니다. 데이터 통합 및 관리가 필요한 상황에서 시간과 노력을 절약할 수 있습니다. 사용자 친화적인 인터페이스와 강력한 기능을 통해 엑셀 파일 작업을 효율적으로 수행할 수 있습니다.

반응형