- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀에서 “파일이 손상되었지만 일부 데이터를 복구했습니다” 경고가 표시될 때 원인 식별부터 안전한 데이터 복구, 재발 방지 설정까지 현장에서 즉시 적용 가능한 절차를 체계적으로 제공하는 것이다.
1. 오류 메시지의 의미와 즉시 대응
이 메시지는 통합 문서의 내부 XML 구성 요소 중 일부가 손상되어 엑셀이 자동 복구를 시도했음을 의미한다. 자동 복구가 성공하더라도 서식, 차트, 피벗캐시, 도형, 연결 정보 등 비핵심 개체가 소실될 수 있다. 즉시 해야 할 조치는 다음과 같다.
- 손상 파일을 읽기 전용으로 열기하여 2차 손상을 방지한다.
- 다른 이름으로 저장을 수행해 현재 상태를 보존한다.
- 가능하면 클라우드·NAS·로컬의 이전 버전 또는 자동 저장본을 확인한다.
- 복구 로그를 확인한다. 대개 “손상된 레코드” 항목에 어느 구성 요소가 문제인지 단서가 담긴다.
2. 대표 원인별 진단 로드맵
엑셀 .xlsx·.xlsm·.xltx 파일은 ZIP 컨테이너 내부의 XML 묶음으로 구성된다. 특정 XML 조각이 깨지면 본 경고가 발생한다. 아래 표는 빈도가 높은 원인과 관찰 증상, 1차 조치안을 정리한 것이다.
| 원인 카테고리 | 주요 파일(경로) | 증상 | 1차 조치 |
|---|---|---|---|
| 스타일 손상 | xl/styles.xml | 열림 시 서식 초기화, 특정 셀 선택 시 다운 | Clean Styles 매크로 실행 또는 styles.xml 제거 후 재생성 |
| 공유 문자열 손상 | xl/sharedStrings.xml | 텍스트가 ####로 보임, 특정 시트 표시 불가 | 문제 문자열 제거 및 재저장, 또는 파일 분해·복원 |
| 시트 XML 손상 | xl/worksheets/sheetN.xml | 특정 시트만 열면 즉시 오류 | 해당 시트 XML 검증·수정, 시트 분리 저장 |
| 도형/그리기 개체 손상 | xl/drawings/*, xl/drawings/_rels/* | 도형·아이콘 누락, 인쇄 미리보기 오류 | 문제 drawing 삭제 후 재삽입 |
| 피벗캐시 손상 | xl/pivotCache/* | 피벗 새로 고침 실패, 열림 경고 반복 | 피벗테이블 제거 후 원본에서 재작성 |
| 정의된 이름 손상 | workbook.xml 내 definedNames | #REF! 참조, 열림 시 경고 | 잘못된 이름 일괄 정리 스크립트 실행 |
| VBA 프로젝트 손상 | vbaProject.bin | 매크로 서명 오류, 저장 시 충돌 | VBA 내보내기·새 통합 문서로 가져오기 |
| 잘못된 확장자 | 컨테이너-내용 불일치 | .xlsx인데 매크로 개체 포함 등 | 파일 유형에 맞게 다른 이름으로 저장 |
3. 안전 복구 절차: 단계별 체크리스트
- 엑셀 자체 복구
- 파일 → 열기 → 파일 선택 → 열기 옆 ▼ → 열기 및 복구 → 복구부터 시도한다.
- 실패 시 같은 경로에서 데이터 추출을 시도한다.
- 자동 저장본·임시본 검색
- 문서 복구 창 또는 “저장되지 않은 통합 문서 복구” 메뉴를 확인한다.
- OneDrive·SharePoint·NAS의 버전 기록에서 직전 정상본을 회수한다.
- 읽기 전용으로 열고 데이터 이관
- 새 통합 문서로 값 붙여넣기를 하여 핵심 데이터부터 격리한다.
- 문제 시트는 CSV로 1시트씩 내보낸 후 재결합한다.
- ZIP 분해 복구(고급)
- 원본 사본의 확장자를
.zip으로 변경한다. - 압축을 풀고
xl/styles.xml,xl/sharedStrings.xml,xl/worksheets/sheetN.xml등을 XML 검증 도구로 확인한다. - 명백한 깨짐(미닫힘 태그 누락, 제어문자 포함)이 보이면 해당 노드를 제거하거나 최소 유효 형태로 수정한다.
- 도형 손상 추정 시
xl/drawings폴더를 임시로 제외한 뒤 재압축하여 열어본다.
- 원본 사본의 확장자를
- 문제 개체 재구성
- 피벗테이블은 원본 데이터에서 다시 만들고, 연결은 새로 정의한다.
- 정의된 이름, 스타일, 서식은 필요 최소만 유지한다.
4. 스타일 손상(Clean Styles) 정리
styles.xml 손상 또는 중복 스타일 폭증은 대표적 원인이다. 아래 매크로는 비정상 스타일을 정리하고 기본 스타일을 재정렬하는 방법이다.
' 모듈에 삽입 후 실행 Option Explicit
Public Sub CleanStyles()
Dim st As Style, i As Long
On Error Resume Next
' 이름이 비정상인 사용자 지정 스타일 제거
For i = ActiveWorkbook.Styles.Count To 1 Step -1
Set st = ActiveWorkbook.Styles(i)
If Not st.BuiltIn Then
If Len(st.NameLocal) = 0 Or InStr(st.NameLocal, Chr(0)) > 0 Then
st.Delete
End If
End If
Next i
On Error GoTo 0
' 표준 스타일 재설정
On Error Resume Next
ActiveWorkbook.Styles("Normal").IncludeNumber = True
ActiveWorkbook.Styles("Normal").IncludeAlignment = True
ActiveWorkbook.Styles("Normal").IncludeFont = True
ActiveWorkbook.Styles("Normal").IncludeBorder = True
ActiveWorkbook.Styles("Normal").IncludePatterns = True
ActiveWorkbook.Styles("Normal").IncludeProtection = True
On Error GoTo 0
End Sub
정리 후 통합 문서를 새 이름으로 저장하고 재시작 후 다시 연다. 메시지가 사라지면 스타일 손상이 원인이었던 것이다.
5. 정의된 이름 손상 일괄 제거
잘못된 범위를 가리키는 이름이 workbook.xml의 definedNames를 망가뜨릴 수 있다. 아래 코드는 오류 이름을 찾아 제거한다.
Option Explicit
Public Sub RemoveInvalidNames()
Dim nm As Name, cnt As Long
Application.ScreenUpdating = False
For Each nm In ActiveWorkbook.Names
If IsError(Evaluate(nm.RefersTo)) Then
nm.Delete
cnt = cnt + 1
End If
Next nm
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
For Each nm In ws.Names
If IsError(Evaluate(nm.RefersTo)) Then
nm.Delete
cnt = cnt + 1
End If
Next nm
Next ws
Application.ScreenUpdating = True
MsgBox cnt & " invalid names removed."
End Sub
6. 시트 XML 손상 최소화 전략
시트별 XML이 깨진 경우가 많다. 다음 순서로 손상 부위를 좁힌다.
- 각 시트를 새 통합 문서로 Move or Copy하여 개별 저장한다.
- 문제가 재현되는 시트를 찾으면 해당 시트의 개체 선택 모드로 전환하여 모든 도형·컨트롤을 삭제하고 저장한다.
- 조건부 서식 규칙 관리자에서 중복·순환 규칙을 정리한다.
- 피벗테이블과 차트를 제거하고 데이터만 남겨 본다.
7. 도형·그리기 개체 손상 대응
도형, 아이콘, 스마트아트, 스파크라인 등은 xl/drawings 및 연관 rels에 저장된다. 열 때 경고가 나거나 인쇄에서 깨지면 도형 폴더를 임시 제외한 복구본을 만들어 증상을 확인한다. 문제가 사라지면 도형을 새로 삽입한다.
8. 피벗캐시·연결 손상 제거
피벗캐시는 손상시 새로 고침이 실패한다. 해결책은 다음과 같다.
- 피벗테이블을 삭제하고 원본 범위에서 새 피벗을 만든다.
- 외부 연결은 데이터 → 쿼리 및 연결에서 중복·끊어진 경로를 제거한다.
9. VBA 프로젝트 재구성
.xlsm에서 vbaProject.bin 손상 의심 시 다음을 수행한다.
- VBE에서 각 모듈·폼을 파일(.bas/.cls/.frm)로 내보낸다.
- 빈 .xlsm를 만들고 내보낸 파일을 다시 가져온다.
- 디지털 서명이 있었다면 재서명한다.
10. Power Query·CSV를 활용한 데이터 살리기
시트가 열리지 않거나 스크롤만 해도 다운되면, 손상본을 데이터 소스로 취급하여 데이터만 추출한다.
- 새 통합 문서에서 데이터 가져오기 → 통합 문서 → 손상본 선택.
- 파워 쿼리 미리보기에서 정상 테이블만 선택해 로드한다.
- 안 되면 각 시트를 CSV로 저장 후 재결합한다.
11. 파일 속성 “차단 해제” 확인
인터넷에서 받은 파일은 운영체제가 보안 플래그를 붙일 수 있다. 파일 속성에서 차단 해제 옵션이 있으면 체크하고 다시 연다.
12. 대용량·복잡도에 따른 예방 설정
- 계산 옵션을 수동으로 전환하고 저장 전 F9로 재계산한다.
- 무분별한 병합, 중첩 조건부 서식, 수만 개의 고유 스타일 생성 작업을 줄인다.
- 이름 관리자를 주기적으로 정리한다.
- 피벗은 데이터 모델을 활용하거나 캐시 재사용을 설계한다.
- 대규모 도형은 SVG·이미지로 단순화한다.
13. 고급: 명령줄로 분해·재압축
자동화 환경에서 파일 분해·재압축을 반복할 수 있다. 다음은 예시이다.
:: 사본 생성 copy "손상본.xlsx" "분해용.zip" :: 압축 풀기 tar -xf "분해용.zip" -C "work" :: 문제 개체 폴더 임시 제거 예시 rmdir /s /q "work\xl\drawings" :: 재압축 tar -cf "복구본.zip" -C "work" . :: 확장자 변경 rename "복구본.zip" "복구본.xlsx" 유닉스 계열 셸을 쓰는 경우 다음과 같이 수행한다.
# 사본 생성 cp damaged.xlsx unpack.zip # 분해 unzip -q unpack.zip -d work # 도형 제거 테스트 rm -rf work/xl/drawings # 재압축 cd work && zip -qr ../repack.zip . cd .. && mv repack.zip repaired.xlsx 14. 오류 원인별 복구 우선순위 체크리스트
| 우선순위 | 조치 | 목표 | 성공 기준 |
|---|---|---|---|
| 1 | 열기 및 복구 | 빠른 가용성 회복 | 경고 제거 또는 최소화 |
| 2 | 읽기 전용 열기 후 데이터 이관 | 핵심 데이터 보존 | 주요 테이블 확보 |
| 3 | 이전 버전 회수 | 신뢰 가능한 베이스라인 확보 | 경고 없는 파일 |
| 4 | ZIP 분해·문제 XML 격리 | 원인 제거 | 특정 개체 제외 시 정상 |
| 5 | 스타일·이름·피벗·도형 재구성 | 구성 정상화 | 기능 정상 작동 |
15. 재발 방지 모범 설정
- 템플릿(.xltx/.xltm)을 통해 스타일·이름 기준선을 통일한다.
- 통합 문서 저장 시 파일 형식과 내용 일치를 유지한다(.xlsx는 매크로 비포함, .xlsm은 포함).
- 대용량 파일은 시트 분할, 파워 쿼리·데이터 모델 사용으로 구조화한다.
- 정기적으로 문서 검사와 오류 검사를 수행한다.
- 신뢰할 수 없는 추가 기능은 제거한다.
16. 현장 트러블슈팅 예시 시나리오
사례 A: 열 때마다 경고 + 서식 초기화 → styles.xml 손상 의심. CleanStyles 실행 후 정상 저장으로 해결하였다.
사례 B: 특정 시트 클릭 시 다운 → 해당 시트의 도형 일괄 삭제로 안정화. drawings 폴더 제거 재압축 테스트로 원인 확정하였다.
사례 C: 피벗 새로 고침 실패 → pivotCache 제거 후 피벗 재작성으로 해결하였다.
사례 D: 정의된 이름 오류 반복 → RemoveInvalidNames 매크로로 정리하고 이름 규칙을 재수립하였다.
17. 품질 보증을 위한 점검 항목
- 파일 크기 급증 여부 체크(스타일·도형 폭증 신호)
- 이름 관리자 오류 여부
- 조건부 서식 중복·순환 규칙 제거
- 연결 및 쿼리 경로 유효성
- 피벗캐시 재생성
- 도형·아이콘 최소화
- 계산 모드·호환성 검사 결과 기록
FAQ
열기 및 복구가 실패하면 어떻게 하나?
읽기 전용으로 열어 데이터만 새 통합 문서에 값 붙여넣기 한다. 이후 ZIP 분해로 문제 XML을 배제하여 개체를 단계적으로 복원한다.
원인을 정확히 특정하려면?
복구 로그의 손상된 레코드 항목과 ZIP 분해 후 개체 폴더별 배제 테스트를 병행한다. drawings, styles, pivotCache, sharedStrings 순으로 제외 테스트하면 분류가 빠르다.
매크로가 원인이면 데이터만 살릴 수 있나?
가능하다. .xlsx로 저장하며 VBA를 제거한 뒤 파워 쿼리·CSV·값 붙여넣기로 데이터만 이관한다.
도형을 많이 쓰면 왜 취약해지나?
그리기 rels가 복잡해지고 파일 크기와 참조 수가 증가한다. 손상 시 영향 범위가 넓어져 오류 발생 확률이 높아진다.
스타일 폭증은 어떻게 방지하나?
외부에서 붙여넣기 시 서식을 제거하고, 템플릿 기반으로 제한된 스타일만 사용한다. 정기적으로 CleanStyles를 실행한다.