실무 현장에 파이썬 엑셀 서식 자동화 기술을 본격적으로 도입하기 전까지, 저는 판다스(Pandas)로 데이터를 합치는 데 성공하고도 정작 밤 12시가 넘도록 컴퓨터 앞을 떠나지 못하는 기막힌 아이러니를 겪어야 했습니다.
저는 낮에는 회사에서 결재 서류와 씨름하는 40대 직장인이자, 퇴근 후와 주말에는 ‘스마트방역’이라는 방역 업체를 이끌어가는 대표입니다. 낮에 본업을 마치고 저녁에 식당이나 기업체, 관공서 방역 현장까지 돌고 집에 돌아오면 밤 9시가 훌쩍 넘습니다. 현관문 앞에서 꼬리를 흔드는 반려견 ‘반달이’를 데리고 동네 한 바퀴 산책을 다녀온 뒤, 아들이 잠든 조용한 방에서 밤 10시 반이 되어서야 비로소 제 두 번째 출근이 시작됩니다.
바로 한 달 치 ‘방역 소독 결과 보고서’와 ‘거래처별 정산 내역서’를 엑셀로 만들어 발송하는 일입니다.
예전에 배운 판다스 코드를 돌리면 안성시청을 비롯한 관공서와 수십 곳의 거래처 데이터를 쪼개어 40개의 엑셀 파일로 만드는 작업 자체는 단 3초 만에 끝납니다. 문제는 그다음이었습니다. 판다스가 뱉어낸 엑셀 파일을 열어보면 그야말로 ‘날것’ 그대로의 처참한 모양새를 하고 있기 때문입니다.
제목 줄에는 배경색 하나 없고, 표 테두리는 엉성하며, 가장 치명적인 것은 열 너비가 좁아서 날짜와 금액 데이터가 온통 #######처럼 깨져서 보이는 현상이었습니다. 회사 상사에게도, 내 사업체의 소중한 고객사 담당자에게도 이런 성의 없는 엑셀 파일을 그대로 보낼 수는 없는 노릇입니다. 결국 저는 3초 만에 만든 40개의 엑셀 파일을 일일이 마우스로 더블클릭해 열어서, 전체 선택 후 테두리를 그어주고, 첫 줄에 남색 배경을 칠하고, 열 경계선을 마우스로 잡고 늘려주는 단순 노동을 밤 12시 반까지 반복해야 했습니다.

