Teknik Makale

HotXLS ile ChartML'i Kaybetmeden Excel Grafiklerini Düzenleme

HotXLS içe aktarılan bir Excel grafiğinin özgün ChartML'ini tutar ve türlü modelde hiçbir şey değişmediğinde onu bayt bayt yeniden oynatır, dolayısıyla bir çalışma kitabını açıp yeniden kaydetmek, nesne modelinin temsil etmediği grafik parçalarını sessizce soymaz. Bir başlığı, seriyi veya ekseni düzenleyin ve HotXLS grafiği baştan yeniden üretmek yerine yeni türlü düğümleri özgün ağaca yapısal olarak birleştirir

O ayrım; dokunulmadığında yeniden oynat, düzenlendiğinde birleştir; bir Delphi uygulamasını bir analistin Excel'de inşa ettiği grafiklere güvenle doğrultmayı mümkün kılan şeydir. Bir grafiği türlü modelden yeniden üretmek her zaman modelin bilmediği her neyse onu kaybeder ve Excel grafikleri bir kitaplığın bilmediği şeylerle doludur: özel stiller, uzantı listeleri, alternatif içerik dalları, eklentilerden ad alanı nitelikli biçimlendirme

Bir çalışma kitabını yeniden kaydetmek grafiklerini neden düzleştirir?

Çünkü her zamanki uygulama anladığını okur ve anladığını yazar. Aradaki her şey; daha yeni bir Excel yapısından bir extLst, bir mc:AlternateContent dalı, modelin özelliği olmayan bir şekil efekti; dosyada mevcuttur, nesne modelinde yeri yoktur ve kaydetme anında kaybolur. Kullanıcı gradyanını, özel veri etiketlerini veya 3B efektini kaybetmiş bir grafik görür ve çalışma kitabı nedenini açıklayamaz

Çalışma kitabında PreserveUnsupportedParts etkinleştirildiğinde, HotXLS içe aktarım sırasında özgün UTF-8 grafik baytlarını uzunluk ve modellenmiş içeriğin 64 bitlik parmak iziyle birlikte depolar. Tür modeli kaydetme zamanına kadar değişmemişse, özgün baytları geri yazar. XML yeniden sıralaması yok, boşluk kayması yok, kimsenin düzenlemediği bir grafik için bellekte asılı duran resident UTF-16 grafik kopyası yok

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;

Birleştirmenin tuttuğu ve modelin sahip olduğu

Kural sahipliktir. Genel model düğümleri (başlık, seri, önbellekler, çizim grupları, eksenler) yeni üretilen ağaç tarafından kararlaştırılır. Modellenmemiş alt ağaçlar özgün cal taşınır. Bu asimetri kasıtlıdır ve özümsenmesi biraz zaman alan kısımdır: bir seriyi silmek korunan XML'den eski seriyi diriltmemelidir, dolayısıyla modelin sahip olduğu her şey model "yok" dediğinde bile modelden alınır

Sahipsiz içerik oturduğu eşleşmiş düğümlerin yanına yeniden yerleştirilir ve extLst üst öğesi içinde son kalır çünkü şema onu orada ister. Bilinen bir özelliği temizlemek (bir kalın bayrağını kaldırmak, bir rengi bırakmak) bir boşluk olarak değil bir temizleme olarak ele alınır; özgün ağaçtan doldurulacak bir boşluk olarak değil. Aynı komşuluktaki bilinmeyen öznitelikler yerlerini korur

İşaretleme uyumluluğu içeriği özel işleme alır. Ayrıştırmada HotXLS mc:Choice'u atlar ve mc:Fallback'i okur; bu geri dönüş dalı modelin bildiği bir çizim grubunu sarıyorsa, birleştirme yeni türlü içeriği geri dönüş alt ağacına geri yazar. Bu adım olmadan kaydetme yeni çizim grubunu yayar ve eskisini geri dönüşün içinde bırakır ve grafik iki tane taşırdı

Bir grafiği devre dışı bırakma

ClearPreservedXml bir grafiğin özgün XML'ini ve parmak izini bırakır, dolayısıyla bir sonraki kaydetme o grafiği tamamen türlü modelden yeniden inşa eder. Bu grafik başına bir karardır; çalışma kitabı düzeyindeki PreserveUnsupportedParts koruma durumunun içe aktarımda inşa edilip edilmediğini yine de yönetir

