본문 바로가기
카테고리 없음

파이썬으로 엑셀 셀 값 수정하기 – 데이터 입력 자동화

by jbparkbill 2025. 10. 29.
반응형

파이썬으로 엑셀 셀 값 수정하기
파이썬으로 엑셀 셀 값 수정하기

IT·디지털 생활형 블로그 · 파이썬 엑셀 자동화

 

이 글은 openpyxl을 사용해 엑셀 셀 값을 효율적으로 수정하고 대량으로 입력하는 방법을 다룹니다. 단일 셀 편집, 범위 입력, 날짜·숫자 서식, 수식 적용, 드롭다운(데이터 유효성), 조건부 서식, 찾기·치환, 시트 보호까지 실무 예제를 그대로 복사해 실행할 수 있습니다.

환경 확인과 샘플 파일

가상환경을 활성화한 뒤 openpyxl을 설치합니다.

pip install --upgrade pip
pip install openpyxl

예제에서 사용할 기본 파일을 생성합니다.

# file: 00_bootstrap.py
from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws.title = "매출"

ws.append(["월","매출","비용","이익","상태","메모","날짜"])
base = [
    ("1월",120,80,"","","","2025-01-31"),
    ("2월",150,90,"","","","2025-02-28"),
    ("3월",180,110,"","","","2025-03-31"),
]
for r in base:
    ws.append(list(r))

wb.save("셀수정_실습.xlsx")
print("초기 파일 생성 완료")

단일 셀 값 수정

특정 셀을 지정해 값을 덮어쓰는 가장 기본적인 패턴입니다.

# file: 01_single_edit.py
from openpyxl import load_workbook

wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]

ws["F2"] = "신규 프로모션 반영"
ws["B2"] = 130   # 1월 매출 수정
ws["C2"] = 75    # 1월 비용 수정

wb.save("셀수정_실습.xlsx")
print("단일 셀 수정 완료")

대량 입력과 범위 채우기

iter_rows와 append를 활용하면 빠르게 범위를 채울 수 있습니다.

# file: 02_bulk_input.py
from openpyxl import load_workbook

wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]

# 월별 이익 계산 값을 한번에 입력
for row in ws.iter_rows(min_row=2, max_col=4):
    month, sales, cost, profit = row
    profit.value = (sales.value or 0) - (cost.value or 0)

# 상태 컬럼 대량 입력
status_map = {"1월":"확정","2월":"확정","3월":"잠정"}
for r in range(2, ws.max_row+1):
    ws[f"E{r}"] = status_map.get(ws[f"A{r}"].value, "")

wb.save("셀수정_실습.xlsx")
print("대량 입력 완료")

날짜·숫자 서식과 정렬

보고서 품질을 높이는 핵심은 일관된 서식입니다.

# file: 03_formats.py
from openpyxl import load_workbook
from openpyxl.styles import Alignment

wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]

# 숫자 서식
for r in range(2, ws.max_row+1):
    ws[f"B{r}"].number_format = "#,##0"
    ws[f"C{r}"].number_format = "#,##0"
    ws[f"D{r}"].number_format = "#,##0"

# 날짜 서식과 가운데 정렬
for r in range(2, ws.max_row+1):
    ws[f"G{r}"].number_format = "yyyy-mm-dd"
    ws[f"A{r}"].alignment = Alignment(horizontal="center")

wb.save("셀수정_실습.xlsx")
print("서식 적용 완료")

수식 적용과 합계 계산

엑셀 수식은 문자열로 입력합니다. 저장 후 엑셀에서 열면 자동 계산됩니다.

# file: 04_formulas.py
from openpyxl import load_workbook

wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]

# 이익을 수식으로 다시 지정
for r in range(2, ws.max_row+1):
    ws[f"D{r}"] = f"=B{r}-C{r}"

# 합계 행 추가
total_row = ws.max_row + 1
ws[f"A{total_row}"] = "합계"
ws[f"B{total_row}"] = f"=SUM(B2:B{total_row-1})"
ws[f"C{total_row}"] = f"=SUM(C2:C{total_row-1})"
ws[f"D{total_row}"] = f"=SUM(D2:D{total_row-1})"

