Teknik Makale

HotXLS ile Delphi'de Excel Yapılandırılmış Tablo Başvuruları

HotXLS artık yapılandırılmış tablo başvurularını değerlendiriyor; bu yüzden =SUM(Table1[Amount]) atlanmak yerine bir sayı üretir. Çözümleyici Table[Column], Table[[Column]], Table[[Q1]:[Q4]] gibi sütun aralıklarını ve [#Data], [#All], [#Headers] ile [#Totals] öge belirteçlerini ele alır; her birini ayrıştırma anında çalışma kitabının tablo modeline karşı çözer ve orijinal formül metni birebir geri yazılır

Bir biçim bilinçli olarak eksik bırakılmıştır ve insanların ilk karşılaştığı biçim de odur. Geçerli satır kısayolu [@Column] desteklenmez; bunun kör kör çevresinden dolaşmak yerine anlaşılmaya değer yapısal bir nedeni vardır

Yapılandırılmış bir başvuru neden dostane adlı bir aralıktan ibaret değildir?

Çünkü tanımlı bir ad bir adresi dondurur, bir tablo başvurusu ise dondurmaz. DataBlock'u Sheet1!$A$2:$D$100'ü gösteren bir ad olarak yazın; bir şey onu yeniden yazana kadar o dikdörtgen olarak kalır. Sales[Amount] yazın ve bu, "Sales tablosunun Amount sütunu" anlamına gelir; o tablonun kapsamı formül değerlendirildiği anda ne ise o. Tabloya yirmi satır ekleyin, toplam onları da kapsar; ayarlanacak bir başvuru yoktur çünkü formülde baştan beri bir adres yoktur

Bu sembolik nitelik, tam olarak başvurunun neden dize ikamesiyle çözülemeyeceğinin nedenidir. Çözümleyicinin tabloyu çalışma kitabında adına göre bulması, sütunu başlık metnine göre araması, istenen öge belirtecinin hangi satırları kapsadığına karar vermesi ve somut bir dikdörtgen üretmesi gerekir. HotXLS bunu formül derlemesi sırasında tablo modeli üzerinden yapar; bu yüzden tablo büyümeden önce yazılmış bir formül hâlâ tablonun geçerli kapsamına karşı değerlendirilir

HotXLS'in çözdüğü dilbilgisi

Desteklenen belirteç dilbilgisi, tek bir dikdörtgen sonuç üreten kümeyi kapsar ve bunu kesin olarak belirtmeye değer, çünkü Excel'in belgeleri çoğu motorun uyguladığından çok daha geniş bir yüzey sunar. HotXLS, [Col]'u ve köşeli parantezli varyant [[Col]]'u, çıplak öge belirteçleri [#Data], [#All], [#Headers] ve [#Totals]'ı, birleşik biçim [[#Data],[Col]]'u, bir öge belirteci içindeki bir aralığı [[#Data],[Col1]:[Col2]] olarak ve sade bir aralığı [Col1]:[Col2] olarak kabul eder

Bu kümenin size verdiği, tek bir bitişik blok üreten her başvuru biçimidir: bir sütun, bitişik sütunlardan bir dizi, her ikisinin de yalnızca gövde ya da başlık dahil bir dilimi. Bitişik olmayan birleşimler ve çok alanlı sonuçlar bunun dışındadır. Bir başvuru çözülemediğinde, formül bir tahmin ikame etmek yerine önceki değersiz atlama davranışını korur; bu yüzden çözülemeyen bir başvuru asla inandırıcı yanlış bir sayıya dönüşmez

var
  Book: TXLSXWorkbook;
  Sheet: TXLSXWorksheet;
  Cols: TStringList;
begin
  Book := TXLSXWorkbook.Create;
  Cols := TStringList.Create;
  try
    Sheet := Book.Sheets.Add('Sales');
    Cols.Add('Region');
    Cols.Add('Q1');
    Cols.Add('Q2');
    Cols.Add('Amount');
    Sheet.Tables.Add('SalesTable', 'A1:D25', Cols);
    // ... başlık satırını ve 24 veri satırını yaz ...

    Sheet.Cells[27, 4].Formula := 'SUM(SalesTable[Amount])';
    Sheet.Cells[28, 4].Formula := 'SUM(SalesTable[[Q1]:[Q2]])';
    Sheet.Cells[29, 4].Formula := 'COUNTA(SalesTable[[#Data],[Region]])';
    Sheet.Cells[30, 4].Formula := 'ROWS(SalesTable[#All])';

    Book.Recalculate;
    Book.SaveAs('sales.xlsx');
  finally
    Cols.Free;
    Book.Free;
  end;
end;

Geçerli satır biçimi neden bilinçli olarak dışlanmıştır?

[@Column] ve [#This Row], "bu formülün yaşadığı satırda o sütunun hücresi" anlamına gelir. Değer bu yüzden yalnızca tabloya değil, değerlendirilen hücrenin konumuna da bağlıdır. Bu farklı bir başvuru türüdür: derleyicinin bir kez çözebileceği bir dikdörtgen değil, formülün bulunduğu her satır için yeniden yapılması gereken hücre başına bir çözümlemedir

HotXLS, bu biçimler için tablo aralığı çözümleyicisinden False döndürür ve bu, onları değersiz atlama yoluna yönlendirir. Formül metni korunur ve değişmeden geri yazılır; bu yüzden [@Amount] kullanan bir çalışma kitabı, uygulamanızdan bir gidiş-dönüşten sonra Excel'de doğru açılır; yalnızca HotXLS'in hesapladığı değer eksiktir. Yokluk ile yanlış satıra karşı hesaplanmış bir değer arasındaki seçimde, yokluk tespit edebileceğiniz olandır

Pratik geçici çözüm mekaniktir: sizin ürettiğiniz bir çalışma kitabında, zaten Excel'in tablo kapsamlı mantığın büyük bir kısmı için dahili olarak sakladığı eşdeğer A1 stili göreli başvuruyu yazın. Yalnızca işlediğiniz bir çalışma kitabında ise formülü olduğu gibi bırakın ve Excel'in zaten sakladığı önbelleğe alınmış değeri okuyun; bir yükle-ve-raporla hattının genellikle istediği de budur

var
  Book: TXLSXWorkbook;
  Sheet: TXLSXWorksheet;
  Table: TXLSXTable;
  Row: Integer;
begin
  Book := TXLSXWorkbook.Create;
  try
    if Book.Open('sales.xlsx') <> 1 then Exit;
    Sheet := Book.Sheets[1];

    Table := Sheet.Tables.FindByName('SalesTable');
    if Table <> nil then
    begin
      // Tablo gövdesi üzerinde kayıt kümesi tarzı arama, 1 tabanlı satır sonucu
      Row := Table.FindFirst(Sheet, 'Region', 'EMEA');
      while Row > 0 do
      begin
        Log(VarToStr(Sheet.Cells[Row, 4].Value));
        Row := Table.FindNext(Sheet, 'Region', 'EMEA', Row);
      end;
    end;
  finally
    Book.Free;
  end;
end;

Tablo şekil değiştirdiğinde ne olur

Yapılandırılmış başvurular, adlandırdıkları şey ortadan kalktığında sessizce yeniden işaret etmek yerine geçersiz kılınır. Bir sütunu silin; o sütuna başvuran formüller, Excel'in onları geçersiz kıldığı şekilde geçersiz kılınır. Tabloyu silin ya da yeniden adlandırın; ona yapılan başvurular da aynı şekilde ele alınır. Bu doğru davranıştır ve ekleme ve silmede formül başvurusu düzeltmesinde anlatılan olağan başvuru ayarlamasını yansıtır; motorun işi, formülleri geçerli görünür tutmak değil dürüst tutmaktır

Satır büyümesi ise tam tersi bir durumdur ve hiçbir ayarlama gerektirmez. Başvuru bir dikdörtgeni değil tabloyu adlandırdığı için, tablonun aralığı içine satır eklemek tek bir formüle dokunmadan [#Data]'nın kapsadığını genişletir. Tabloları bir rapor şablonunda kullanmaya değer kılan özellik de budur: toplamlar satırı, içe aktarım kaç satır ürettiyse hepsini toplamaya devam eder

Geri yazma disiplini

HotXLS orijinal formül metnini korur. SUM(SalesTable[Amount]) ile yüklenen bir çalışma kitabı, çözülmüş SUM(D2:D25) ile değil SUM(SalesTable[Amount]) ile kaydedilir. Bu göründüğünden daha önemlidir: çıktınızı Excel'de açan bir kullanıcı, yazdığı formülü görmeyi bekler ve çözülmüş bir adres, kendi kendini sürdüren bir modeli sessizce yeni satırları kapsamayı bırakan kırılgan bir modele dönüştürür

Resmi iki ilgili yetenek tamamlar. Başlıksız tablolar ve tablo başına yorumlar dahil olmak üzere tablo tanımlarının kendisi, veri doğrulama, AutoFilter ve Excel tablolarında anlatılan tablo modeli üzerinden geri yazılır. Ve birçok hücre bir örüntüyü paylaştığında, XLSX bunları bir kez paylaşılan bir formül olarak saklar; bu, paylaşılan formül si genişletmesinde ele alındığı gibi genişletilir ve yeniden yayılır. Paylaşılan formüller içindeki yapılandırılmış başvurular her iki yoldan da geçer; bu yüzden ikisinin de doğru davranması gerekir ve öyle davranırlar

HotXLS, Excel kurulumu ve Office otomasyonu olmadan Delphi ve C++Builder'dan XLS, XLSX ve ODS okur ve yazar; formülleri kendi motorunda değerlendirir. Tablo modeli, formül motoru ve yeniden hesaplama API'si HotXLS Delphi elektronik tablo bileşeni sayfasında belgelenmiştir