Gerçek bir grafik yerine temiz bir grafik istediğinizde ona uzanın; örneğin bir şablon grafik eski kurumsal temadan biçimlendirme taşıyorsa ve işlemin amacı onu atmaksa. Hata ayıklama refleksi olarak ona uzanmayın: bir düzenlemeden sonra yanlış işlenen bir grafik çoğunlukla bir koruma değil modelleme sorusudur ve korunan XML'i temizlemek kanıtı yok eder

Kombinasyon grafikleri ve ikinci eksen

AddPlotGroup sıralı kombinasyon grafikleri inşa eder; her çizim grubu kendi grafik ailesini ve kendi birincil veya ikincil eksen atamasını korur. Yaygın iş grafiğinin ihtiyaç duyduğu şey budur: birincil eksen üzerinde sütun olarak gelir, sağda bir çizgi olarak kar marjı yüzdesi

Grafikler birincil ve ikincil kategori ve değer eksenleri artı bir seri eksenini ortaya koyar; konumları, tanımlayıcıları, kesişmeleri, tarih birimleri, etiket aralıkları ve görünürlüğü kapsayan türlü kategori, değer, tarih ve seri ekseni ayarlarıyla. Eski düz API; ChartType, AddSeries, düz Series koleksiyonu; yine de birincil çizim grubunu adresler, dolayısıyla alttaki model her sıralı grubu tutarken var olan kod çalışmaya devam eder

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;

Bu model var olmadan önce bir kombinasyon grafiğini açıp yeniden kaydetmek onu tek bir grafik ailesine çökertir ve ikincil, tarih ve seri eksenlerini kaybederdi. Grafik formül başvuruları ve önbelleğe alınmış seri değerleri artık çalışma kitabı kopyalarını ve açma/kaydetme döngülerini de atlatır ve grafik bağlayıcıları ilişki tanımlayıcısıyla grafik parçalarıyla eşleşir; dolayısıyla ilişki girdilerini yeniden sıralayan bir uygulama grafik içeriklerini artık çalışma sayfası konumları arasında değiştirmez

Elle düzen tuzağı

Bir çizim alanını, başlığı, eksen başlığını veya açıklamayı elle konumlandırıyorsanız, dört koordinatın tamamını yazın. Office, x, y, w ve h'den herhangi biri mevcut olduğunda onların tam bir grup olarak ister ve aksi hâlde tüm manualLayout'ı yok sayar. HotXLS bu nedenden dolayı her zaman tam dikdörtgeni yayar ve SetPositionAndSize onu tek bir çağrıda ayarlar ve etkinleştirir

Belirtiminin tam esnekliği yerine Excel'i izleyen iki ayrıntı daha vardır. Konum xMode ve yMode edge'e ayarlanarak yazılırken boyut wMode ve hMode için factor kullanır, çünkü Excel'in yazdığı ve diğer kombinasyonları dönüştürdüğü şey budur. Ve layoutTarget yalnızca çizim alanı için yayılır, hiçbir zaman başlıklar veya açıklamalar için, Microsoft uygulama notlarının onu yasakladığı yerlerde

Bir çalışma kitabı gidiş-dönüşüne oturtmak

Grafik koruma genel politikanın bir örneğidir: başka yerde yazılmış belgeleri düzenleyen bir kitaplık, kendisinden istenen değişikliği ve başka hiçbir şeyi değiştirmelidir. Aynı akıl yürütme HotXLS'i temalar, hesaplama zincirleri ve çalışma sayfası uzantıları üzerinde yönlendirir; tema, extLst ve calcChain için kayıpsız gidiş-dönüşler notlarında ve VBA ve dış bağlantıları koruma'da açıklanmıştır. Grafik yazma yüzeyinin kendisi için; grafikler oluşturma, görüntüleri ve çizimleri Delphi'den yerleştirme; HotXLS'te grafikler, görüntüler ve çizimler yazısına bakın

HotXLS, XLSX grafiklerini makinede Excel kurulumu olmaksızın yerel Delphi ve C++Builder kodundan okur, düzenler ve yazar; bu da doğruluğu bir otomasyon sorunu yerine bir kitaplık sorunu yapan şeydir; HotXLS elektronik tablo bileşeni sayfası grafik özellik listesini ve bir deneme indirmesini içerir