기술 문서

Delphi에서의 Excel 스파크라인: HotXLS와 x14 확장

HotXLS는 Delphi 및 C++Builder에서 TXLSXWorksheet.AddSparklineGroup 호출을 통해 단 한 번으로 Excel 스파크라인(Sparklines, Excel이 단일 셀 내에 그리는 미니 차트)을 생성합니다. 이 메서드는 데이터 범위에 대해 스파크라인 그룹을 구축하며, 통합 문서를 저장하면 워크시트 extLst 내부에 x14 확장 블록으로 기록되어 Excel 2010 이상 버전에서 렌더링되고 이전 버전의 뷰어는 에러 없이 이를 건너뜁니다. 별도의 차트 객체, 드로잉 파트 또는 앵커가 필요하지 않습니다

스파크라인이 유용하게 사용되는 시나리오는 항상 일정합니다. 제품, 지역 또는 계정별로 하나의 행이 지정되고 각 행마다 12개월의 수치를 갖는 수백 행 규모의 대시보드 통합 문서가 있고, 행의 끝부분마다 추세 글리프(trend glyph)를 배치하려 합니다. 이를 실제 차트 모델로 구현하려면 수백 개의 DrawingML 차트 파트를 생성해야 하며, 각각 개별 XML 파트, 관계 정보 및 앵커 지오메트리를 가지게 되어 파일 크기와 열기 속도 측면에서 많은 낭비가 발생합니다. 스파크라인 그룹은 "B2:M2 데이터를 기반으로 N2 셀에 작은 선을 그리고, B3:M3 데이터를 기반으로 N3 셀에 그리기"와 같은 하나의 XML 블록으로 정의되므로 행 수에 맞춰 매우 가볍게 복제하여 적용할 수 있습니다

스파크라인이 차트가 아닌 x14 확장인 이유는 무엇입니까?

스파크라인 기능은 ECMA-376 표준 스키마가 확정된 지 3년 후인 Excel 2010에 도입되었으므로, 기존의 리더 프로그램들을 손상시키지 않고 워크시트 마크업 본문에 직접 배치할 수 없었습니다. 이에 대해 Microsoft가 내놓은 해법은 확장 목록(extension list) 메커니즘입니다: 워크시트는 기능을 식별하는 URI가 붙은 <ext> 블록들을 포함하는 <extLst> 요소를 하단에 가질 수 있습니다([MS-XLSX] §2.3.6). 스파크라인은 URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0}x14 네임스페이스를 사용합니다. 해당 GUID를 인식하는 리더 프로그램은 이 블록을 파싱하고, 인식하지 못하는 리더는 이를 무시하고 건너뜁니다. 이것이 하위 호환성을 보장하는 방식이며, Excel 2007에서 스파크라인 통합 문서를 열었을 때 글리프 표시를 생략한 채 원본 수치 데이터만 깔끔하게 보여주는 이유입니다

이 메커니즘의 한 가지 세부 사항은 일반적인 가정과 배치되므로 짚고 넘어갈 만합니다: 즉, 워크시트 루트 요소에 mc:Ignorable 선언이 필요하지 않다는 점입니다. ext GUID 필터 자체로 충분하며, Excel의 작성기 모듈도 루트를 변경하는 대신 <ext> 요소 내에 로컬로 x14 네임스페이스를 선언합니다. HotXLS도 동일한 패턴을 따르므로 워크시트 XML의 다른 부분을 변경하지 않고 그대로 유지합니다. 이것이 실제 차트와의 구조적 차이점입니다: 차트는 연관 기사인 차트, 이미지 및 드로잉 문서에서 설명한 대로 독자적인 렌더링 파이프라인을 가진 별도의 DrawingML 파트인 반면, 스파크라인은 스프레드시트 격자 그리드 자체가 직접 드로잉하는 워크시트 메타데이터에 해당합니다

프로그래밍 방식으로 XLSX 파일에 스파크라인을 추가하는 방법

TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation)는 한 번의 호출로 이 작업을 처리합니다: 지정된 유형의 그룹을 생성하고 Excel의 기본 계열 색상을 지정한 다음, 시트 이름이 명시된 원본 범위와 호스트 셀을 매핑하는 첫 번째 스파크라인을 추가합니다. 반환된 TXLSXSparklineGroup 객체는 이후 Add 메서드를 통해 행당 하나의 F/Sqref 쌍으로 더 많은 스파크라인을 수용할 수 있으며, 이들은 모두 그룹의 유형과 서식 옵션을 공유합니다. 대시보드를 구축하는 경우 이는 정확히 필요한 형태가 됩니다: 단 하나의 그룹과 한 세트의 비주얼 옵션으로 수백 개의 멤버 셀을 제어할 수 있습니다

