컴퓨터/Python

python pandas clipboard 이용해서 처리하자 jupyter lab 양식

풍경소리^^ 2026. 3. 24. 16:10
"""
vlookup_to_clipboard.py
=======================
Python 역할: 데이터 읽기 → merge → 클립보드 복사
VBA  역할 : 클립보드 → 지정 셀에 붙여넣기 (서식/VBA/필터 완전 보존)

지원 형식: xls / xlsx / xlsm
"""

import time
import pandas as pd
from pathlib import Path
from openpyxl.utils import column_index_from_string

start = time.time()


# =============================================================================
# 공통 읽기 함수
# =============================================================================
def process_dataframe(file, sheet_name, col_start, col_end,
                      skip_rows, col_title_list=None):
    """xls / xlsx / xlsm 공통 DataFrame 읽기 + 첫 공백행 전까지 자동 절단"""
    ext = Path(file).suffix.lower()
    engine = 'xlrd' if ext == '.xls' else 'openpyxl'

    df = pd.read_excel(file,
                       sheet_name=sheet_name,
                       header=skip_rows,
                       usecols=f"{col_start}:{col_end}",
                       names=col_title_list,
                       engine=engine)

    first_blank_index = df[df.isnull().all(axis=1)].index.min()
    if pd.notna(first_blank_index):
        df = df.iloc[:first_blank_index]
    return df


# =============================================================================
# 메인
# =============================================================================
def main():
    file_ext = Path(FILE).suffix.lower().lstrip('.')

    print(f"\n{'='*52}")
    print(f" 파일   : {FILE}")
    print(f" 확장자 : .{file_ext}")
    print(f"{'='*52}")

    # ── df1: A:B 읽기 (이름, 제품) ───────────────────────────────────────
    df1 = process_dataframe(FILE, SHEET_NAME,
                            COL_START_DF1, COL_END_DF1, SKIP_ROWS)
    print(f"\n[df1] shape={df1.shape}\n{df1.to_string()}")

    # ── df2: F:G 읽기 (제품, 가격) ───────────────────────────────────────
    df2 = process_dataframe(FILE, SHEET_NAME,
                            COL_START_DF2, COL_END_DF2, SKIP_ROWS,
                            COL_TITLE_LIST_DF2)
    print(f"\n[df2] shape={df2.shape}\n{df2.to_string()}")

    # ── merge ─────────────────────────────────────────────────────────────
    df_result = df1.merge(df2, on=MERGE_KEY, how='left')
    df_result.columns = RESULT_COLUMNS
    print(f"\n[결과] shape={df_result.shape}\n{df_result.to_string()}")

    # ── 클립보드 복사 (index/header 없이 값만) ────────────────────────────
    df_result.to_clipboard(index=False, header=False)
    print(f"\n📋 클립보드 복사 완료 → VBA에서 붙여넣기 대기 중...")

    end = time.time()
    print(f"✅ Python 완료 | 경과시간: {end - start:.5f} sec")


# =============================================================================
# 설정값 (여기만 수정)
# =============================================================================
if __name__ == "__main__":

    FILE       = "01xls.xls"
    SHEET_NAME = "Sheet1"
    SKIP_ROWS  = 3          # 헤더 4행 → 0-based = 3

    COL_START_DF1 = "A"
    COL_END_DF1   = "B"

    COL_START_DF2      = "F"
    COL_END_DF2        = "G"
    COL_TITLE_LIST_DF2 = ['제품', '가격']

    MERGE_KEY      = '제품'
    RESULT_COLUMNS = ['이름', '제품', '가격']

    main()

실행후

데이터 처리 결과 붙여넣기 Ctrl + v

claude_pandas_excel_final.py
0.00MB

 

01xls.xls
0.05MB
01xlsm.xlsm
0.02MB
01xlsx.xlsx
0.02MB

 

이 방법으로 하면 vba도 영향이 안가고 양식에도 안가니까 이 방법이 현재까지의 답

 

jupyter lab 참고파일

★exceltopython_pandas_entry.ipynb
2.43MB