Teknik Makale

HotXLS ile Yalnızca Üst Veri ve Seçmeli XLSX Yükleme

HotXLS bir XLSX çalışma kitabını açabilir ve hiçbir çalışma sayfası hücresini ayrıştırmaz. TXLSXWorkbook.MetadataOnly, çalışma kitabı özelliklerini, tanımlı adları, sayfa adlarını ve görünürlük durumlarını, stilleri, temayı, bağlantıları ve dış bağlantıları okur, sonra hücre XML'inden önce durur. Çalışma kitabı dizininin içinde ne olduğunu bilmesi gereken bir tarayıcı için bu, dakikalarla saniyeler arasındaki farktır

Resmi tamamlayan üç ilgili anahtar vardır: SelectedSheets adlandırılmış bir alt küme için hücreleri ayrıştırır, LoadSheet atlanmış bir sayfayı sonradan özgün arşivden madunlaştırır ve PreserveRawParts değiştirilmemiş parçaların sıkıştırılmış baytlarını kaydederken doğrudan geçirir. Birlikte kullanıldığında "bir çalışma kitabını aç"ı her şeyi ya da hiçbirini açan tek bir işlemden, kapsamını belirleyebileceğiniz bir şeye çevirirler

Tek bir hücreyi ayrıştırmadan ne öğrenilebilir?

Çoğu keşif görevinin ihtiyacından fazlası. Open'tan önce MetadataOnly ayarlandığında, çalışma kitabı sayfa adlarını ve görünürlük durumlarını, tanımlı adlarını, belge özelliklerini, stillerini ve temasını, dış bağlantılarını ve bağlantılarını taşıyarak geri döner. Sayfalar sıfır hücreli nesneler olarak mevcuttur

Bu tam bir kataloğun, denetimin veya yönlendirme kararının çalıştığı bilgidir. Hangi çalışma kitapları TaxRate adında bir ad tanımlar? Hangilerinin gizli sayfaları var? Hangileri hizmet dışı bırakılmış bir sunucuya bağlanıyor? Bunları her dosyayı tamamen yükleyerek yanıtlamak, gecelik bir işin bütün gece süren bir işe dönüşmesidir

HotXLS MetadataOnly, bir Delphi XLSX arşivinde çalışma kitabı özelliklerini, sayfa adlarını, stilleri ve bağlantıları okur, sonra herhangi bir çalışma sayfası hücre XML'sinden önce durur
MetadataOnly arşivin her yapısal parçasını okur ve çalışma sayfası hücre XML'inden önce durur. Delphi çalışma kitabı, sayfa adları, görünürlük, tanımlı adlar ve stillerle sıfır hücreyle geri döner
var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create;
  try
    Workbook.MetadataOnly := True;      // Open'dan önce ayarlanır
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // Sheets[] 1 tabanlıdır
      if not Workbook.Sheets[I].Visible then
        Report.Add(FileName + ': hidden sheet ' +
          Workbook.Sheets[I].Name);
  finally
    Workbook.Free;
  end;
end;

Kırk sayfanın ikisini yükleme

SelectedSheets, sayfa adlarından oluşan bir TStringList'tir. Boş olmadığında Open yalnızca adını verdiği sayfalar için hücre XML'ini ayrıştırır; diğer her sayfa doğru adını ve görünürlük durumunu korur ve hiç hücre taşımaz. Boş bir liste, önceki davranış olan her şeyi yüklemek anlamına gelir

MetadataOnly ile etkileşimi açıkça söylemeye değer, çünkü tersine çevirmek şaşırtıcı bir boş çalışma kitabı üretir: MetadataOnly = True seçimi geçersiz kılar ve tüm sayfaları atlar. Birini veya diğerini kullanın. Keşif yalnızca üst veri kullanır; hedeflenen iş bir seçim kullanır

HotXLS SelectedSheets, Delphi'de kırk sayfa içinden iki adlandırılmış sayfanın hücrelerini ayrıştırırken LoadSheet, hâlâ açık arşivden atlanmış bir sayfayı somutlaştırır
SelectedSheets hücre XML'ini yalnızca adı geçen sayfalar için ayrıştırır; kalanını ad ile görünürlüğü koruyan boş taslaklar olarak bırakır. LoadSheet bir taslağı sonra maddelleştirir — kaynak arşiv hâlâ açıksa
Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Daha sonra, kullanıcı atladığın bir sekmeyi açtığında.
// LoadSheet 0 tabanlı konumu alır ve kaynak dosyayı gerektirir,
// bu yüzden akıştan açılan bir çalışma kitabında çalışmaz
if Workbook.LoadSheet(ZeroBasedPosition) then
  Grid.Refresh;

