Artikel Teknis

Pemuatan XLSX Hanya-Metadata dan Selektif dengan HotXLS

HotXLS dapat membuka buku kerja XLSX dan tidak mem-parsing satu sel lembar kerja pun. TXLSXWorkbook.MetadataOnly membaca properti workbook, defined name, nama dan status visibilitas sheet, style, theme, connection dan external link, lalu berhenti sebelum XML sel. Untuk pemindai yang perlu tahu apa isi direktori workbook, itu adalah perbedaan antara menit dan detik

Tiga saklar terkait melengkapi gambaran: SelectedSheets mem-parsing sel untuk subset yang dinamai, LoadSheet mematerialisasi sheet yang dilewati nanti dari arsip asli, dan PreserveRawParts menyalin byte terkompresi dari part yang tidak diubah langsung saat menyimpan. Digunakan bersama mereka mengubah "membuka workbook" dari satu operasi all-or-nothing menjadi sesuatu yang dapat Anda lingkupi

Apa yang dapat dipelajari tanpa mem-parsing satu sel pun?

Lebih banyak daripada yang dibutuhkan sebagian besar tugas discovery. Dengan MetadataOnly disetel sebelum Open, workbook kembali membawa nama sheet dan status visibilitasnya, defined name, properti dokumen, style dan theme, external link dan connection. Sheet hadir sebagai objek dengan sel nol

Itu persis informasi yang dijalankan katalog, audit, atau keputusan routing. Workbook mana yang mendefinisikan nama TaxRate? Mana yang memiliki sheet tersembunyi? Mana yang menautkan ke server yang sudah dinonaktifkan? Menjawab itu dengan memuat penuh setiap file adalah cara kerja semalaman menjadi kerja semalaman suntuk

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;

Memuat dua sheet dari empat puluh

SelectedSheets adalah TStringList nama sheet. Saat tidak kosong, Open mem-parsing XML sel hanya untuk sheet yang dinamainya; setiap sheet lain mempertahankan nama dan status visibilitas yang benar dan tidak memegang sel. Daftar kosong berarti perilaku sebelumnya, yaitu memuat semuanya

Interaksi dengan MetadataOnly patut dinyatakan dengan jelas, karena membaliknya menghasilkan workbook kosong yang membingungkan: MetadataOnly = True mengesampingkan seleksi dan melewati semua sheet. Gunakan salah satu atau yang lain. Discovery menggunakan hanya-metadata; pekerjaan tertarget menggunakan seleksi

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) mematerialisasi sheet yang dilewati on demand dari arsip asli, yang membuat pola ini dapat digunakan dalam aplikasi interaktif alih-alih hanya dalam batch. Buka dengan sheet yang sedang dilihat pengguna, muat yang lain saat mereka klik. Arsip tetap terbuka persis karena alasan itu, jadi pertahankan workbook hidup selama pengguna mungkin meminta sheet lain

Kenapa round trip mengubah part yang tidak pernah Anda sentuh?

Karena simpan naive meregenerasi semuanya. Dekompres theme, bangun object model, serialisasikan kembali, kompres ulang — dan sekarang byte berbeda meskipun tidak ada apa pun tentang theme yang berubah. Untuk project VBA dan pivot cache itu lebih buruk daripada boros, karena part-part itu membawa struktur yang tidak sepenuhnya direpresentasikan object model

PreserveRawParts menjawab ini dengan menyalin representasi terkompresi part yang tidak diubah langsung dari arsip sumber selama SaveAs. Theme, project VBA, pivot table dan pivot cache berpindah sebagai byte ketika tidak dimodifikasi. Tidak ada dekompresi, tidak ada kompresi ulang, tidak ada risiko kehilangan sesuatu dalam round trip serialisasi

Biayanya adalah batasan yang sudah Anda miliki: arsip sumber harus tetap tersedia saat simpan. Jika workflow Anda membaca file ke memori, menutupnya, dan menyimpan satu jam kemudian, jalinan raw-copy tidak punya apa pun untuk disalin. Pertahankan sumber dapat dijangkau selama masa hidup workbook, yang adalah persyaratan yang sama yang dikenakan LoadSheet

Pipeline discovery yang sengaja membuka kembali

Pola yang berfungsi di produksi memiliki dua pass dan tidak ada kepandaian. Pass satu membuka hanya-metadata dan memutuskan. Pass dua membuka kembali file yang penting dengan seleksi sheet dan melakukan pekerjaan. Membuka kembali terasa boros sampai Anda menghitung apa yang dihindari pass satu: open kedua adalah satu-satunya yang mem-parsing sel, dan ia mem-parsing hanya sheet yang dipilih pass satu

// 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);

Jangan mencoba mempromosikan workbook hanya-metadata di tempat dengan menghapus flag setelah Open. Flag dibaca selama pembukaan; menghapusnya setelahnya tidak mengubah apa pun tentang workbook yang XML selnya tidak pernah dikunjungi

Di mana ini cocok dengan tuas file besar lainnya

Pemuatan selektif mengurangi apa yang Anda parse. Ia tidak mengurangi apa yang dibebankan sheet setelah dimuat, dan tidak membantu ketika Anda benar-benar membutuhkan setiap sel dari setiap sheet. Untuk kasus itu pekerjaan yang relevan adalah di sisi penyimpanan, dijelaskan dalam catatan tentang penyimpanan sel row-block dan overlay style interval, dan di sisi parsing dalam parsing XLSX paralel dan memory allocator. Ketika tugasnya adalah pemindaian murni tanpa pengeditan sama sekali, streaming direct reader melewati object model sepenuhnya dan akan mengalahkan strategi pemuatan apa pun yang membangunnya

HotXLS membuka file XLS dan XLSX dari kode Delphi dan C++Builder native tanpa dependensi Excel, jadi pekerjaan discovery sisi server berjalan tanpa apa pun yang terinstal selain executable Anda sendiri — lihat halaman komponen spreadsheet HotXLS untuk format dan lisensi yang didukung