Teknik makale

HotXLS Component: large workbook performance in Delphi

Excel çalışma kitaplarını doğrudan Delphi veya C++Builder kodundan oluşturun, düzenleyin, inceleyin, hesaplayın ve dışa aktarın. HotXLS; Microsoft Excel otomasyonu olmadan masaüstü araçları, batch işleri, raporlama sistemleri ve sunucu tarafı belge üretimi için tasarlanmış, XLS ve XLSX iş akışlarına yönelik kaynak kodlu yerel bir Object Pascal kütüphanesidir.

Bu yazı teams generating or processing large XLS/XLSX workbooks in desktop utilities, services, or batch jobs için hazırlanmıştır. large workbook performance konusunu tek bir bileşen çağrısı olarak değil, üretim düzeyinde belge mühendisliği olarak ele alır.

Pratik risk şudur: large-workbook workflows fail when shared strings, styles, formulas, memory buffers, and output streams are not managed as production resources. Bu nedenle akışın yazılı sözleşmeye, gözlemlenebilir tanılara ve gerçekçi regresyon dosyalarına ihtiyacı vardır.

Mimari kararlar

Plan memory, styles, and streaming together. maximum row count, column count, sheet count, and output file size / shared-string strategy, style reuse, formula volume, and image policy

  • maximum row count, column count, sheet count, and output file size
  • shared-string strategy, style reuse, formula volume, and image policy
  • streaming write boundaries, temporary storage, progress, and cancellation
  • Excel compatibility limits and downstream import limits

Uygulama akışı

Measure workbook size during generation. Aşağıdaki sıra, iş akışını Delphi ve C++Builder ekipleri için incelenebilir tutar.

  1. create capacity fixtures that represent real customer data distribution
  2. reuse styles and strings instead of generating unique resources per cell
  3. write rows in controlled batches and flush output only at safe boundaries
  4. track memory, elapsed time, file size, and warning counts per stage
  5. open large output with the target application before increasing limits

Doğrulama kanıtı

Performance evidence for capacity planning. Bu alanları çıktı veya destek kaydıyla birlikte saklayın.

  • row count, column count, sheet count, style count, shared-string count, and file size
  • memory peak, elapsed time, batch size, temporary storage, and cancellation result
  • formula count, image count, comment count, and relationship count
  • target Excel or importer open time for representative output

Rows are not the only scale factor

Workbook size grows with cells, styles, shared strings, formulas, images, comments, and relationships. A performance plan should reduce redundant resources and choose streaming only where it fits the output contract.

Üretim uygulama notları

HotXLS Component: large workbook performance in Delphi konusunu HotXLS çağrılarının çevresinde açık bir servis sözleşmesi olarak ele alın; giriş doğrulama, çalışma kitabı yazma, çıktı denetimi ve destek kanıtını ayırın

  • Çalışma kitabını oluşturmadan önce veri kaynağını, hücre aralıklarını ve çıktı biçimini belirleyin
  • Satır sayısı, sayfalar, uyarılar ve çıktı yolunu incelenebilir destek kaydına yazın
  • Uygulamaya özel ayrıntıları UI olaylarına değil test edilebilir helper'lara yerleştirin
  • Dosyayı başka sisteme veya müşteriye vermeden önce kaydedilmiş çıktıyı yeniden açın veya inceleyin

Prova edilmesi gereken hata kipleri

  • Başarılı SaveAs çağrısı iş sözleşmesinin doğru kaldığını kanıtlamaz
  • Sunucu ile geliştirici makinesinde yazı tipleri, izinler ve bölgesel ayarlar farklı olabilir
  • Loglar parola, müşteri verisi veya iç bağlantı açığa çıkarmamalıdır

Ayrıntılı Delphi örneği

Aşağıdaki Delphi örneği bu konu için pratik bir servis sınırı gösterir ve politika, günlükleme ve doğrulamayı test edilebilir katmanda tutar

procedure WriteLargeLedgerWorkbook(const OutputFile: string; const Source: ILedgerReader);
var
  Wb: TXLSXWorkbook;
  Sh: IXLSWorksheet;
  RowIndex: Integer;
  Batch: TArray<TLedgerRow>;
  Item: TLedgerRow;
  Metrics: TWorkbookMetrics;
begin
  Wb := TXLSXWorkbook.Create;
  try
    Sh := Wb.Sheets[0];
    Sh.Name := 'Ledger';
    WriteHeaderRow(Sh, ['Account', 'Date', 'Description', 'Debit', 'Credit', 'Balance']);
    RowIndex := 2;
    Metrics := StartWorkbookMetrics('large-ledger');

    repeat
      Batch := Source.ReadNextBatch(5000);
      for Item in Batch do
      begin
        WriteLedgerRow(Sh, RowIndex, Item);
        Inc(RowIndex);
      end;
      CheckMemoryAndTempQuota(Metrics, RowIndex - 2);
      FlushProgressMetric(Metrics, RowIndex - 2);
    until Length(Batch) = 0;

    Sh.Range['A1:F1'].ApplyBuiltinStyle(xbsTitle);
    AddSummarySheet(Wb, Metrics, RowIndex - 2);
    AssertWorkbookSizePolicy(OutputFile, RowIndex - 2);

    if Wb.SaveAs(OutputFile) <> 1 then
      RaiseWorkbookSaveError(OutputFile);
  finally
    Wb.Free;
  end;
end;

Üretim kontrol listesi

  • Run the workflow on an empty workbook, a normal customer workbook, and a worst-case workbook
  • Open the output with the target spreadsheet application or downstream importer
  • Log product version, template version, profile, row count, output path, elapsed time, and warning count
  • Keep passwords, temporary files, customer data, and support bundles under explicit retention rules
  • Add regression workbooks when a customer file exposes a new edge case

Ürün belgeleri

HotXLS Component

Ek kod örnekleri

// hoist pool lookups out of the hot loop
HeaderFont := Book.Fonts.Add('Calibri', 11, True, False);   // 0-based pool index
for C := 1 to 24 do
  Sheet.Cells[1, C].FontIndex := HeaderFont + 1;            // cells store 1-based; 0 = default
procedure TLedgerExport.FillRow(Sender: TObject;
  SheetIndex, Row, FirstCol, LastCol: Integer;
  var Values: Variant; var Skip: Boolean; var Cancel: Boolean);
begin
  if Row > FCount then
  begin
    Cancel := True;     // stop the whole write
    Exit;
  end;
  Values := VarArrayOf([FRows[Row - 1].Account,
                        FRows[Row - 1].PostedOn,
                        FRows[Row - 1].Amount]);
end;

// one engine call instead of hundreds of thousands of property hits
Sheet.WriteRows(1, 1, FCount, 3, FillRow);
Names := TStringList.Create;
Book := TXLSXWorkbook.Create;
try
  if Book.GetSheetNames('big-unknown.xlsx', Names) <= 0 then
    raise Exception.Create('cannot enumerate sheets');   // failure clears the list
  // pick the target sheet, then decide whether a full Open is worth it
finally
  Book.Free;
  Names.Free;
end;