HotXLS 문서

XLSB 수식과 워크시트 개체

XLSX 통합 문서 퍼사드는 타입 지정 값, 평범한 캐시 수식, 이름, 공통 스타일, 표현된 워크시트 개체를 갖춘 검증된 XLSB 부분집합을 읽고 씁니다. 표현되지 않는 상태는 대상 출력 전에 거부됩니다

열기와 저장

if Workbook.Open('values.xlsb') <> 1 then
  raise Exception.Create('XLSB input is unsupported or invalid');
if Workbook.SaveAsChecked('values-copy.xlsb', xlsxExcelBinaryWorkbook) <> 1 then
  raise Exception.Create('XLSB output is unsupported or failed');

Open은 통합 문서 파트의 콘텐츠와 등록된 타입을 감지합니다. 성공한 바이너리 입력은 SourceFormat=xlsxExcelBinaryWorkbook을 설정하고, 기존 네 TXLSXFileFormat 서수는 바뀌지 않은 채 새 멤버는 서수 4를 가집니다

파일·스트림 SaveAs와 SaveAsChecked 오버로드는 바이너리 형식을 명시적으로 받습니다. 기본 저장은 파일 이름 확장자와 무관하게 여전히 평범한 Open XML 통합 문서 형식을 고릅니다

GetConversionReport(xlsConversionExcelBinaryWorkbook)는 압축 셀 저장소를 펼치지 않고 현재 상태를 검사합니다. 지원되지 않는 항목은 비검증 저장이나 AllowLossy=True인 경우에도 필수 실패로 남습니다

지원되는 상태

변환 보고서는 살아 있는 모델 기능을 다루고, 완전한 패키지 검증은 잘못된 참조, 잘못된 형태의 레코드, 낯선 속성, 지원되지 않는 보존 콘텐츠에 대한 최종 관문으로 남습니다

바이너리 가져오기는 스타일이 적용된 빈 셀을 포함해 파일의 명시적 기본 폰트와 지원되는 내장 숫자 서식을 유지합니다. 로캘 의존 숫자 서식은 reader가 지역 서식을 추측하지 않도록 명시적인 서식 코드가 필요합니다

명시적 경계

공유 수식 레코드, 배열·동적 배열 소유권, 배열 상수와 배열 반환 함수, future 함수, 사용자 정의 함수, 외부 통합 문서·다중 시트 참조, VBA, 외부 데이터 연결, 피벗 테이블과 Slicer, 차트·드로잉, 주석·리치 텍스트, 유효성 검사, 조건부 서식, 고급 페이지·확장 메타데이터는 이 백엔드의 범위 밖입니다

테이블 계산 열, 합계 집계 수식, 정렬 상태, 차이·커스텀 테이블 서식, 쿼리 바인딩 테이블, XML 매핑은 거부됩니다. 색·아이콘·동적·날짜 그룹 필터, 타입 지정 네이티브 Boolean 커스텀 조건, 숫자처럼 보이는 네이티브 문자열 커스텀 조건, 필터 버튼 표시 재정의도 거부됩니다

가져온 non-custom 워크시트 필터 조건은 RawXml로 유지됩니다. 커스텀 비교는 기존 타입 지정 조건 프로퍼티를 채우고, 선택 값과 빈 선택은 새 타입 지정 값 목록 API가 아니라 XML 기반 조건으로 남습니다

수식 토큰 변환은 시맨틱과 참조 플래그를 보존합니다. 괄호와 따옴표 시트 이름으로 수식 텍스트를 정규화할 수 있으므로 바이트 단위 텍스트 동일성은 약속하지 않습니다

수식 출력에는 명시적인 숫자·문자열·Boolean·평범한 오류 캐시가 필요합니다. 저장 정책이 재계산하지 않을 때, xrmManual과 깨끗한 종속성 그래프를 가진 xrmIfDirty를 포함해, 없는 캐시는 거부됩니다. 애플리케이션은 저장 전에 Recalculate를 호출하거나 xrmAlways를 고를 수 있으며 빈 문자열, False, 숫자 0도 유효한 캐시입니다

계산 속성은 지원되는 기본값을 사용해야 합니다. 수동 계산, 반복 계산, 축소된 정밀도, 대체 참조 모드, 강제·불완전 계산, 명시적 스레드 구성, 기타 의미 있는 non-default 설정은 거부됩니다

계산 체인과 바이너리 셀 인덱스는 재생성되는 메타데이터로 패키지 브리지를 넘어 복사되지 않습니다. 낯선 기능 레코드나 관계는 조작된 Open XML 파트가 되는 대신 실패로 남습니다