wb.save("셀수정_실습.xlsx")
print("수식 적용 완료")

드롭다운(데이터 유효성) 만들기

입력 오류를 줄이려면 데이터 유효성 검사를 활용하세요.

# file: 05_validation.py
from openpyxl import load_workbook
from openpyxl.worksheet.datavalidation import DataValidation

wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]

dv = DataValidation(type="list", formula1='"확정,잠정,보류"', allow_blank=True)
ws.add_data_validation(dv)
dv.add("E2:E100")  # 상태 컬럼 범위

wb.save("셀수정_실습.xlsx")
print("드롭다운 적용 완료")

조건부 서식으로 강조

이익이 음수이거나 특정 기준을 넘는 값을 시각적으로 표시할 수 있습니다.

# file: 06_conditional_format.py
from openpyxl import load_workbook
from openpyxl.formatting.rule import ColorScaleRule, CellIsRule

wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]

# 이익 컬럼 색상 스케일
ws.conditional_formatting.add("D2:D100",
    ColorScaleRule(start_type="min", start_color="FCA5A5",
                   mid_type="percentile", mid_value=50, mid_color="FDE68A",
                   end_type="max", end_color="86EFAC"))

# 비용이 매출보다 큰 경우 빨간 글씨
ws.conditional_formatting.add("C2:C100",
    CellIsRule(operator="greaterThan", formula=["B2"], stopIfTrue=True, font={"color":"9B1C1C"}))

wb.save("셀수정_실습.xlsx")
print("조건부 서식 적용 완료")

찾기·치환으로 일괄 수정

메모나 텍스트 열에서 특정 단어를 치환합니다.

# file: 07_find_replace.py
from openpyxl import load_workbook

wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]

for cell in ws["F"]:
    if cell.row == 1:
        continue
    text = str(cell.value or "")
    text = text.replace("프로모션", "행사")
    cell.value = text

wb.save("셀수정_실습.xlsx")
print("찾기·치환 완료")

셀 잠금과 시트 보호

계산식이나 헤더는 잠그고, 입력 칸만 열어두면 안전합니다.

# file: 08_protect.py
from openpyxl import load_workbook
from openpyxl.styles import Protection

wb = load_workbook("셀수정_실습.xlsx")
ws = wb["매출"]

# 전체 잠금 후 입력 칸만 해제
for row in ws.iter_rows(min_row=1, max_row=ws.max_row, min_col=1, max_col=7):
    for c in row:
        c.protection = Protection(locked=True)

for r in range(2, ws.max_row+1):
    for col in ["B","C","E","F","G"]:  # 입력 허용
        ws[f"{col}{r}"].protection = Protection(locked=False)

ws.protection.sheet = True
ws.protection.password = "1234"  # 필요시 변경
wb.save("셀수정_실습.xlsx")
print("시트 보호 설정 완료")

체크리스트

  • openpyxl 설치 및 예제 파일 생성 완료
  • 단일 셀 수정과 대량 입력 패턴 숙지
  • 숫자·날짜 서식과 정렬 일관성 유지
  • 수식으로 합계·계산 자동화
  • 드롭다운과 조건부 서식으로 입력 품질 향상
  • 찾기·치환으로 텍스트 일괄 정리
  • 중요 셀 잠금 및 시트 보호 적용

다음 글 예고: 시트 자동 생성과 템플릿 복제

다음 편에서는 템플릿 시트를 복제해 월별 시트를 자동 생성하고, 각 시트에 데이터와 서식을 한 번에 배포하는 방법을 다룹니다.

다음 글 보러 가기

관련 읽을거리: openpyxl 완벽 정리 · 엑셀 자동화 환경 설정 가이드

참고: Python 및 openpyxl 공식 문서. 조직의 보안 정책에 따라 파일 경로·권한·암호 설정을 조정하세요.

반응형