왜 Python으로 엑셀을 다루는가
회계 실무에서 엑셀은 여전히 핵심 도구입니다. 하지만 매월 반복되는 시산표 정리, 계정별 원장 추출, 보고서 포맷 변환 같은 작업을 수작업으로 처리하면 시간이 낭비될 뿐 아니라 휴먼 에러의 위험도 높아집니다.
Python의 openpyxl 라이브러리를 활용하면 이런 반복 작업을 자동화할 수 있습니다. VBA보다 범용성이 높고, 데이터 분석 라이브러리(pandas, numpy)와의 연계도 자유롭습니다.
설치 및 기본 설정
터미널에서 다음 명령어로 openpyxl을 설치합니다.
pip install openpyxl
설치가 완료되면 Python 스크립트에서 바로 사용할 수 있습니다.
from openpyxl import Workbook, load_workbook
# 새 워크북 생성
wb = Workbook()
ws = wb.active
ws.title = "시산표"
# 기존 파일 열기
wb = load_workbook("월별_시산표.xlsx")
ws = wb["Sheet1"]
데이터 읽기와 쓰기
셀 단위 또는 행/열 단위로 데이터를 읽고 쓸 수 있습니다.
# 셀 단위 읽기/쓰기
ws["A1"] = "계정코드"
ws["B1"] = "계정명"
ws["C1"] = "차변"
ws["D1"] = "대변"
# 행 단위 추가
data = [
["1010", "현금및현금성자산", 50000000, 0],
["1020", "단기금융상품", 200000000, 0],
["2010", "매입채무", 0, 80000000],
["3010", "자본금", 0, 100000000],
]
for row in data:
ws.append(row)
# 특정 범위 읽기
for row in ws.iter_rows(min_row=2, max_col=4, values_only=True):
code, name, debit, credit = row
print(f"{code} {name}: 차변 {debit:,} / 대변 {credit:,}")
셀 서식 지정
보고서 품질을 높이려면 서식 지정이 중요합니다.
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
# 헤더 스타일
header_font = Font(name="맑은 고딕", size=11, bold=True, color="FFFFFF")
header_fill = PatternFill(start_color="2F5496", end_color="2F5496", fill_type="solid")
center_align = Alignment(horizontal="center", vertical="center")
thin_border = Border(
left=Side(style="thin"),
right=Side(style="thin"),
top=Side(style="thin"),
bottom=Side(style="thin"),
)
# 헤더 행에 스타일 적용
for cell in ws[1]:
cell.font = header_font
cell.fill = header_fill
cell.alignment = center_align
cell.border = thin_border
# 숫자 포맷 (천 단위 구분)
for row in ws.iter_rows(min_row=2, min_col=3, max_col=4):
for cell in row:
cell.number_format = "#,##0"
cell.border = thin_border
실무 예제: 시산표 차대 검증 자동화
월말 결산 시 시산표의 차변 합계와 대변 합계가 일치하는지 자동으로 검증하는 스크립트입니다.
from openpyxl import load_workbook
def validate_trial_balance(filepath):
"""시산표 차대 검증 함수"""
wb = load_workbook(filepath)
ws = wb.active
total_debit = 0
total_credit = 0
errors = []
for row_num, row in enumerate(ws.iter_rows(min_row=2, max_col=4, values_only=True), start=2):
code, name, debit, credit = row
if debit is None:
debit = 0
if credit is None:
credit = 0
total_debit += debit
total_credit += credit
# 차변과 대변에 동시에 금액이 있는 경우 경고
if debit > 0 and credit > 0:
errors.append(f"행 {row_num}: {name} - 차변/대변 동시 입력")
# 결과 출력
print(f"차변 합계: {total_debit:,.0f}")
print(f"대변 합계: {total_credit:,.0f}")
print(f"차이금액: {abs(total_debit - total_credit):,.0f}")
if total_debit == total_credit:
print("검증 결과: 차대 일치")
else:
print("검증 결과: 차대 불일치 - 확인 필요!")
if errors:
print(f"\n경고 사항 ({len(errors)}건):")
for err in errors:
print(f" - {err}")
return total_debit == total_credit
# 실행
validate_trial_balance("2025년_1월_시산표.xlsx")
다음 단계
openpyxl의 기본을 익혔다면 다음 단계로 넘어가 봅시다.
- pandas 연계: 대량 데이터 처리 시 pandas DataFrame과 openpyxl을 조합하면 훨씬 효율적입니다.
- 차트 생성: openpyxl은 엑셀 차트 생성도 지원합니다. 월별 추이 그래프를 자동으로 삽입할 수 있습니다.
- 다중 파일 처리: glob 모듈과 함께 사용하면 폴더 내 모든 엑셀 파일을 일괄 처리할 수 있습니다.
- 스케줄링: Windows 작업 스케줄러나 cron과 연동하면 매월 자동 실행되는 결산 보조 도구를 만들 수 있습니다.
반복 업무를 자동화하면 실무자는 숫자를 입력하는 사람에서 숫자를 해석하는 사람으로 역할이 전환됩니다. 작은 스크립트 하나가 업무의 질을 바꿀 수 있습니다.