개요
엑셀 파일을 다루다 보면 여러 소스에서 받은 다양한 파일들을 하나의 파일로 합쳐야 하는 경우가 많습니다. 특히 데이터 분석이나 보고서를 작성할 때 여러 파일의 데이터를 통합해야 하는 경우가 발생합니다. 이번 블로그 글에서는 사용자 친화적인 Python GUI 프로그램을 통해 여러 개의 엑셀 파일을 하나로 합치고, 필요한 데이터만 추출하는 방법을 소개합니다.
주요 기능
이 프로그램은 다음과 같은 기능들을 제공합니다:
- 디렉토리 선택: 사용자가 엑셀 파일들이 있는 디렉토리를 선택할 수 있습니다.
- 필터 제거: 엑셀 파일의 필터를 제거하여 모든 데이터를 표시합니다.
- 특정 컬럼 추출: 사용자가 선택한 특정 컬럼만 추출하여 데이터를 결합합니다.
- 엑셀 파일 결합: 선택한 디렉토리의 모든 엑셀 파일을 하나의 파일로 결합합니다.
- 결과 저장: 결합된 데이터를 새로운 엑셀 파일로 저장합니다.
기능 설명
1. 디렉토리 선택
사용자가 엑셀 파일들이 있는 디렉토리를 선택할 수 있도록 합니다. tkinter
의 filedialog.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. 사용 방법
- 프로그램 실행: 위 코드를 실행하여 GUI 프로그램을 시작합니다.
- 디렉토리 선택: "디렉토리 선택" 버튼을 클릭하여 엑셀 파일들이 있는 폴더를 선택합니다.
- 필터 제거: "필터 해제" 버튼을 클릭하여 선택한 디렉토리의 모든 엑셀 파일에서 필터를 제거합니다.
- 컬럼 입력: 필요한 컬럼 이름을 '/'로 구분하여 입력합니다.
- 엑셀 파일 합치기: "엑셀 파일 합치기" 버튼을 클릭하여 모든 파일을 하나의 엑셀 파일로 합칩니다.
결론
이 프로그램은 여러 엑셀 파일을 통합하고 필요한 데이터만 추출하는 과정을 매우 간단하게 만듭니다. 데이터 통합 및 관리가 필요한 상황에서 시간과 노력을 절약할 수 있습니다. 사용자 친화적인 인터페이스와 강력한 기능을 통해 엑셀 파일 작업을 효율적으로 수행할 수 있습니다.
'자동화' 카테고리의 다른 글
[202407] 파이썬 Selenium을 통한 크롤링 방법(스크롤 이동 포함) (4) | 2024.07.22 |
---|---|
[202407] 크롬 및 크롬드라이버 버전 114 설치 방법 (3) | 2024.07.22 |
[202407] 마우스 자동 반복 클릭 프로그램(다운로드) pw : 1993 (1) | 2024.07.18 |
[202407] 블랙잭 연습 프로그램 소개(다운로드) (0) | 2024.07.17 |
[202407] PC 최적화 및 유지보수 자동화 툴(다운로드) (0) | 2024.07.15 |