Excel 파일의 선택한 시트만 CSV로 내보내기 실습

이 폴더의 모든 Excel 데이터는 설명을 위해 만든 합성 데이터입니다.
sample_public_internal.xlsx의 활성 시트는 Internal입니다.
내보낼 표는 Public A1:C4이며 code,name,memo 3열입니다.

1. Python 3.12가 설치된 터미널에서 이 폴더로 이동하세요.
2. python -m pip install -r requirements.txt
3. python export_selected_sheet.py sample_public_internal.xlsx public_new.csv --sheet Public --range A1:C4
4. python verify_result.py public_new.csv

public_new.csv는 ZIP에 포함되지 않은 새 결과 이름입니다.
실행 결과의 data_rows는 3입니다. csv.reader에서 code 열은
00123, 00007, 00042 문자열이며 Internal의 합성 표식은 0개입니다.

파일 안내
- export_selected_sheet.py: 본문과 같은 전체 내보내기 코드
- sample_public_internal.xlsx: 기본 합성 입력
- public_result.csv: Linux에서 실제 생성하고 확인한 CSV
- expected_public.csv: 기대하는 UTF-8 BOM CSV
- verify_result.py: 기본 샘플용 Python csv.reader 대조
- create_sample.py: 같은 합성 입력을 새 이름으로 만드는 선택 도구
- test_export.py: 새 임시 폴더에서 기본 내보내기를 확인하는 1개 단위 테스트
- failure_inputs: 실패 조건을 재현하는 합성 XLSX와 좌표 이동 성공 샘플
- requirements.txt: 실제 검증에서 사용한 openpyxl 버전

새 합성 입력이 필요하면 아래 명령을 사용하세요.
python create_sample.py another_sample.xlsx
이미 존재하는 이름은 덮어쓰지 않습니다.

실행을 반복할 때는 public_new_2.csv처럼 다른 결과 이름을 지정하세요.
기존 결과를 지우거나 덮어쓰는 코드는 없습니다.
CSV 쓰기 중 디스크나 권한 문제가 생기면 부분 파일이 남을 수 있습니다.
그 파일은 사용하지 말고 원인을 확인한 뒤 새로운 출력 이름으로 실행하세요.

허용하는 값
- 첫 행: code,name,memo와 정확히 일치
- code: 실제로 저장된 5자리 ASCII 숫자 문자열
- name: 비어 있지 않은 텍스트
- memo: 텍스트 또는 빈 셀(None). None은 빈 문자열로 변환
- 문자열의 쉼표, 큰따옴표, 중간 개행은 csv.writer가 인용 처리

거부하는 값과 구조
- 요청 범위 안의 수식, 오류, 숫자, 날짜, bool
- 숫자로 저장된 code에 표시 형식 00000만 적용한 경우
- =,+,-,@로 시작하거나 공백 뒤 이 문자가 나오는 문자열
- 위 문자의 전각 형태, 탭/CR/LF로 시작하는 문자열
- 그 밖의 Unicode 제어(Cc)·서식(Cf) 문자. 문자열 중간의 탭/CR/LF는 허용
- 요청 범위와 겹치는 병합 셀, 표, 필터, 배열/데이터 표 수식
- 숨긴 선택 시트, 선택 범위의 숨긴 행/열
- 헤더 불일치, 시트 없음, 잘못된 범위, 기존 출력
- 10 MiB 초과 입력, 1000개 초과 데이터 행, 일반 XLSX 밖 형식
- 입력 파서가 경고를 내는 파일

수식처럼 보이는 문자열은 데이터에 접두사를 붙여 수정하지 않고 거부합니다.
이 규칙이 모든 스프레드시트 프로그램에서의 안전을 보증하지는 않습니다.
CSV에는 Excel 열 형식이나 서식, 수식 계산 기능이 없습니다.
Excel로 가져올 때 code 열을 텍스트로 지정해야 앞자리 0이 유지됩니다.
이 실습에서는 Excel UI로 다시 열기와 계산은 실행하지 않았습니다.

지원 형식
일반 Transitional OOXML .xlsx의 표시 상태 일반 워크시트와 단순한 3열 표.
Strict OOXML, 암호화, .xls/.xlsb/.xlsm/템플릿은 지원하지 않습니다.
원본 workbook을 Excel 앱으로 실행하거나 저장하지 않습니다.
openpyxl 파서로 파일을 읽고, 읽을 수 없는 입력은 결과를 만들지 않습니다.
원본 파일의 SHA-256은 CSV 생성 전 다시 비교합니다.
동시에 원본을 수정하지 않는 통제된 로컬 폴더에서 실행하세요.

실제 검증 환경: Linux, Python 3.12.14, openpyxl 3.1.5.
CSV 파일은 Python csv.reader로 왕복 대조했습니다.
Microsoft Excel UI, Excel 계산, Windows/macOS 실행은 검증하지 않았습니다.
