AI 해결 노트 · 2026-09-18 · 실측 2026-09-18

틀 고정은 인쇄에 따라오지 않습니다 — 화면용 틀 고정과 인쇄용 「인쇄 제목」

한 줄로

머리글 1행과 자료 60행으로 된 표에 틀 고정을 걸어 놓고 그대로 PDF로 저장했더니, 2쪽에는 열 이름이 한 개도 없었습니다. 틀 고정을 켠 PDF와 끈 PDF에서 뽑은 글자가 완전히 같았습니다 — 틀 고정은 화면에만 듣습니다. 종이·PDF에서 머리글을 반복시키는 값은 PageSetup.PrintTitleRows 고, 이걸 $1:$1 로 넣으니 2쪽에서 뽑은 글자가 사번 · 성명 · 부서 로 시작했습니다. 화면에서 같은 자리는 「페이지 설정」 창 [시트] 탭의 인쇄 제목 → 반복할 행(R) 칸입니다.

이런 분께

실측 환경

항목
OSMicrosoft Windows 11 Home 10.0.26200 (build 26200)
PowerShell 7.6.6
엑셀Excel 16.0, build 20326, 언어 코드 1042
기본 프린터Ne00:에 있는 Microsoft Print to PDF
시험 파일직접 만든 더미 교육이수표 — 14열 × 61행(머리글 1행 + 자료 60행), UsedRange $A$1:$N$61
열 구성사번·성명·부서·1월~10월·비고
PDF 저장Excel COM Worksheet.ExportAsFixedFormat(0, 경로)
PDF 읽기Python 3.12.10 + PyMuPDF 1.28.0
표 만들기openpyxl 3.1.5

사번은 A1001~A1060, 성명은 성 한 글자와 이름 두 글자를 무작위로 붙여 만든 값(홍사랑·장나은·오시우 등), 부서는 생산관리·품질관리·영업1팀 같은 지어낸 이름입니다. 시험 대상으로 연 파일은 이 더미 하나뿐입니다.

화면에서 무엇이 어떻게 고정되는가

먼저 틀 고정이 무엇을 하는지부터 봤습니다. 25행·D열까지 스크롤한 같은 자리를, 틀 고정을 끈 채와 켠 채로 각각 찍었습니다.

$w = $xl.ActiveWindow
$w.FreezePanes = $false
$w.ScrollRow = 25; $w.ScrollColumn = 4

이때 화면 왼쪽 위 셀은 $D$25 였습니다. 1행이 밀려 올라가고 A·B·C열이 왼쪽으로 빠져나가, 숫자만 보입니다.

틀 고정을 끄고 25행·D열까지 스크롤한 화면. 열 이름도 사번도 보이지 않는다
틀 고정을 끄고 25행·D열까지 스크롤한 화면. 열 이름도 사번도 보이지 않는다

이번에는 B2 셀에 커서를 두고 틀 고정을 켠 뒤 같은 자리로 스크롤했습니다.

첫 행과 첫 열을 고정한 뒤 같은 자리로 스크롤한 화면. 1행과 A열이 남아 있다
첫 행과 첫 열을 고정한 뒤 같은 자리로 스크롤한 화면. 1행과 A열이 남아 있다

맨 윗줄에 1행(사번 · 1월 · 2월 …)이 남고, 왼쪽에 A열의 사번 A1024~A1048 이 남았습니다. 행 머리가 1 다음에 바로 25로 건너뜁니다. 커서를 어디에 두고 켜느냐로 무엇이 고정되는지가 갈립니다.

커서 자리FreezePanesSplitRowSplitColumn화면에서 남는 것
연 직후(아무것도 안 함)False00없음
A2True10첫 행
B1True01첫 열
B2True11첫 행 + 첫 열

SplitRow·SplitColumn 에 들어간 1과 0은 커서 위쪽의 행 수, 왼쪽의 열 수와 맞아떨어집니다. 커서를 C4 같은 자리에 두는 조합은 시험하지 않았습니다.

