본문 바로가기

파일 형식 백과사전

엑셀 조건부 서식 규칙이 수백 개로 쪼개지는 이유, 200번 복사 붙여넣기를 직접 재현 후기

[홈] 탭의 [조건부 서식] → [규칙 관리]를 눌렀다가 화면 가득 늘어선 규칙 목록을 보고 놀란 적 있으신가요. 셀 몇 개에만 색을 입힌 기억밖에 없는데, 목록에는 비슷한 규칙이 수십, 수백 개씩 쌓여 있는 경우가 흔합니다.

엑셀 용량이 갑자기 무거워지는 원인을 진단했던 글의 FAQ에서 이 질문에 짧게만 답한 적이 있는데, 이번엔 그 부분만 따로 떼어 실제로 확인해 봤습니다. 범인은 대개 복사 붙여넣기입니다. 규칙 하나를 다른 범위에 복사해 붙일 때마다, 엑셀은 기존 규칙을 넓히는 대신 새 규칙을 하나 더 만드는 방식으로 처리합니다. 이게 실제로 파일에 어떤 흔적을 남기는지, 같은 서식을 200번 나눠 붙인 상황을 직접 만들어 확인해 봤습니다.

조건부 서식 규칙 분할 재현 실측. 규칙 0개일 때 sheet1.xml 560KB, 파일 91KB. 규칙 1개로 전체 범위 지정 시 동일 수준. 200개로 분할된 경우 sheet1.xml 592KB, 파일 93KB로 소폭 증가

 

같은 조건, 규칙 개수만 다르게 만들어 봤습니다

2,000행 8열짜리 표에 "값이 1000보다 크면 빨간 배경"이라는 규칙을 적용하되, 세 가지 방식으로 저장했습니다. 파이썬 openpyxl 3.1.5로 윈도우 11에서 만든 파일입니다.

저장 방식 규칙 개수 sheet1.xml(비압축) xlsx 파일(압축 후)
조건부 서식 없음 0개 573,165 B 93,107 B
규칙 1개로 전체 범위 지정 1개 573,329 B 93,309 B
10행 단위로 200번 나눠 지정 200개 606,638 B 95,553 B

규칙이 200개로 쪼개지자 시트 XML은 33KB 넘게 불었습니다. 그런데 실제 파일 크기는 2.4KB 느는 데 그쳤습니다. 규칙이 200배로 늘어도 최종 용량은 체감할 정도로 커지지 않았습니다.


규칙 하나가 실제로 남기는 흔적

sheet1.xml 안에서 규칙은 이런 모양으로 기록됩니다. 범위와 조건, 적용할 서식 번호만 짧게 적히는 구조입니다.

<conditionalFormatting sqref="A1:H10">
  <cfRule type="cellIs" operator="greaterThan" dxfId="0" priority="1">
    <formula>1000</formula>
  </cfRule>
</conditionalFormatting>

규칙 하나가 XML로는 채 200바이트가 안 됩니다. 200개를 다 합쳐도 시트 전체(560KB대)에 비하면 크지 않은 데다, 이 반복되는 짧은 태그는 ZIP 압축이 유독 잘 먹는 대상입니다. xlsx가 왜 압축에 유리한 구조인지는 xls와 비교해 다룬 글에서 더 자세히 볼 수 있는데, 이번 결과도 같은 원리로 설명됩니다.

 

그럼 규칙을 그냥 둬도 되나

용량만 보면 방치해도 크게 문제없어 보이지만, 실제로 불편해지는 지점은 따로 있습니다. 규칙이 수백 개로 쪼개지면 [규칙 관리] 창에서 원하는 규칙을 찾기 어려워지고, 어느 범위에 어떤 규칙이 걸려 있는지 파악하기가 힘들어집니다. 규칙이 아주 많이 쌓인 파일에서 계산이나 반응이 느려진다는 사용기도 적지 않은데, 이 부분은 문서 규모와 PC 사양에 따라 체감이 갈릴 수 있어 이번 측정만으로 단정하지는 않겠습니다.

실질적으로 손대야 할 이유는 용량이 아니라 관리 편의입니다. 정리 방법은 간단합니다.

1. [홈] 탭 → [조건부 서식] → [규칙 관리]를 연다.
2. 서식 규칙 표시 범위를 "현재 워크시트"로 바꿔 전체 목록을 본다.
3. 같은 조건, 같은 서식인 규칙이 여러 개 보이면
   범위가 넓은 규칙 하나만 남기고 나머지를 선택 삭제한다.
4. 마지막으로 새로 하나를 만들어 전체 범위에 다시 지정한다.

규칙이 겹치면 어느 쪽이 이길까

같은 셀에 조건이 다른 규칙 두 개가 동시에 걸리는 경우도 흔합니다. "1000보다 크면 빨강"과 "1500보다 크면 파랑"을 같은 A1:A20 범위에 순서대로 추가하고, 실제로 XML에 어떻게 기록되는지 확인해 봤습니다.

