기술 문서

HotXLS에서 ChartML을 잃지 않고 Excel 차트 편집하기

HotXLS는 가져온 Excel 차트의 원본 ChartML을 보관하며 타입 모델에서 바뀐 것이 없으면 바이트 단위로 그대로 재생하므로, 통합 문서를 열고 다시 저장하는 것이 객체 모델이 표현하지 않는 차트 부분을 조용히 벗겨내지 않습니다. 제목, 시리즈, 축을 편집하면 HotXLS는 처음부터 차트를 다시 생성하는 대신 새 타입 노드를 원본 트리에 구조적으로 병합합니다

이 구분, 즉 건드리지 않았을 때 재생하고 편집했을 때 병합하는 것이 Delphi 애플리케이션이 애널리스트가 Excel에서 만든 차트에 안전하게 겨눌 수 있게 만듭니다. 타입 모델에서 차트를 다시 생성하는 것은 항상 모델이 모르는 무엇이든 잃으며, Excel 차트는 라이브러리가 모르는 것으로 가득합니다. 커스텀 스타일, 확장 목록, 대체 콘텐츠 분기, 애드인에서 온 네임스페이스 한정 서식이 그것입니다

통합 문서를 다시 저장하면 차트가 왜 평면화되는가

일반적인 구현이 이해하는 것을 읽고 이해하는 것을 쓰기 때문입니다. 그 사이에 있는 모든 것, 즉 새 Excel 빌드에서 온 extLst, mc:AlternateContent 분기, 모델이 프로퍼티를 가지지 않는 셰이프 효과는 파일에는 존재하지만 객체 모델에는 자리가 없어 저장 시점에 사라집니다. 사용자는 그라데이션, 커스텀 데이터 레이블, 3D 효과를 잃은 차트를 보며, 통합 문서는 왜 그런지 설명할 수 없습니다

통합 문서에서 PreserveUnsupportedParts가 켜져 있으면, HotXLS는 가져오기 시 원본 UTF-8 차트 바이트를 길이와 모델링된 콘텐츠의 64비트 핑거프린트와 함께 저장합니다. 저장 시점까지 타입 모델이 바뀌지 않았다면 원본 바이트를 다시 기록합니다. XML 재정렬도, 공백 드리프트도, 아무도 편집하지 않은 차트를 위해 메모리에 남아도는 상주 UTF-16 사본도 없습니다

var
  Workbook: TXLSXWorkbook;
  Chart: TXLSXChart;
begin
  Workbook := TXLSXWorkbook.Create(nil);
  try
    Workbook.PreserveUnsupportedParts := True;   // set before Open
    Workbook.Open('quarterly-review.xlsx');
    Chart := Workbook.Sheets[1].Charts[0];   // Sheets[] is 1-based
    if Chart.HasPreservedXml then
      Log('original ChartML retained; untouched charts replay exactly');
    Chart.Title := 'Revenue by region, Q3 2026';  // now the merge path runs
    Workbook.SaveAs('quarterly-review-out.xlsx');
  finally
    Workbook.Free;
  end;
end;

병합이 유지하는 것과 모델이 소유하는 것

규칙은 소유권입니다. 공개 모델 노드, 즉 제목, 시리즈, 캐시, 플롯 그룹, 축은 새로 생성된 트리가 결정합니다. 모델링되지 않은 서브트리는 원본에서 옮겨옵니다. 이 비대칭은 의도적이며, 내면화하는 데 잠시 걸리는 부분입니다. 시리즈를 삭제하는 것이 보존된 XML에서 옛 시리즈를 부활시켜서는 안 되므로, 모델이 소유하는 것은 모델이 사라졌다고 말할 때조차 모델에서 취합니다

소유자 없는 콘텐츠는 그것이 옆에 앉아 있던 매치된 노드 옆에 다시 끼워지며, extLst는 부모 안에서 마지막을 유지하는데 스키마가 그것을 요구하기 때문입니다. 알려진 프로퍼티를 지우는 것, 즉 굵게 플래그를 제거하거나 색을 빼는 것은 원본 트리에서 채울 빈 공간이 아니라 지우기로 취급됩니다. 같은 이웃의 알려지지 않은 속성은 자리를 유지합니다

마크업 호환성 콘텐츠는 특정 처리를 받습니다. 파싱 시 HotXLS는 mc:Choice를 건너뛰고 mc:Fallback을 읽으며, 그 폴백 분기가 모델이 아는 플롯 그룹을 감싸면 병합은 새 타입 콘텐츠를 폴백 서브트리 안에 다시 기록합니다. 그 단계 없이는 저장이 새 플롯 그룹을 내보내고 옛 것을 폴백 안에 남겨, 차트가 두 개를 담게 될 것입니다

한 차트를 제외하기

ClearPreservedXml은 한 차트의 원본 XML과 핑거프린트를 버려 다음 저장이 그 차트를 순수하게 타입 모델에서 다시 구축합니다. 차트별 결정이며, 통합 문서 수준의 PreserveUnsupportedParts는 보존 상태를 가져오기 때 구축할지를 여전히 통제합니다

