"""
두 범위를 df로 읽어서 merge(vlookup) 후 지정 위치에 저장
────────────────────────────────────────────────────────────
df1, df2, df_result 각각 skip_rows / 시작열 / 끝열 독립 지정
"""
import pandas as pd
# ── 설정 ─────────────────────────────────────────────────────────
FILE = '01vlookup.xlsm'
SHEET = 'Sheet1'
# df1 범위 설정
DF1_SKIP_ROWS = 3 # 헤더 위 공백 행 수
DF1_COL_START = 'A'
DF1_COL_END = 'B'
DF1_COL_NAMES = ['이름', '제품']
# df2 범위 설정
DF2_SKIP_ROWS = 3
DF2_COL_START = 'F'
DF2_COL_END = 'G'
DF2_COL_NAMES = ['제품', '가격']
# 결과 출력 위치 설정
OUT_SKIP_ROWS = 3 # 헤더 위 공백 행 수 (데이터는 +1행부터 시작)
OUT_COL_START = 'J'
# ── 유틸 ─────────────────────────────────────────────────────────
def col_to_idx(col):
"""열 문자 → 0-based 인덱스 (A=0, B=1, J=9 ...)"""
return ord(col.upper()) - ord('A')
def read_range(file, sheet, skip_rows, col_start, col_end, col_names):
"""
지정 열 범위 읽기
- skip_rows+1 : 헤더행까지 스킵 후 col_names 직접 지정
→ 같은 헤더명이 여러 범위에 있어도 suffix(.1 등) 방지
- 빈 행(all NaN) 감지 시 그 직전까지만 사용
"""
s, e = col_to_idx(col_start), col_to_idx(col_end)
df_raw = pd.read_excel(
file, sheet_name=sheet,
skiprows=skip_rows + 1,
usecols=range(s, e + 1),
header=None,
names=col_names,
)
empty = df_raw.isnull().all(axis=1)
cut = empty.idxmax() if empty.any() else len(df_raw)
return df_raw.iloc[:cut].copy()
# ── STEP 1: 읽기 ─────────────────────────────────────────────────
df1 = read_range(FILE, SHEET, DF1_SKIP_ROWS, DF1_COL_START, DF1_COL_END, DF1_COL_NAMES)
df2 = read_range(FILE, SHEET, DF2_SKIP_ROWS, DF2_COL_START, DF2_COL_END, DF2_COL_NAMES)
print("df1:\n", df1)
print("\ndf2:\n", df2)
# ── STEP 2: merge (vlookup) ──────────────────────────────────────
df_result = df1.merge(df2, on='제품', how='left')
print("\n결과:\n", df_result)
# ── STEP 3: 저장 ─────────────────────────────────────────────────
# startrow = OUT_SKIP_ROWS + 1 → 헤더행(OUT_SKIP_ROWS) 다음 데이터행
start_row = OUT_SKIP_ROWS + 1
start_col = col_to_idx(OUT_COL_START)
with pd.ExcelWriter(
FILE,
engine='openpyxl',
mode='a',
if_sheet_exists='overlay',
engine_kwargs={'keep_vba': True},
) as writer:
df_result.to_excel(
writer,
sheet_name=SHEET,
startrow=start_row,
startcol=start_col,
index=False,
header=False,
)
print("\n✅ 저장 완료")