판다스의 한계를 넘어 파이썬 엑셀 서식 자동화로 가야 하는 이유
데이터는 파이썬이 모았는데, 왜 화장(꾸미기)은 여전히 내 손목 관절을 갈아 넣으며 해야 하는 걸까요? 이 모순을 해결하기 위해 파고든 도구가 바로 openpyxl이라는 파이썬 라이브러리입니다.
40대 비전공자 입장에서 가장 쉽게 비유하자면, 판다스(Pandas)가 수만 톤의 흙과 모래를 단숨에 퍼 나르는 거대한 ‘불도저’라면, 오픈파이엑셀(openpyxl)은 다 지어진 건물 안에 들어가 도배를 하고 조명을 달고 가구를 배치하는 세밀한 ‘인테리어 목수’입니다.
판다스로는 할 수 없거나 까다로운 작업들, 예를 들어 특정 셀의 글씨체를 ‘맑은 고딕’으로 바꾸고, 첫 번째 행의 높이를 넓히고, 금액 부분에 천 단위 콤마(,)를 찍고, 모든 칸에 얇은 실선 테두리를 두르는 작업을 이 목수에게 맡기면 사람의 손을 거치지 않고도 관공서 제출용 고품격 양식이 완성됩니다.
설치 방법은 간단합니다. VS Code 터미널 창에 아래 명령어를 입력해 목수를 고용하기만 하면 됩니다.
pip install openpyxl
40대 N잡러가 정착한 파이썬 엑셀 서식 자동화(openpyxl) 실전 코드
아래 코드는 제가 매월 말일 밤, 판다스로 1차 추출한 투박한 방역 내역서 엑셀 파일을 불러와서 관공서나 거래처 담당자가 열자마자 바로 인쇄해도 손색없을 만큼 깔끔하게 단장해 주는 실제 현역 스크립트입니다.
Python
import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter
# 1. 판다스로 1차 생성된 투박한 엑셀 파일 불러오기
file_path = r"C:\Users\Admin\Desktop\스마트방역_10월_거래처내역_원본.xlsx"
wb = openpyxl.load_workbook(file_path)
ws = wb.active
# 2. 실무 보고서용 표준 디자인 세트 정의하기
# 제목 줄(헤더): 맑은 고딕, 11포인트, 굵게, 흰색 글씨
header_font = Font(name="맑은 고딕", size=11, bold=True, color="FFFFFF")
# 제목 줄 배경색: 신뢰감을 주는 짙은 네이비 색상
header_fill = PatternFill(start_color="1F4E78", end_color="1F4E78", fill_type="solid")
# 본문 데이터: 맑은 고딕, 10포인트
body_font = Font(name="맑은 고딕", size=10)
# 정렬 및 얇은 실선 테두리 설정
center_align = Alignment(horizontal="center", vertical="center")
thin_border = Border(
left=Side(style="thin", color="D9D9D9"),
right=Side(style="thin", color="D9D9D9"),
top=Side(style="thin", color="D9D9D9"),
bottom=Side(style="thin", color="D9D9D9")
)
# 3. 모든 행과 열을 돌면서 디자인 일괄 입히기
for row_idx, row in enumerate(ws.iter_rows(min_row=1, max_row=ws.max_row, max_col=ws.max_column), start=1):
# 행 높이를 시원하게 넓혀서 답답함 없애기
ws.row_dimensions[row_idx].height = 24
for cell in row:
cell.border = thin_border
cell.alignment = center_align
if row_idx == 1:
# 첫 번째 제목 줄에는 네이비 배경과 흰색 굵은 글씨 적용
cell.font = header_font
cell.fill = header_fill
else:
# 나머지 본문 줄에는 깔끔한 기본 폰트 적용
cell.font = body_font
# 4. 글자 길이에 맞춰 열 너비 자동 조절 (####### 깨짐 현상 완벽 해결)
for col in ws.columns:
max_len = 0
col_letter = get_column_letter(col[0].column)
for cell in col:
if cell.value is not None:
# 한글은 영문보다 폭이 넓으므로 글자 수에 1.5배 가중치 부여
cell_len = len(str(cell.value))
if cell_len > max_len:
max_len = cell_len
# 여백을 위해 기본 5칸을 더해서 널찍하게 설정
ws.column_dimensions[col_letter].width = (max_len * 1.5) + 5
# 5. 화장까지 완벽하게 끝난 최종 보고서 저장
output_path = r"C:\Users\Admin\Desktop\스마트방역_10월_최종보고서_완성.xlsx"
wb.save(output_path)
print("보고서 서식 적용이 완료되었습니다! 이제 편히 주무십시오.")
이 파이썬 엑셀 서식 자동화 코드를 폴더 내 전체 파일을 도는 반복문(for)과 연결해 실행하던 날 밤을 생생히 기억합니다.
2시간 동안 마우스를 딸깍거리며 테두리를 긋고 칸을 늘려야 했던 40개의 보고서가, 엔터 키 한 번에 단 3초 만에 짙은 남색 헤더와 칼 같은 줄 맞춤을 자랑하는 완성본으로 쏟아져 나왔습니다. 파일을 열어보니 #######으로 깨진 날짜는 단 한 군데도 없었고, 당장 내일 아침 시청 주무관님이나 거래처 사장님께 메일로 쏘아도 될 만큼 정갈했습니다.

