Teknik Makale

Delphi'de Excel Sparkline'ları: HotXLS ve x14 Uzantısı

HotXLS, Excel'in tek bir hücre içinde çizdiği mini grafikler olan Excel Sparkline'larını (mini grafikler), Delphi ve C++Builder'dan tek bir çağrıyla oluşturur: TXLSXWorksheet.AddSparklineGroup bir veri aralığı üzerinde bir sparkline grubu oluşturur ve çalışma kitabını kaydetmek, bunu çalışma sayfası extLst'si içinde Excel 2010 ve sonrasının işlediği, eski okuyucuların ise şikayet etmeden atladığı bir x14 uzantı bloğu olarak yazar. Grafik nesnesi yok, çizim parçası yok, çapa yok

Sparkline'lara sahip olmayı değerli kılan senaryo her zaman aynıdır. Bir gösterge paneli (dashboard) çalışma kitabı, ürün, bölge veya hesap başına bir tane olmak üzere birkaç yüz satır taşır; her birinde on ikişer aylık rakamlar vardır ve birisi her satırın sonunda bir trend sembolü istemektedir. Bunu gerçek grafiklerle modellediğinizde, her biri kendi XML parçasına, ilişkisine ve çapa geometrisine sahip yüzlerce DrawingML grafik parçası oluşturursunuz; bunun dosya boyutuna ve açılma süresine ne yapacağından bahsetmiyor bile. Bir sparkline grubu, sahip olduğunuz satır sayısı kadar ucuza tekrarlanan, "B2:M2'den N2'ye ve B3:M3'ten N3'ye küçük bir çizgi çiz" diyen tek bir XML bloğudur

Sparkline'lar neden grafik yerine bir x14 uzantısıdır?

Sparkline'lar Excel 2010 ile, ECMA-376 temel şemasının dondurulmasından üç yıl sonra geldi, bu nedenle mevcut her okuyucuyu bozmadan çalışma sayfası işaretlemesinin içinde yaşayamazlardı. Microsoft'un yanıtı uzantı listesi (extension list) mekanizmasıdır: Bir çalışma sayfası, her biri özelliği tanımlayan bir URI ile etiketlenmiş <ext> bloklarını barındıran bir <extLst> öğesiyle sona erebilir ([MS-XLSX] §2.3.6). Sparkline'lar {05C60535-1F16-4fd2-B633-F4F36F0B64E0} URI'sini ve x14 ad alanını kullanır. GUID'i tanıyan bir okuyucu bloğu ayrıştırır; tanımayan bir okuyucunun ise onu atlaması gerekir. İleriye dönük uyumluluk hikayesinin tamamı budur ve Excel 2007'nin bir sparkline çalışma kitabını sorunsuz açmasının nedeni de budur — kaynak sayıları glifler olmadan gösterir

Mekanizmanın bir ayrıntısını belirtmeye değer çünkü yaygın bir varsayımla çelişir: Çalışma sayfası kökünde hiçbir mc:Ignorable bildirimi gerekmez. ext GUID kapısı tek başına yeterlidir ve Excel'in kendi yazıcısı, köke dokunmak yerine x14 ad alanını yerel olarak <ext> öğesinde bildirir. HotXLS de aynı kalıbı izler, bu da çalışma sayfası XML'inin geri kalanını dokunulmamış halde tutar. Gerçek grafiklerden yapısal farkı da budur: Bir grafik, grafikler, resimler ve çizimler hakkındaki eşlik eden makalede ele alınan, kendi oluşturma süreç hattına sahip ayrı bir DrawingML parçasıyken; sparkline, elektronik tablo ızgarasının kendisinin boyadığı çalışma sayfası meta verisidir

Programlı olarak bir XLSX dosyasına sparkline nasıl eklersiniz?

TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) tek çağrılık yoldur: Verilen türde bir grup oluşturur, onu Excel'in varsayılan seriler rengiyle besler ve sayfa nitelikli (sheet-qualified) bir kaynak aralığını bir ana hücreye eşleyen ilk sparkline'ı ekler. Döndürülen TXLSXSparklineGroup daha sonra Add yöntemi aracılığıyla satır başına bir F/Sqref çifti olmak üzere, hepsi grubun türünü ve biçimlendirmesini paylaşan daha fazla sparkline kabul eder. Gösterge paneli senaryosu için bu tam olarak istediğiniz şekildir: Bir grup, bir set görsel seçenek, yüzlerce üye

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

    // Tek bir grup: Her ürün satırı tür ve biçimlendirmeyi paylaşır
    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'in sunduğu üç türü kapsar: Trend çizgileri için xlsxSparklineLine, küçük çubuk grafikler için xlsxSparklineColumn ve her değerin yukarı veya aşağı bir blok olarak oluşturulduğu kazanç/kayıp şeritleri için xlsxSparklineStacked. Her üye sparkline yalnızca iki dizeden ibarettir — F (sayfa nitelikli kaynak aralığı) ve Sqref (sembolün çizildiği hücre); dolayısıyla satır başına yapılandırılacak başka bir şey yoktur. Gruplar, tohumlanmış varsayılan yerine boş bir gruptan başlamak istediğinizde, doğrudan Worksheet.SparklineGroups koleksiyonu aracılığıyla tamamen elle de oluşturulabilir

Türlendirilmiş modelde işaretleyiciler, renk yuvaları ve eksen ölçeklendirme

TXLSXSparklineGroup, Excel'in Sparkline Araçları şeridindeki tam seçenek setini düz özellikler olarak sunar. Altı boolean anahtarı veri noktalarını vurgular: Çizgi sparkline üzerindeki her nokta için Markers, artı HighPoint, LowPoint, NegativePoints, FirstPoint ve LastPoint. Sekiz ARGB renk yuvası onlarla eşleşir — ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow — 0'da bırakılan bir yuvanın dosyadan çıkarıldığı ve Excel'in kendi varsayılanını uyguladığı kuralıyla. Aynı tamamen opak ARGB biçimi kütüphane genelinde görünür, bu nedenle buradaki $FFD00000, koşullu biçimlendirme stillerinde ifade ettiği aynı kırmızı anlamına gelir

Grp := Sheet.AddSparklineGroup(xlsxSparklineStacked,
  'Sheet1!B2:M2', 'N2');
Grp.NegativePoints := True;          // kaybedilen aylar öne çıksın
Grp.ColorNegative := $FFD00000;
Grp.HighPoint := True;
Grp.ColorHigh := $FF00B050;
Grp.MinAxisType := xlsxSparklineAxisGroup;   // tüm satırlar için tek bir ölçek
Grp.MaxAxisType := xlsxSparklineAxisGroup;
Grp.DisplayEmptyCellsAs := xlsxSparklineEmptyGap;

Eksen özellikleri, varsayılanları kabul etmeden önce üzerinde biraz düşünmeyi hak eder. MinAxisType and MaxAxisType her biri bireysel, grup veya özel ölçeklendirme alır: Bireysel, her sparkline'ı kendi minimum ve maksimumuna esnetir; bu da 99 ile 101 arasında dalgalanan bir satırın, üç katına çıkan bir satır kadar dramatik görünmesini sağlar. Grup ölçeklendirmesi her üyeyi paylaşılan tek bir dikey ölçeğe yerleştirir, böylece sembol yüksekliği her satırda aynı miktarı ifade eder — genellikle karşılaştırmalı bir gösterge panelinin istediği şey budur. DisplayEmptyCellsAs boş bir kaynak hücrenin çizgiye ne yapacağına karar verir: Boşluk bırak, sıfır say veya komşularını bağlayarak boşluğu köprüle

HotXLS kaydetme sırasında çalışma sayfası extLst içine ne yazar?

Kaydetme sırasında HotXLS, her grubu türü ve anahtar niteliklerini taşıyan bir x14:sparklineGroup öğesi, çocuk öğeler olarak renk yuvalarını ve üyeleri bir xm:f aralık formülünü bir xm:sqref ana hücresiyle eşleştiren bir x14:sparklines listesi olarak serileştirir. Tüm yapı, tam olarak Excel'in yazdığı gibi, blok üzerinde doğrudan beyan edilen x14 ad alanıyla, çalışma sayfası parçasının sonundaki <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> içinde yer alır. Hiçbir sparkline grubu içermeyen bir çalışma sayfası hiçbir extLst yaymaz, böylece bu özelliği hiç kullanmamış dosyalar, önceki HotXLS sürümlerinin ürettiğiyle bayt bayt aynı şekilde çıkar — kayıpsız gidiş-dönüş altyapısı hakkındaki makalede açıklanan muhafazakar yazıcı disiplini

