본문 바로가기
데이터

시트가 5장인 엑셀을 CSV로 저장했더니 4장이 사라졌습니다

by 무나주 2026. 9. 18.

매출, 비용, 재고, 거래처, 요약. 다섯 장으로 나눠 정리한 장부를 CSV로 달라는 요청을 받고 다른 이름으로 저장을 눌렀습니다. 나중에 열어 보니 시트 하나 분량밖에 없습니다.

CSV는 표 한 장을 담는 형식이라 시트라는 개념 자체가 없습니다. 저장 버튼을 눌렀을 때 실제로 무엇이 남고 무엇이 없어지는지, 시트 5장짜리 파일을 만들어 그대로 재현해 봤습니다.

엑셀 여러 시트 CSV 저장 실측 표. 매출 121행, 비용 81행, 재고 201행, 거래처 46행, 요약 6행짜리 시트 5장을 만들고 엑셀의 다른 이름으로 저장 CSV를 실행하니 활성 시트였던 요약 6행만 남고 나머지 네 장은 사라졌다. 시트별로 따로 뽑으면 6,148 4,115 10,224 2,477 102바이트로 합계 23,066바이트다. 요약 시트의 수식 SUM은 계산된 값 4,629,000 하나로 굳는다. 측정 환경은 윈도우 11, 파이썬 3.14.6, openpyxl 3.1.5

남는 것은 화면에 열려 있던 시트 한 장입니다

다섯 장에 각각 다른 양의 자료를 넣고, 요약 시트를 화면에 띄운 상태에서 CSV로 저장했습니다. 결과 파일은 6행이었습니다. 요약 시트의 행 수 그대로입니다.

시트 행 수 따로 뽑은 CSV 엑셀 CSV 저장에 남았나
매출 121 6,148 B 사라짐
비용 81 4,115 B 사라짐
재고 201 10,224 B 사라짐
거래처 46 2,477 B 사라짐
요약 6 102 B 남음

기준은 저장할 때 화면에 떠 있던 시트입니다. 요약 대신 매출 시트를 보고 있었다면 매출만 남았을 것입니다. 저장 전에 어느 탭이 선택돼 있었는지가 결과를 정합니다.

다행인 것은 원본 xlsx는 그대로라는 점입니다. 25,954바이트짜리 원본 파일을 열면 다섯 장이 모두 있습니다. 사라진 것은 새로 만든 CSV 안에서일 뿐입니다. 다만 저장 후 창을 닫으면서 저장 여부를 잘못 누르면 원본까지 CSV 상태로 덮일 수 있으니 이때가 유일하게 위험한 순간입니다.


수식도 함께 없어집니다

요약 시트에는 다른 시트를 참조하는 합계 수식이 들어 있었습니다. 파일 안에는 이렇게 저장돼 있습니다.

수식으로 읽으면   : =SUM(매출!E2:E121)
값으로 읽으면     : 4629000

xlsx는 이 둘을 같이 보관합니다. 식과 마지막으로 계산된 결과를 함께 들고 있는 것입니다. 그런데 CSV로 나가면 값 하나만 남습니다. 4629000이라는 숫자는 지켜지지만 그 숫자가 어디서 왔는지는 사라집니다.

그래서 매달 갱신하던 장부를 CSV로 바꿔 두면 다음 달에 숫자를 고쳐도 합계가 따라 움직이지 않습니다. 참조 시트가 통째로 없으니 되살릴 수도 없습니다.

다섯 장을 다 남기려면

방법은 세 가지이고, 어느 쪽이든 시트 수만큼 파일을 만드는 것이 핵심입니다.

1. 시트 탭을 하나씩 눌러 활성화한 뒤 매번 다른 이름으로 저장을 반복합니다. 다섯 번 하면 다섯 개가 생깁니다.
2. 시트가 많으면 아래 코드로 한 번에 뽑습니다. 파일 이름에 시트 이름이 그대로 들어갑니다.
3. 받는 쪽이 꼭 한 파일을 원한다면 CSV 대신 xlsx 그대로 보내는 편이 낫습니다. 시트도 수식도 보존됩니다.

import csv
from openpyxl import load_workbook

wb = load_workbook("장부.xlsx", data_only=True)   # 수식 대신 계산된 값으로

for ws in wb.worksheets:
    with open(f"{ws.title}.csv", "w", encoding="utf-8-sig", newline="") as f:
        w = csv.writer(f)
        for row in ws.iter_rows(values_only=True):
            w.writerow(["" if v is None else v for v in row])
    print(ws.title, ws.max_row, "행")

data_only=True가 중요합니다. 이 옵션이 없으면 수식이 계산 결과 대신 =SUM(...) 글자 그대로 CSV에 들어갑니다. 반대로 이 옵션을 켜도 엑셀에서 한 번도 계산된 적 없는 파일이라면 빈칸이 나오니, 엑셀로 열어 저장한 파일에 쓰는 것이 안전합니다.


저장한 CSV의 인코딩도 확인하세요

측정한 엑셀이 CSV로 내보낸 파일은 윈도우 기본 코드페이지로 저장돼 있었습니다. 국내 환경에서는 cp949입니다. 국내 프로그램끼리 주고받을 때는 문제가 없지만, 웹 서비스나 맥으로 넘기면 한글이 깨져 보입니다.

위 코드가 utf-8-sig로 저장하는 이유가 여기 있습니다. 어느 쪽으로 저장해야 하는지와 각 프로그램에서 지정하는 방법은 CSV를 UTF-8로 저장하는 법에 정리해 두었습니다. 반대로 엑셀에 표시되는 값과 파일에 저장된 값이 다른 경우는 보이는 값과 저장값의 차이 쪽을 보시면 됩니다.

 

CSV는 표 한 장을 담는 그릇입니다. 시트가 여럿이면 그릇도 그만큼 필요하고, 수식은 어느 그릇에도 담기지 않습니다.

 

위 행 수와 바이트는 윈도우 11에서 엑셀로 시트 5장짜리 파일을 만들어 저장한 뒤, 파이썬 3.14.6과 openpyxl 3.1.5로 다시 읽어 확인한 값입니다. 엑셀 버전과 지역 설정에 따라 저장되는 인코딩은 달라질 수 있습니다.