var
  Book: TXLSXWorkbook;
  Sheet: TXLSXWorksheet;
  Grp: TXLSXSparklineGroup;
  Row: Integer;
begin
  Book := TXLSXWorkbook.Create;
  try
    Book.Open('dashboard.xlsx');
    Sheet := Book.Sheets[0];

    // One group: every product row shares type and formatting
    Grp := Sheet.AddSparklineGroup(xlsxSparklineLine,
      'Sheet1!B2:M2', 'N2');
    for Row := 3 to 201 do
      Grp.Add(Format('Sheet1!B%d:M%d', [Row, Row]),
        Format('N%d', [Row]));

    Book.SaveAs('dashboard-trends.xlsx');
  finally
    Book.Free;
  end;
end;

TXLSXSparklineType은 Excel이 제공하는 세 가지 유형을 커버합니다: 추세선을 위한 xlsxSparklineLine, 소형 막대형 차트인 xlsxSparklineColumn, 그리고 모든 값이 위 또는 아래 방향 블록으로 렌더링되는 승패형 스트립인 xlsxSparklineStacked입니다. 개별 스파크라인 멤버는 시트 이름이 붙은 원본 범위 F와 글리프가 드로잉될 대상 셀 Sqref라는 두 개의 문자열로만 구성되므로, 행마다 추가로 구성할 사항이 없습니다. 기본 템플릿 대신 빈 그룹에서 시작하고 싶은 경우에는 Worksheet.SparklineGroups 컬렉션을 통해 그룹을 완전히 수동으로 빌드할 수도 있습니다

스마트 모델의 마커, 색상 슬롯 및 축 스케일링

TXLSXSparklineGroup은 Excel의 스파크라인 도구 리본 메뉴에 있는 전체 옵션 세트를 일반 속성(property)으로 노출합니다. 6가지 부울(boolean) 토글을 통해 데이터 포인트를 강조할 수 있습니다: 꺾은선형 스파크라인의 모든 포인트에 마커를 달기 위한 Markers와 함께 HighPoint(높은 점), LowPoint(낮은 점), NegativePoints(음수 점), FirstPoint(첫 점), LastPoint(마지막 점)입니다. 이들과 짝을 이루는 8가지 ARGB 색상 슬롯도 존재합니다 — ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow — 이 슬롯들은 0으로 설정하면 파일 기록 시 생략되어 Excel이 자체 기본값을 적용하도록 처리합니다. 라이브러리 전반에 동일한 불투명 ARGB 형식이 사용되므로, 여기서 $FFD00000 색상은 조건부 서식 스타일에서와 동일한 빨간색을 의미합니다

Grp := Sheet.AddSparklineGroup(xlsxSparklineStacked,
  'Sheet1!B2:M2', 'N2');
Grp.NegativePoints := True;          // losing months stand out
Grp.ColorNegative := $FFD00000;
Grp.HighPoint := True;
Grp.ColorHigh := $FF00B050;
Grp.MinAxisType := xlsxSparklineAxisGroup;   // one scale for all rows
Grp.MaxAxisType := xlsxSparklineAxisGroup;
Grp.DisplayEmptyCellsAs := xlsxSparklineEmptyGap;

축(axis) 속성은 기본값을 그대로 적용하기 전에 신중히 검토해 볼 가치가 있습니다. MinAxisTypeMaxAxisType은 각각 개별(individual), 그룹(group) 또는 사용자 정의(custom) 스케일링을 수용합니다: 개별로 설정하면 각 스파크라인이 자체 최솟값 및 최댓값에 맞춰 늘어나므로, 99와 101 사이를 미세하게 진동하는 행이 값이 3배 상승하는 행만큼이나 극적으로 나타나 보일 수 있습니다. 그룹 스케일링으로 지정하면 모든 멤버가 하나의 공유 수직 축 스케일링을 사용하므로, 글리프 높이가 모든 행에서 동일한 물리적 수량을 의미하게 되어 비교 분석용 대시보드 구축 시 유용합니다. DisplayEmptyCellsAs는 빈 원본 셀이 꺾은선형 차트에서 어떻게 그려질지 결정합니다: 공백으로 남기기, 0으로 간주하기, 혹은 이웃 포인트들을 서로 연결해 그리기로 구성할 수 있습니다

저장 시 HotXLS가 워크시트 extLst에 작성하는 데이터