<cfRule type="cellIs" priority="1" operator="greaterThan" dxfId="0">  <!-- 1000보다 크면 빨강, 먼저 추가 -->
<cfRule type="cellIs" priority="2" operator="greaterThan" dxfId="1">  <!-- 1500보다 크면 파랑, 나중에 추가 -->

먼저 추가한 규칙이 priority=1, 나중에 추가한 규칙이 priority=2로 자동 매겨집니다.

숫자가 작을수록 [규칙 관리] 창에서 목록 위쪽에 뜨고 먼저 검사되는 규칙입니다. 값이 1800인 셀처럼 두 조건을 동시에 만족하면,

뒤에 추가한 규칙(파랑)이 화면에 최종적으로 보이는 경우가 일반적입니다.

다만 정확한 겹침 결과는 각 규칙에 "참이면 다른 규칙 중지" 옵션이 켜져 있는지에 따라도 달라질 수 있어,

여러 규칙을 겹쳐 쓸 때는 [규칙 관리] 창에서 순서를 직접 눈으로 확인하는 편이 안전합니다.

 

규칙이 200개로 쪼개진 상황에서 이 우선순위가 중요해지는 이유가 있습니다. 복사 붙여넣기로 규칙이 계속 추가되면 priority 번호도 계속 늘어나는데, 나중에 붙여넣은 규칙일수록 우선순위가 낮아 오래된 규칙에 가려질 수 있습니다. 의도한 서식이 안 보인다면 규칙이 없는 게 아니라 순서에 밀린 것일 수 있다는 뜻입니다.

 

 

애초에 쪼개지지 않게 붙여넣는 법

규칙을 다른 범위로 옮길 때 일반 붙여넣기(Ctrl+V) 대신 서식만 붙여넣기를 골라도 결과는 똑같이 규칙이 나뉩니다. 쪼개짐을 막으려면 다음 방법이 낫습니다.

상황 방법
이미 만든 규칙을 더 넓은 범위로 확장 붙여넣지 말고 [규칙 관리]에서 범위(적용 대상)를 직접 넓게 수정
여러 표에 같은 조건을 반복 적용 표를 만들기 전에 전체 범위를 먼저 잡고 규칙 한 번만 지정

조건부 서식은 만든 뒤에 범위를 넓히는 게 아니라, 넓힐 범위를 먼저 잡고 규칙을 얹는 순서가 규칙 쪼개짐을 막는 가장 확실한 방법입니다.

자주 묻는 질문

Q. 지금 파일에 규칙이 몇 개나 있는지 바로 확인하려면?
[규칙 관리] 창의 목록 줄 수를 세거나, 아래 코드로 파일을 열지 않고도 셀 수 있습니다.

import zipfile
with zipfile.ZipFile("파일.xlsx") as z:
    xml = z.read("xl/worksheets/sheet1.xml").decode("utf-8")
    print("규칙 개수:", xml.count("<cfRule"))

Q. 규칙을 지웠는데 셀 배경색이 그대로입니다.
조건부 서식과 일반 채우기 색은 별개입니다. 조건부 서식을 지워도 셀에 직접 칠한 배경색은 남아 있을 수 있습니다.

 

위 규칙 개수별 용량은 동일한 조건으로 만든 xlsx 파일을 직접 저장하고, 압축을 풀어 시트 XML 안의 규칙 태그를 세어 얻은 값입니다.

 

 

 

 

CSV를 열었더니 주소 뒷부분이 옆 칸으로, 값 속 쉼표 때문에 열이 밀리는 문제

이름과 주소가 잘 정리돼 있던 CSV를 프로그램으로 읽었더니,주소 한 칸이 두 칸으로 쪼개지면서 그 뒤 금액까지 줄줄이 옆으로 밀려 버리는 경우가 있습니다.데이터는 멀쩡한데 표만 어긋난 것

richyeon.com

 

 

파일 이름 뒤 .jpg를 .png로 바꾸면 진짜 변환될까, 흔한 오해와 실제

이미지가 PNG여야 한다고 해서, 파일 이름 끝의 .jpg를 지우고 .png로 바꿔 본 적 있으신가요. 겉보기엔 아이콘도 바뀌고 그럴듯해 보입니다.그런데 어떤 사이트에 올리면 "형식이 맞지 않는다"며

richyeon.com

 

 

한글 폰트 하나가 13MB, 잘못 받은 게 아니라 글자 수 때문입니다

폰트를 하나 내려받았는데 파일 크기가 13MB로 찍히면 손이 멈칫하게 됩니다.글자 모양 하나 담은 파일이 사진 수십 장 분량이니 뭔가 잘못 받았나 싶어집니다. 윈도우에 이미 깔려 있는 폰트들

richyeon.com