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

var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create(nil);
  try
    Workbook.MetadataOnly := True;      // set before Open
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // Sheets[] is 1-based
      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

Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Later, when the user opens a tab you skipped.
// LoadSheet takes the 0-based position and needs the source file,
// so it does not work on a workbook opened from a stream
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

// Pass 1: discovery
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// Pass 2: targeted load
Workbook := TXLSXWorkbook.Create(nil);
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