리본에서 같은 자리는 보기 탭 → 그룹의 「틀 고정」 단추입니다. 이 탭의 그룹 이름은 왼쪽부터 통합 문서 보기 / 표시 / 확대·축소 / 창 / 매크로 였고, 창 그룹 안에 새 창·모두 정렬·틀 고정·나누기·숨기기·숨기기 취소가 늘어서 있었습니다. 이 배치는 원자료 폴더의 참고_보기탭_틀고정.png 에서 읽은 것입니다. 단추를 눌렀을 때 펼쳐지는 목록은 얻지 못했습니다.

그대로 PDF로 저장하면

틀 고정을 켠 채(FreezePanes=True, SplitRow=1, SplitColumn=1) 저장했습니다.

$ws.Range("B2").Select()
$xl.ActiveWindow.FreezePanes = $true
$ws.ExportAsFixedFormat(0, "$T\KO2_53_a_틀고정만.pdf")

나온 PDF는 세로 A4(595×842pt) 4쪽이었습니다. 쪽마다 열 이름 14개 중 몇 개가 들어 있는지 세 봤습니다.

들어 있는 열 이름그 쪽에 실린 사번
1쪽9개 (사번~6월)A1001 ~ A1040
2쪽0개A1041 ~ A1060
3쪽5개 (7월~비고)
4쪽0개

2쪽에서 뽑은 글자는 A1041 · 오시우 · 품질관리 · 4 · 0 · 6 순서로, 열 이름 없이 자료부터 시작했습니다.

인쇄 제목을 안 걸고 저장한 PDF의 2쪽. 열 이름 없이 A1041부터 시작한다
인쇄 제목을 안 걸고 저장한 PDF의 2쪽. 열 이름 없이 A1041부터 시작한다

틀 고정이 인쇄에 아무 영향도 주지 않는다는 확인

「저장할 때 뭔가 어긋난 것 아니냐」를 지우려고, 같은 파일을 틀 고정만 껐다 켜서 두 번 저장하고 맞춰 봤습니다.

d 고정끔 : 121599 bytes
e 고정켬 : 121599 bytes
쪽수 4 / 4,  1쪽 크기 595x842pt / 595x842pt
추출 텍스트 글자수 2129 / 2129,  텍스트 SHA256 d2c8bf7d241ce314 / d2c8bf7d241ce314

비교한 쪽수·쪽 크기·뽑아낸 글자가 모두 같았습니다. PDF 파일 자체의 SHA256은 달랐는데, 그 원인은 확인하지 못했습니다.

인쇄용 설정은 따로 있습니다

종이와 PDF에서 머리글을 반복시키는 값은 PageSetup.PrintTitleRows 입니다. 파일을 연 직후에는 PrintTitleRowsPrintTitleColumns 모두 빈 문자열이었습니다.

$ws.PageSetup.PrintTitleRows = '$1:$1'
$ws.ExportAsFixedFormat(0, "$T\KO2_53_b_인쇄제목.pdf")

이 한 줄만 넣고 다시 저장하니 2쪽이 이렇게 바뀌었습니다.

인쇄 제목 $1:$1 을 걸고 저장한 PDF의 2쪽. 맨 위에 머리글 줄이 다시 붙었다
인쇄 제목 $1:$1 을 걸고 저장한 PDF의 2쪽. 맨 위에 머리글 줄이 다시 붙었다
인쇄 제목 없음PrintTitleRows='$1:$1'
1쪽열 이름 9개열 이름 9개
2쪽0개9개 (사번~6월)
3쪽5개 (7월~비고)5개
4쪽0개5개 (7월~비고)

값을 다시 빈 문자열로 지우고 저장하니 파일 크기가 처음과 같은 121,599바이트로 돌아왔고 2쪽의 머리글도 도로 사라졌습니다. 켰다 껐다가 그대로 되는 설정입니다.

화면에서 하는 법 (Excel 16.0 한국어)

