기술 문서

HotXLS로 메타데이터 전용과 선택적 XLSX 로딩하기

HotXLS는 XLSX 통합 문서를 열면서 어떤 워크시트 셀도 파싱하지 않을 수 있습니다. TXLSXWorkbook.MetadataOnly는 통합 문서 속성, 정의된 이름, 시트 이름과 표시 상태, 스타일, 테마, 연결, 외부 링크를 읽은 뒤 셀 XML 직전에 멈춥니다. 통합 문서 디렉터리에 무엇이 있는지 알아야 하는 스캐너에게는 분과 초의 차이입니다

세 개의 관련 스위치가 그림을 완성합니다. SelectedSheets는 이름 지정된 부분집합의 셀만 파싱하고, LoadSheet는 건너뛴 시트를 나중에 원본 아카이브에서 구체화하며, PreserveRawParts는 변경되지 않은 파트의 압축 바이트를 저장 시 그대로 복사합니다. 함께 사용하면 통합 문서 열기를 전부 아니면 전무 연산에서 범위를 지정할 수 있는 무언가로 바꿉니다

단일 셀도 파싱하지 않고 무엇을 알 수 있는가

대부분의 발견 작업이 필요로 하는 것보다 많습니다. Open 전에 MetadataOnly를 설정하면, 통합 문서는 시트 이름과 표시 상태, 정의된 이름, 문서 속성, 스타일과 테마, 외부 링크와 연결을 담은 채 돌아옵니다. 시트는 셀이 0개인 객체로 존재합니다

그것이 카탈로그, 감사, 라우팅 결정이 의존하는 정보입니다. 어느 통합 문서가 TaxRate라는 이름을 정의하는가? 어느 것이 숨겨진 시트를 가지는가? 어느 것이 폐기된 서버로 연결하는가? 모든 파일을 완전히 로드하여 그 질문에 답하는 것이 야간 작업을 밤샘 작업으로 만드는 방법입니다

var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create(nil);
  try
    Workbook.MetadataOnly := True;      // set before Open
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // Sheets[] is 1-based
      if not Workbook.Sheets[I].Visible then
        Report.Add(FileName + ': hidden sheet ' +
          Workbook.Sheets[I].Name);
  finally
    Workbook.Free;
  end;
end;

40개 중 두 시트 로딩하기

SelectedSheets는 시트 이름의 TStringList입니다. 비어 있지 않을 때 Open은 이름 지정된 시트에 대해서만 셀 XML을 파싱하며, 다른 모든 시트는 올바른 이름과 표시 상태를 유지한 채 셀을 갖지 않습니다. 빈 목록은 모두 로드하는 이전 동작을 뜻합니다

MetadataOnly와의 상호작용은 명확히 말할 가치가 있는데, 거꾸로 하면 당혹스러운 빈 통합 문서가 만들어지기 때문입니다. MetadataOnly = True는 선택을 재정의하고 모든 시트를 건너뜁니다. 둘 중 하나를 사용하십시오. 발견은 메타데이터 전용을 사용하고, 표적 작업은 선택을 사용합니다

Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Later, when the user opens a tab you skipped.
// LoadSheet takes the 0-based position and needs the source file,
// so it does not work on a workbook opened from a stream
if Workbook.LoadSheet(ZeroBasedPosition) then
  Grid.Refresh;

LoadSheet(Index)는 건너뛴 시트를 원본 아카이브에서 온디맨드로 구체화하며, 이 패턴을 배치 전용이 아니라 인터랙티브 애플리케이션에서도 사용 가능하게 만드는 것이 바로 이것입니다. 사용자가 보고 있는 시트를 열고, 클릭할 때 나머지를 로드하십시오. 아카이브는 정확히 그 이유로 열린 채로 남으므로, 사용자가 다른 시트를 요청할 수 있는 한 통합 문서를 살아 있게 유지하십시오

왕복이 건드리지 않은 파트를 왜 바꾸는가

단순한 저장이 모든 것을 다시 생성하기 때문입니다. 테마를 압축 해제하고, 객체 모델을 구성하고, 다시 직렬화하고, 다시 압축하면 테마에 대한 어떤 것도 바뀌지 않았는데 바이트가 달라집니다. VBA 프로젝트와 피벗 캐시의 경우 이것은 낭비 이상으로, 그 파트들이 객체 모델이 완전히 표현하지 못하는 구조를 담기 때문입니다

PreserveRawPartsSaveAs 동안 변경되지 않은 파트의 압축된 표현을 소스 아카이브에서 직접 복사하여 이것에 답합니다. 테마, VBA 프로젝트, 피벗 테이블, 피벗 캐시는 수정되지 않았을 때 바이트로 옮겨갑니다. 압축 해제도, 재압축도, 직렬화 왕복에서 무언가를 잃을 위험도 없습니다

비용은 이미 가지고 있던 제약입니다. 소스 아카이브는 저장 시점에 여전히 사용 가능해야 합니다. 워크플로가 파일을 메모리로 읽고 닫은 뒤 한 시간 뒤에 저장한다면, 원시 복사 경로는 복사할 것이 없습니다. 통합 문서의 수명 동안 소스를 도달 가능하게 유지하십시오. 이는 LoadSheet가 부과하는 것과 같은 요구사항입니다

의도적으로 다시 여는 발견 파이프라인

생산에서 작동하는 패턴은 두 패스와 기교가 없습니다. 패스 하나는 메타데이터 전용으로 열고 결정합니다. 패스 둘은 중요한 파일을 시트 선택과 함께 다시 열고 작업을 합니다. 다시 여는 것은 패스 하나가 피한 것을 셀 때까지 낭비처럼 보입니다. 두 번째 열기가 셀을 파싱하는 유일한 것이며, 그것도 패스 하나가 선택한 시트만 파싱합니다

// Pass 1: discovery
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// Pass 2: targeted load
Workbook := TXLSXWorkbook.Create(nil);
Workbook.SelectedSheets.AddStrings(Wanted);
Workbook.Open(FileName);

Open 후에 플래그를 지워 메타데이터 전용 통합 문서를 제자리에서 승격하려 하지 마십시오. 플래그는 여는 동안 읽히며, 그 이후에 지우는 것은 셀 XML이 결코 방문되지 않은 통합 문서에 대해 아무것도 바꾸지 않습니다

다른 대용량 파일 레버와의 관계

선택적 로딩은 파싱하는 것을 줄입니다. 로드된 이후 시트가 치르는 비용은 줄이지 않으며, 모든 시트의 모든 셀을 진정으로 필요로 할 때는 도움이 되지 않습니다. 그 경우 관련 작업은 저장 쪽에 있으며 행 블록 셀 저장과 인터벌 스타일 오버레이에 관한 글에서 설명하고, 파싱 쪽은 병렬 XLSX 파싱과 메모리 할당자에서 다룹니다. 작업이 편집이 전혀 없는 순수 스캔일 때 스트리밍 직접 리더는 객체 모델을 완전히 건너뛰며, 그것을 구축하는 어떤 로드 전략보다도 나을 것입니다

HotXLS는 Excel 의존성 없이 네이티브 Delphi와 C++Builder 코드로 XLS와 XLSX 파일을 엽니다. 따라서 서버 측 발견 작업은 실행 파일 외에 아무것도 설치하지 않고 실행됩니다. 지원 형식과 라이선싱은 HotXLS 스프레드시트 컴포넌트 페이지를 보십시오