홈 › 실무 확장 › 01 / 22

Excel(XLSX) 구조와 순수 JDK로 읽기/쓰기

섹션 7진행 0 / 22

7. 정리

  • XLSX 는 zip 안의 XML 묶음이다. 최소 6개 파트([Content_Types], .rels, workbook, workbook.rels, styles, sheet1)가 있어야 열리고, 모든 참조는 rels 파일을 거친다.
  • 셀은 <c r="B2" t="타입" s="스타일"><v>값</v></c>. 날짜는 숫자 + 날짜 스타일이고 기준일은 1899-12-30 (1900 윤년 버그). 빈 행은 파일에 없고, 빈 셀은 <c> 가 없다.
  • 문자열은 inlineStr(셀 안에 직접, 스트리밍 가능) 과 sharedStrings(공유 테이블, Excel 이 쓰는 방식) 두 가지. 쓸 때는 inlineStr, 읽을 때는 둘 다 처리한다.
  • 쓰기는 ZipOutputStream 에 sheet1.xml 을 먼저 스트리밍하고 close() 에서 고정 부품을 붙인다. zip 은 순서를 따지지 않는다. cols 는 sheetData 앞, autoFilter/mergeCells 는 뒤.
  • 읽기는 StAX 상태 기계로 행 단위 콜백. sharedStrings 와 dateStyles 만 먼저 올린다. 100만 행이어도 힙은 일정하다.
  • 업로드 검증 패턴: 헤더 검증 → 빈 행 스킵 → 오류 전부 수집(행 번호는 r 속성) → 날짜는 date() 로 타입 확인 → 에러 리포트를 XLSX 로 반환.
  • 업로드 XML 은 XXE 를 끄고(SUPPORT_DTD=false) 크기·행 수 상한을 둔다. 출력 문자열은 반드시 escape().

다음 레슨 02. Apache POI 로 Excel 업로드/다운로드 에서는 같은 요구사항을 POI 로 구현합니다. 이 레슨에서 본 sheet1.xml 구조를 알고 있으면 POI 의 getCellType(), DataFormatter, CellStyle 재사용, SXSSFWorkbook 이 왜 그렇게 설계되었는지 바로 이해됩니다.