충실한 차트보다 깨끗한 차트를 원할 때 사용하십시오. 예를 들어 템플릿 차트가 옛 기업 테마의 서식을 담고 있고 작업의 요점이 그것을 버리는 것일 때입니다. 디버깅 반사작용으로 사용하지 마십시오. 편집 후 잘못 렌더링되는 차트는 보존 질문보다 모델링 질문인 경우가 더 많으며, 보존된 XML을 지우면 증거를 파괴합니다

콤비네이션 차트와 두 번째 축

AddPlotGroup은 순서가 지정된 콤비네이션 차트를 구성하며, 각 플롯 그룹은 자체 차트 패밀리와 자체 주 또는 보조 축 할당을 유지합니다. 이것이 어디에나 있는 비즈니스 차트가 필요로 하는 것입니다. 왼쪽 축의 컬럼으로 수익을, 오른쪽의 라인으로 마진 비율을 배치하는 것입니다

차트는 주와 보조 범주·값 축에 시리즈 축을 더해 노출하며, 타입이 지정된 범주, 값, 날짜, 시리즈 축 설정이 위치, 식별자, 교차, 날짜 단위, 레이블 인터벌, 표시 여부를 커버합니다. 이전 평면 API, 즉 ChartType, AddSeries, 평면 Series 컬렉션은 여전히 주 플롯 그룹을 다루므로, 기존 코드는 아래의 모델이 모든 순서 지정된 그룹을 담은 채로 계속 작동합니다

var
  Chart: TXLSXChart;
  Line: TXLSXChartPlotGroup;
begin
  // Column chart anchored over rows 1..15, columns 5..12
  Chart := Sheet.Charts.Add(xlsxChartColumn, 'Revenue and margin',
    1, 5, 15, 12);
  Chart.AddSeries('Revenue', 'Data!$A$2:$A$13', 'Data!$B$2:$B$13');
  // Second plot group: a line, read against the secondary value axis
  Line := Chart.AddPlotGroup(xlsxChartLine, xlsxAxisSecondary);
  Line.AddSeries('Margin %', 'Data!$A$2:$A$13', 'Data!$C$2:$C$13');
end;

이 모델이 존재하기 전에는 콤비네이션 차트를 열고 다시 저장하면 하나의 차트 패밀리로 붕괴되며 보조, 날짜, 시리즈 축을 잃었습니다. 차트 수식 참조와 캐시된 시리즈 값은 이제 통합 문서 복사와 열기·저장 주기를 견디며, 차트 앵커는 관계 식별자로 차트 파트에 매칭됩니다. 따라서 관계 항목을 재정렬하는 애플리케이션이 더 이상 워크시트 위치 사이에서 차트 콘텐츠를 뒤바꾸지 않습니다

수동 레이아웃 함정

플롯 영역, 제목, 축 제목, 범례를 손으로 위치 지정한다면 네 좌표를 모두 기록하십시오. Office는 그중 하나라도 있으면 x, y, w, h를 완전한 그룹으로 요구하며, 그렇지 않으면 전체 manualLayout을 무시합니다. HotXLS는 그 이유로 항상 전체 사각형을 내보내며, SetPositionAndSize가 한 번의 호출로 그것을 설정하고 활성화합니다

두 가지 세부 사항이 사양의 전체 여유가 아니라 Excel을 따릅니다. 위치는 xModeyModeedge로 기록되는 반면 크기는 wModehModefactor를 사용하는데, 이것이 Excel이 기록하는 것이자 Excel이 다른 조합을 변환하는 것이기 때문입니다. 그리고 layoutTarget은 플롯 영역에만 내보내지며, Microsoft 구현 노트가 금지하는 제목이나 범례에는 결코 내보내지 않습니다

통합 문서 왕복에 끼워 넣기

차트 보존은 일반 정책의 한 사례입니다. 다른 곳에서 저작된 문서를 편집하는 라이브러리는 요청받은 것만 바꾸고 나머지는 바꾸지 않아야 한다는 정책입니다. 같은 추론이 HotXLS를 테마, 계산 체인, 워크시트 확장에 적용하며, 테마와 extLst, calcChain의 무손실 왕복에 관한 글과 VBA와 외부 링크 보존에서 설명합니다. 차트 저작 표면 자체, 즉 Delphi에서 차트를 만들고 이미지와 드로잉을 배치하는 것은 HotXLS의 차트와 이미지, 드로잉 산책문을 보십시오

HotXLS는 기계에 Excel 설치 없이 네이티브 Delphi와 C++Builder 코드로 XLSX 차트를 읽고 편집하고 씁니다. 이것이 충실도를 자동화 문제가 아니라 라이브러리 문제로 만듭니다. HotXLS 스프레드시트 컴포넌트 페이지에 차트 기능 목록과 평가판 다운로드가 있습니다