저장 시 HotXLS는 각 그룹을 유형 및 토글 속성, 하위 요소로서의 색상 슬롯 정보, 그리고 xm:f 범위 수식과 xm:sqref 호스트 셀이 한 쌍으로 이루어진 x14:sparklines 목록을 갖는 x14:sparklineGroup 요소로 직렬화합니다. 이 구조 전체는 Excel이 기록하는 양식 그대로 워크시트 파트 하단의 <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> 내부에 위치하며, 블록 상에 x14 네임스페이스가 직접 선언됩니다. 스파크라인 그룹이 없는 워크시트는 extLst를 전혀 생성하지 않으므로, 이 기능을 전혀 쓰지 않는 파일들은 이전 버전의 HotXLS가 생성한 결과물과 바이트 단위로 정확히 일치하여 출력되며, 이는 손실 없는 라운드 트립 인프라 기사에서 설명한 보수적인 작성 규칙과 맥을 같이 합니다

하나의 스펙 상세 정보는 출력물 스펙을 Excel이 생성한 것과 비교하거나 XML을 수동으로 점검하려 한다면 한 가지 사양 세부 정보가 유용합니다: 즉 lineWeight의 스키마 기본값은 일부 외부 자료에 표기된 1.25가 아닌 0.75 포인트라는 점입니다 — [MS-XLSX] 문서에서도 Excel UI가 실제로 적용하는 굵기와 일치하게 CT_SparklineGroup@lineWeight의 기본값을 0.75로 정의하고 있습니다. HotXLS는 생략 시 기본값 자동 적용 방식을 채택합니다: LineWeight를 0.75 이외의 값으로 명시하면 해당 속성이 작성되고, 0.75로 그대로 두면 작성하지 않고 생략합니다. 이 값을 잘못 다루면 Excel에서 저장한 문서와 비교해 렌더링 굵기가 아주 미세하게 두껍거나 얇게 나타나는 현상이 발생합니다

라운드 트립, 시트 복사 및 HotXLS가 모델링하지 않는 확장 요소 처리

파일을 여는 동작은 저장 동작의 정확한 대칭 형태입니다. HotXLS가 작성한 파일이든 Excel이 작성한 파일이든 스파크라인을 포함하는 통합 문서를 열면, 파서가 스파크라인 ext GUID를 감지하고 형식 모델 내부로 모든 그룹, 멤버, 색상 및 축 옵션을 재구축하므로 열기→편집→저장 과정에서 이들이 온전히 보존됩니다. 워크시트를 다른 통합 문서로 복사하면 시트의 다른 구성 요소와 함께 스파크라인 그룹도 복제되므로 템플릿 기반의 보고서 생성 작업을 매우 직관적으로 수행할 수 있습니다: 즉, 스타일이 잡힌 템플릿 시트를 준비해 두고 이를 보고서마다 복사한 뒤 원본 범위 정보만 갱신해 주면 됩니다

또한 extLst는 HotXLS에 구체적인 전용 모델이 마련되지 않은 다른 확장 블록들을 포함할 수 있습니다 — 예를 들어 Excel은 슬라이서(slicers) 및 확장 조건부 서식과 같은 기능들을 위한 x14 블록들을 동일한 목록에 기록합니다. v2.131.0부터 이러한 타사 확장 블록들은 폐기되지 않고 라운드 트립 과정에서 원형 그대로 보존됩니다: 파서가 이를 캡처하여 Worksheet.RawWorksheetExts를 통해 읽기 전용으로 노출하고 저장 시 그대로 작성하며, 시트를 다른 문서로 복사할 때 함께 전달됩니다. 보존된 XML은 파서 이벤트를 토대로 재구성되므로 원래 파일과 완전히 바이트 단위로 동일하진 않지만 의미론적으로 동등한 구조를 띠어, Excel에서 로드할 때 문제가 없고 기능들이 정상적으로 유지됩니다. 이는 프로덕션 환경에서 매우 큰 이점입니다: 즉 고객이 제공한 통합 문서를 열어 수정한 후 다시 저장해도, HotXLS가 내부적으로 파싱하지 않는 다른 확장 기능 정보들이 유실되지 않습니다

명확한 기술적 한계: 스파크라인은 Excel 2010 이상 버전 및 x14 확장을 구현하는 다른 리더 프로그램에서만 렌더링됩니다; Excel 2007에서는 글리프 표현 없이 일반 수치 데이터만 노출되며, 이는 포맷 규격 설계 시 호환성 확보를 위해 의도된 사양입니다. 세 가지 스파크라인 유형, 8가지 색상 슬롯, 포인트 강조 토글 및 3가지 축 스케일링 옵션은 Excel UI 다이얼로그가 제공하는 전체 기능 범위를 포함합니다. 스파크라인 지원 기능은 본문에 소개된 XLSX 엔진 사양과 함께 Delphi 및 C++Builder용 HotXLS Delphi Excel Component 제품의 기본 구성으로 탑재되어 제공됩니다