바이너리 입력에는 즉시 전체 시트 로딩이 필요합니다. lazy 로딩은 유지되는 변환 아카이브를 요구하므로 MetadataOnly와 비어 있지 않은 SelectedSheets 목록은 기존 모델을 교체하기 전에 거부됩니다

실패와 소유권 보장

바이너리 패키지는 평범한 XML 파서가 통합 문서를 초기화하기 전에 검증·변환됩니다. 지원되지 않는 입력, 잘못된 형태의 바이너리 콘텐츠, 거부된 읽기 모드, 변환 취소는 기존 워크시트 개체, 파일 이름, 소스 형식, 소스 아카이브 바인딩을 보존합니다

검증된 바이너리 변환이 기존 XML 파서에 들어간 뒤에는 late XML 파싱이나 애플리케이션 콜백 실패가 평범한 XML 열기 수명 주기를 따릅니다. 프리플라이트 보장이 임의의 콜백 쓰기에 대한 롤백을 약속하지는 않습니다

저장은 전체 바이너리 패키지를 스테이징합니다. 파일 출력은 형제 임시 파일과 최종 교체 한 번을 사용하고, 읽기 가능한 탐색 가능 스트림 출력은 커밋 실패 뒤 롤백을 위해 바이트·크기·위치 스냅샷을 유지합니다

LastSaveUsedStreaming=False는 중간 XML writer가 스트리밍하더라도 완전한 바이너리 스테이징을 반영합니다. 메모리에는 변환된 파트와 완전한 패키지가 포함되므로 이 백엔드는 제한된 메모리 스트리밍 writer가 아닙니다

변환 보고서와 프리플라이트는 압축 값과 구체화된 수식이 섞인 경우를 포함해 압축 셀 저장소를 유지합니다. 성공한 저장은 기존 스타일 준비와 워크시트 writer를 통해 압축 값을 펼칠 수 있으므로, 보고서 순도가 불변이거나 비구체화하는 저장 작업을 뜻하지는 않습니다

성공한 바이너리 파일 저장은 이전 원본 XML 소스 바인딩을 지웁니다. 스트림 저장은 파일 이름 동작을 유지하고, 취소는 대상 커밋 전에 검사됩니다

패키지 변환 API

procedure XlsbToOpenXml(Source: TZipArchive; Destination: TStream;
  CancelCheck: TXLSStreamCancelCheck = nil;
  EntryCompressionLevel: Integer = -1; EntryFixedDate: TDateTime = 0);
procedure OpenXmlToXlsb(Source: TZipArchive; Destination: TStream;
  CancelCheck: TXLSStreamCancelCheck = nil;
  EntryCompressionLevel: Integer = -1; EntryFixedDate: TDateTime = 0);
function XlsbStylesToXml(const Data: AnsiString): AnsiString;
function XlsbStylesFromXml(const Data: AnsiString): AnsiString;
function XlsbStringsToXml(const Data: AnsiString): AnsiString;
function XlsbStringsFromXml(const Data: AnsiString): AnsiString;

TXlsbFormulaValidator.Create(WorkbookXml)은 통합 문서 이름 컨텍스트를 검증하고, Validate(FormulaText, SheetIndex)는 워크시트 셀 접근 없이 수식을 검증합니다. SheetIndex는 0 기반이며 validator는 호출자가 소유합니다

XlsbValidateTableXml(Data)과 XlsbValidateAutoFilterXml(Data)는 UTF-8 개체 XML을 패키지 출력이 쓰는 같은 인코더 계약으로 검증합니다. 실패는 기존 형식·unsupported-feature 예외를 던집니다

이 lxXlsb API는 호출자 소유권을 유지합니다. 패키지 변환은 오프셋 0부터 Destination을 교체하기 전에 모든 파트를 검증·스테이징하고, 코어 파트 브리지는 UTF-8 XML과 원본 바이너리 바이트를 사용합니다

EXlsbUnsupported는 EXlsbFormatError에서 파생되어 예상되는 부분집합 거부와 잘못된 형태의 데이터를 구별합니다. 취소는 커밋 전에 확립된 스트림 취소 예외를 던집니다

압축은 -1부터 9까지를 받고, 고정 날짜는 0 또는 1980년부터 2107년까지의 유한한 DOS 표현 가능 날짜를 받습니다. 잘못된 옵션은 대상이 바뀌기 전에 거부됩니다