페이지 레이아웃 탭 → 페이지 설정 그룹 → 「인쇄 제목」 단추입니다. 이 그룹에는 여백·용지 방향·크기·인쇄 영역·나누기·배경·인쇄 제목이 있었습니다. 저희는 리본에 Alt+P 에 이어 i 를 보냈고, 그러자 앞에 나온 창의 제목이 「페이지 설정」으로 바뀌었습니다. 그 창을 찍은 것이 아래 그림입니다.

페이지 설정 창 [시트] 탭 — 인쇄 제목의 반복할 행(R)·반복할 열(C)
페이지 설정 창 [시트] 탭 — 인쇄 제목의 반복할 행(R)·반복할 열(C)

창 위쪽에 [페이지] [여백] [머리글/바닥글] [시트] 네 탭이 있고 [시트] 탭이 열린 채로 떴습니다. 칸 차례는 이렇습니다.

위에서 넣은 $1:$1 이 들어가는 칸이 반복할 행(R) 입니다. 캡처한 화면에서는 인쇄 영역·반복할 행·반복할 열 세 칸이 모두 비어 있었습니다. 이 칸에 마우스로 직접 입력해 COM 결과와 같은지 맞춰 보지는 않았습니다.

옆으로도 잘리는 표라면

위 표는 14열이라 3·4쪽이 「7월~비고」만 담은 오른쪽 조각이었습니다. 이 쪽들에는 사번도 성명도 없어서, 어느 사람의 값인지 알 수 없습니다. 열 쪽을 반복시키는 값은 PrintTitleColumns 입니다.

$ws.PageSetup.PrintTitleRows    = '$1:$1'
$ws.PageSetup.PrintTitleColumns = '$A:$C'

둘 다 넣고 저장하니 3쪽에서 뽑은 글자가 사번 · 성명 · 부서 · A1001 · 홍사랑 · 생산관리 순서로 시작했습니다. 쪽수는 4쪽 그대로였고 파일은 133,364바이트로 커졌습니다. 화면에서는 같은 창의 반복할 열(C) 칸입니다.

파일에 남는가

틀 고정과 인쇄 제목을 모두 켠 상태로 .xlsx 로 저장하고 다시 열어 봤습니다.

다시 연 파일 : FreezePanes=True  SplitRow=1  SplitColumn=1
다시 연 파일 : PrintTitleRows='$1:$1'

둘 다 파일에 남습니다. 한 번 잡아 두면 다음에 열 때도 그대로라는 뜻이고, 반대로 남이 만든 파일을 받았을 때 왜 머리글이 붙어 나오는지도 이걸로 설명됩니다.

결과

하고 싶은 일어디서속성값
화면에서 스크롤해도 머리글 보기보기 → 창 → 틀 고정ActiveWindow.FreezePanes = True
화면에서 첫 행만커서를 A2에 두고 틀 고정SplitRow=1, SplitColumn=0
화면에서 첫 열만커서를 B1에 두고 틀 고정SplitRow=0, SplitColumn=1
인쇄·PDF에서 쪽마다 머리글페이지 레이아웃 → 인쇄 제목 → 반복할 행PageSetup.PrintTitleRows = '$1:$1'
인쇄·PDF에서 쪽마다 왼쪽 열같은 창 → 반복할 열PageSetup.PrintTitleColumns = '$A:$C'

여러 파일을 반복할 때

PrintTitleRows 는 워크시트가 갖는 값입니다. 이번 시험은 한 시트에서만 재 봤고, 시트가 여럿인 통합 문서나 폴더 단위 처리는 돌려 보지 않았습니다. 스크립트로 여러 시트를 돌릴 생각이라면 시트마다 값이 들어갔는지 하나씩 읽어 확인하시는 편이 안전합니다.

작업이 끝나면 $xl.Quit() 뒤에 EXCEL 프로세스가 남았는지 꼭 봐야 합니다. 저희 로그에도 Quit() 직후 PID가 남아 있던 기록이 여러 번 있고, 정리 로그에는 저희가 띄운 PID 27848과 34260을 한 차례에 종료한 기록이 있습니다.

실패한 것

확인하지 않은 것

함께 보기