import pandas as pd
import numpy as np
# --- 1. 샘플 데이터 생성 ---
# 실제 파일이 있다면 이 부분은 건너뛰고 파일 경로만 수정해서 사용하세요.
# File1: 모든 데이터가 존재
data1 = {'co': [1, 2, 3, 4, 5],
'내용': ['성공', '실패', '진행중', np.nan, '성공'],
'col1': ['val_a', 'val_b', np.nan, 'val_d', 'val_e']}
df1 = pd.DataFrame(data1)
df1.to_excel("file1.xlsx", index=False)
# File2: '내용' 열이 부분적으로 비어있음
data2 = {'co': [1, 2, 3, 5, 6],
'내용': ['성공', np.nan, '진행중', np.nan, '실패']}
df2 = pd.DataFrame(data2)
df2.to_excel("file2.xlsx", index=False)
print("--- 원본 file1.xlsx ---")
print(df1)
print("\n--- 원본 file2.xlsx ---")
print(df2)
# --- 2. 데이터 불러오기 ---
file1_path = 'file1.xlsx'
file2_path = 'file2.xlsx'
df1 = pd.read_excel(file1_path)
df2 = pd.read_excel(file2_path)
# --- 3. File1에서 이전할 데이터 필터링 ---
# 조건: '내용'과 'col1'에 모두 값이 있는 데이터만 선택
source_data = df1[df1['내용'].notna() & df1['col1'].notna()].copy()
# --- 4. 데이터 병합 (Merge) ---
# 'co' 열을 기준으로 file2에 source_data를 병합합니다.
# 겹치는 '내용' 열을 구분하기 위해 접미사를 붙입니다.
merged_df = pd.merge(df2, source_data, on='co', how='left', suffixes=('', '_file1'))
# --- 5. File2의 빈 필드 업데이트 ---
# 조건: file2의 '내용' 열이 비어있는 경우
condition = merged_df['내용'].isna()
# 조건을 만족하는 행의 '내용' 열을 file1에서 가져온 '내용_file1' 값으로 채웁니다.
merged_df.loc[condition, '내용'] = merged_df.loc[condition, '내용_file1']
# --- 6. 최종 결과 정리 및 저장 ---
# 필요한 열만 선택하여 결과물을 만듭니다.
result_df = merged_df[['co', '내용']]
output_path = 'file2_updated.xlsx'
result_df.to_excel(output_path, index=False)
print(f"\n--- 업데이트 완료 ---")
print(f"결과가 {output_path} 파일에 저장되었습니다.")
print("\n--- 업데이트된 file2_updated.xlsx 내용 ---")
print(result_df)
import pandas as pd
import numpy as np
from openpyxl import load_workbook
# --- (이전과 동일) 샘플 데이터 생성 ---
# File1: 서식이 적용된 원본 파일이라고 가정
data1 = {'co': [1, 2, 3, 4, 5],
'내용': ['성공', '실패', '진행중', np.nan, '성공'],
'col1': ['val_a', 'val_b', np.nan, 'val_d', 'val_e']}
df1_sample = pd.DataFrame(data1)
# (실제 파일에는 여기에 색상, 필터 등 서식이 있다고 가정합니다)
df1_sample.to_excel("file1_with_formatting.xlsx", index=False)
# File2: 업데이트의 기준이 될 파일
data2 = {'co': [1, 2, 3, 5, 6],
'내용': ['성공', np.nan, '진행중', np.nan, '실패']}
df2_sample = pd.DataFrame(data2)
df2_sample.to_excel("file2_reference.xlsx", index=False)
# =================================================================
# STEP 1: Pandas로 업데이트할 내용 결정
# =================================================================
print("--- Pandas 파트: 업데이트할 내용 분석 ---")
file1_path = 'file1_with_formatting.xlsx'
file2_path = 'file2_reference.xlsx'
df1 = pd.read_excel(file1_path)
df2 = pd.read_excel(file2_path)
# 1. File1에서 이전할 데이터 필터링
source_data = df1[df1['내용'].notna() & df1['col1'].notna()].copy()
# 2. File2와 병합하여 업데이트할 최종 목록 생성
merged_df = pd.merge(df2, source_data, on='co', how='left', suffixes=('', '_file1'))
update_condition = merged_df['내용'].isna() & merged_df['내용_file1'].notna()
# 3. 업데이트할 내용을 { 'co'값 : '새로운 내용' } 형태의 딕셔너리로 만들기
update_dict = merged_df.loc[update_condition].set_index('co')['내용_file1'].to_dict()
print("업데이트 대상:", update_dict)
# =================================================================
# STEP 2: OpenPyXL로 원본 파일에 데이터만 수정하고 저장
# =================================================================
print("\n--- OpenPyXL 파트: 원본 파일 서식 유지하며 업데이트 ---")
# 원본 Excel 파일(서식 포함)을 불러옴
wb = load_workbook(file1_path)
ws = wb.active # 활성화된 시트를 선택
# 헤더(첫 번째 행)를 읽어 각 열의 인덱스를 찾기
header = [cell.value for cell in ws[1]]
co_col_idx = header.index('co') + 1
content_col_idx = header.index('내용') + 1
# 헤더를 제외한 두 번째 행부터 순회
for row in ws.iter_rows(min_row=2):
co_val = row[co_col_idx - 1].value
# 현재 행의 'co' 값이 업데이트 대상 딕셔너리에 있다면
if co_val in update_dict:
new_content = update_dict[co_val]
print(f"'co' 값 {co_val}의 '내용'을 '{new_content}' (으)로 업데이트합니다.")
# 해당 행의 '내용' 셀 값을 새로운 값으로 변경
ws.cell(row=row[0].row, column=content_col_idx, value=new_content)
# 변경된 내용을 새 파일 또는 덮어쓰기로 저장
output_path = "file1_final_updated.xlsx"
wb.save(output_path)
print(f"\n모든 서식을 유지한 채 업데이트 완료! 결과가 '{output_path}' 파일에 저장되었습니다.")