Çıktıyı hiçbir zaman Excel'inkiyle karşılaştırırsanız veya XML'i elle kontrol ederseniz bir spesifikasyon ayrıntısı önemlidir: lineWeight için şema varsayılanı 0.75 puandır, bazı ikincil kaynakların belirttiği 1.25 değil — [MS-XLSX] CT_SparklineGroup@lineWeight özniteliğini varsayılanı 0.75 olarak tanımlar ki bu da Excel'in kullanıcı arayüzünün gerçekte uyguladığı kalınlıkla eşleşir. HotXLS varsayılana atlayarak uyar: LineWeight değerini 0.75 dışında bir şeye ayarlayın ve öznitelik yazılsın, 0.75'te bırakın ve yazılmasın. Bunu herhangi bir yönde yanlış yapmak, Excel'den kaydedilen aynı çalışma kitabından biraz daha kalın veya daha hafif görünen dosyalar üretir

Gidiş-dönüşler, sayfa kopyaları ve HotXLS'in modellemediği uzantılar

Açılış, kaydetmenin ayna görüntüdür. HotXLS, sparkline taşıyan bir çalışma kitabını açtığında — ister HotXLS ister Excel yazmış olsun — ayrıştırıcı, sparkline ext GUID'i üzerinde kapılaner ve her grubu, üyeyi, rengi ve eksen seçeneğini türlendirilmiş modelde yeniden oluşturur; böylece bir açma→düzenleme→kaydetme döngüsü bunları tamamen korur. Bir çalışma sayfasını başka bir çalışma kitabına kopyalamak, sparkline gruplarını sayfanın geri kalanıyla birlikte kopyalar; bu da şablon odaklı rapor oluşturmayı kolaylaştırır: Stil verilmiş bir şablon sayfasını saklayın, rapor başına kopyalayın ve aralıkları yeniden hedefleyin

extLst, HotXLS'in türlendirilmiş hiçbir modeline sahip olmadığı uzantı bloklarını da içerebilir — Excel dilimleyiciler (slicers) ve genişletilmiş koşullu biçimlendirme gibi özellikler için x14 bloklarını aynı listeye yazar. v2.131.0'dan bu yana bu yabancı bloklar bir gidiş-dönüş sırasında düşürülmek yerine aynen korunur: Ayrıştırıcı bunları yakalar, Worksheet.RawWorksheetExts aracılığıyla salt okunur olarak sunar ve kaydederken geri yazar; ve başka bir çalışma kitabına kopyalandığında bir sayfayla birlikte seyahat ederler. Korunan XML, ayrıştırıcı olaylarından yeniden yapılandırılır, bu nedenle bayt olarak özdeş olmaktan ziyade anlamsal olarak orijinaline eşdeğerdir, ancak Excel bunu kabul eder ve özellikler hayatta kalır. Pratik sonuç, üretimde önemli olandır: Bir müşterinin çalışma kitabını açıp yeniden kaydetmek, artık HotXLS'ten anlamasını istemediğiniz uzantıları soyup atmaz

Dürüst sınır çizgisi: Sparkline'lar Excel 2010 ve sonrasında ve x14 uzantısını uygulayan diğer tüm okuyucularda işlenir; Excel 2007, verileri glifler olmadan gösterir ki bu da biçimin sahip olması için tasarlandığı aşamalı düşüştür (degradation). Üç sparkline türü, sekiz renk yuvası, nokta anahtarları ve üç eksen modu, Excel'in kendi iletişim kutusunun sunduğu tam seçenek yüzeyini kapsar. Sparkline desteği, burada gösterilen XLSX motorunun geri kalanıyla birlikte, Delphi ve C++Builder için HotXLS Delphi Excel Bileşeni ile birlikte gönderilir