LoadSheet(Index), atlanmış bir sayfayı talep üzerine özgün arşivden madunlaştırır; bu da bu deseni yalnızca toplu işte değil etkileşimli bir uygulamada kullanılabilir kılan şeydir. Kullanıcının baktığı sayfayı açın, diğerlerini tıkladığında yükleyin. Arşiv tam bu nedenle açık kalır, dolayısıyla kullanıcı başka bir sayfa isteyebileceği sürece çalışma kitabını canlı tutun

Bir gidiş-dönüş neden hiç dokunmadığınız parçaları değiştirir?

Çünkü saf bir kaydetme her şeyi yeniden üretir. Temayı aç, bir nesne modeli inşa et, geri serileştir, yeniden sıkıştır ve şimdi tema hakkında hiçbir şey değişmemiş olmasına rağmen baytlar farklı. VBA projeleri ve özet önbellekler için bu yalnızca israftan daha kötüdür, çünkü o parçalar nesne modelinin tam olarak temsil etmediği yapı taşır

PreserveRawParts bunu SaveAs sırasında değiştirilmemiş parçaların sıkıştırılmış temsilini kaynak arşivden doğrudan kopyalayarak yanıtlar. Tema, VBA projesi, özet tablolar ve özet önbellekler değiştirilmedikleri zaman bayt olarak karşıdan karşıya geçer. Açma yok, yeniden sıkıştırma yok, bir serileştirme gidiş-dönüşünde bir şey kaybetme riski yok

Maliyeti zaten sahip olduğunuz bir kısıttır: kaynak arşiv kaydetme anında hâlâ kullanılabilir olmalıdır. Akışınız bir dosyayı belleğe okuyorsa, kapatırsa ve bir saat sonra kaydederse, ham kopyalama yolunun kopyalayacağı bir şey yoktur. Çalışma kitabının ömrü boyunca kaynağa ulaşılabilir tutun, bu LoadSheet'in de dayattığı aynı gereksinimdir

Kasıtlı olarak yeniden açan bir keşif akışı

Üretimde çalışan desen iki geçişlidir ve hiçbir kurnazlığı yoktur. Birinci geçiş yalnızca üst veri açar ve karar verir. İkinci geçiş önemli olan dosyaları bir sayfa seçimiyle yeniden açar ve işi yapar. İkinci açılış yalnızca hücreleri ayrıştıran olduğunda ve yalnızca birinci geçişin seçtiği sayfaları ayrıştırdığında hesapladığınızda yeniden açma israf gibi hissedilir

Delphi'de iki geçişli HotXLS keşif hattı: yalnızca-meta veri geçişi hangi çalışma kitaplarının ve sayfaların önemli olduğuna karar verir, sonra hedefli bir geçiş yalnızca seçilen sayfaları ayrıştırır
Birinci geçiş dizini yalnızca meta veriyle tarar ve hangi dosya ile sayfaların önemli olduğuna karar verir; ikinci geçiş eşleşmeleri bir sayfa seçimiyle yeniden açar. Hücre XML'ini yalnızca ikinci açış ayrıştırır
// Geçiş 1: keşif
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// Geçiş 2: hedefli yükleme
Workbook := TXLSXWorkbook.Create;
Workbook.SelectedSheets.AddStrings(Wanted);
Workbook.Open(FileName);

Open'tan sonra bayrağı temizleyerek yalnızca üst veri olan bir çalışma kitabını yerinde yükseltmeye çalışmayın. Bayrak açılma sırasında okunur; sonradan temizlemek hücre XML'i hiç ziyaret edilmemiş bir çalışma kitabı hakkında hiçbir şey değiştirmez

Bunun diğer büyük dosya kollarıyla uyumu

Seçmeli yükleme ayrıştırdığınızı azaltır. Bir sayfanın yüklendikten sonra maliyetini azaltmaz ve her sayfanın her hücresine gerçekten ihtiyaç duyduğunuzda yardımcı olmaz. Bu durum için ilgili iş depolama tarafındadır, satır bloğu hücre depolama ve aralık stili kaplamaları notlarında açıklanmıştır ve ayrıştırma tarafı paralel XLSX ayrıştırma ve bellek ayırıcı'da. Görev hiç düzenleme olmadan saf bir taramaysa, akan doğrudan okuyucu nesne modelini tamamen atlar ve bir tane inşa eden herhangi bir yükleme stratejisini geçer

HotXLS, XLS ve XLSX dosyalarını Excel bağımlılığı olmaksızın yerel Delphi ve C++Builder kodundan açar, dolayısıyla sunucu tarafı bir keşif işi kendi uygulamanızdan başka hiçbir şey kurulu olmadan çalışır; desteklenen biçimler ve lisanslama için HotXLS elektronik tablo bileşeni sayfasına bakın