현업에서 피땀 흘리며 터득한 2가지 디테일 노하우
직접 파이썬 엑셀 서식 자동화 코드를 돌려보실 직장인분들을 위해, 제가 수많은 시행착오 끝에 얻은 실전 팁 두 가지를 공유합니다.
첫째는 위 코드의 4번 항목에 들어있는 ‘한글 열 너비 보정값(* 1.5)’의 비밀입니다. 인터넷에 떠도는 외국 예제 코드를 그대로 복사해서 쓰면 열 너비 자동 조절을 해도 한글이 여전히 좁게 잘려 보입니다. 파이썬의 len() 함수는 영어 알파벳 A도 1글자로 세고, 한글 가도 똑같이 1글자로 세지만, 실제 모니터 화면에서 한글은 영어보다 약 1.5배에서 2배 가까이 넓은 면적을 차지하기 때문입니다. 따라서 가장 긴 글자 수에 1.5를 곱해주고 여백으로 5 정도를 더해주어야 비로소 한국인의 눈에 가장 편안한 엑셀 표 너비가 완성됩니다.
둘째는 초보자들이 가장 많이 당황하는 PermissionError: [Errno 13] Permission denied 에러입니다. 코드가 한 줄도 틀리지 않았는데 갑자기 이 붉은 에러가 뜨며 멈춘다면, 십중팔구 여러분의 윈도우 화면 아래쪽에 작업 대상인 엑셀 파일이 현재 ‘열려 있는 상태’이기 때문입니다. 엑셀 프로그램이 파일을 붙잡고 있으면 파이썬이 그 위에 새 서식을 덮어쓰지 못합니다. 코드를 실행하기 전에는 반드시 열려 있는 엑셀 창을 모두 닫아주시는 습관을 들이셔야 합니다. 셀 병합이나 조건부 서식 등 더 다양한 스타일링 문법이 필요하시다면 Openpyxl 공식 영문 문서 가이드를 즐겨찾기 해두시고 필요할 때마다 꺼내 보시는 것을 추천합니다.
글을 맺으며: 밤 11시의 퇴근이 나에게 선물한 것들
본업인 직장 생활만으로도 체력이 부치는 40대 중반에, 사업체를 운영하고 블로그에 글을 쓰며 아들과 놀아주는 일까지 해내려면 ‘성실함’만으로는 버틸 수 없습니다. 잠을 줄여가며 마우스를 클릭하는 성실함은 결국 번아웃과 만성 피로로 돌아오기 때문입니다.
제가 코딩을 배워 파이썬 엑셀 서식 자동화를 구축한 진짜 이유는 단순히 엑셀 파일을 예쁘게 만들기 위함이 아닙니다. 밤 12시 반에 끝나던 서류 작업을 밤 10시 35분에 끝내고, 확보된 두 시간의 여유로 일찍 불을 끄고 숙면을 취하기 위함입니다. 그렇게 아낀 체력이 있어야 주말 아침에 아들과 눈을 맞추며 영어 동화책 한 줄이라도 더 읽어줄 수 있고, 현장에서 고객들에게 한 번 더 웃으며 인사할 수 있습니다.
데이터를 하나로 모으는 앞단 작업이 아직 손에 익지 않으셨다면, 제가 앞서 상세히 다루었던 [파이썬 엑셀 합치기: 40대 직장인이 야근 끝낸 현실적인 판다스 코드] 글을 먼저 읽어보시길 권합니다. 판다스로 뼈대를 합치고, 오늘 배운 오픈파이엑셀로 멋진 옷을 입힌 뒤, 이메일 자동 발송으로 거래처에 쏘아 올리는 순간 여러분의 컴퓨터는 세상에서 가장 유능한 무인 비서가 될 것입니다.
오늘도 늦은 밤 작은 스탠드 불빛 아래에서 내일의 보고서를 다듬고 계신 모든 40대 직장인과 N잡러 여러분의 빠른 마감과 꿀잠을 진심으로 응원합니다.
