Bài viết kỹ thuật

Tải XLSX chỉ siêu dữ liệu và chọn lọc với HotXLS

HotXLS có thể mở một sổ làm việc XLSX mà không phân tích ô trang tính nào cả. TXLSXWorkbook.MetadataOnly đọc thuộc tính sổ làm việc, defined name, tên và trạng thái hiển thị của trang tính, style, theme, connection và external link, rồi dừng trước XML ô. Đối với một bộ quét cần biết thứ gì đang ở trong một thư mục các sổ làm việc, đó là khác biệt giữa phút và giây

Ba công tắc có liên quan hoàn thiện bức tranh: SelectedSheets phân tích ô cho một tập con đặt tên, LoadSheet hiện thực hóa một trang tính đã bỏ qua sau từ kho lưu gốc, còn PreserveRawParts chép thẳng các byte nén của các part không thay đổi khi lưu. Dùng cùng nhau chúng biến "mở một sổ làm việc" từ một thao tác toàn-hay-không thành một thứ có thể giới phạm vi

Bạn có thể học được gì mà không phân tích một ô nào?

Nhiều hơn mức hầu hết tác vụ khám phá cần. Với MetadataOnly đặt trước Open, sổ làm việc quay về mang theo tên và trạng thái hiển thị của các trang tính, các defined name, thuộc tính tài liệu, style và theme, external link cùng connection. Các trang tính hiện diện dưới dạng object với số ô bằng không

Đó chính xác là thông tin mà một danh mục, một kiểm toán hay một quyết định định tuyến chạy dựa vào. Sổ làm việc nào định nghĩa một tên gọi TaxRate? Cái nào có trang tính ẩn? Cái nào liên kết tới một máy chủ đã ngừng hoạt động? Trả lời những câu hỏi đó bằng cách tải đầy đủ mọi file là cách một tác vụ ban đêm trở thành tác vụ qua đêm

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;

Tải hai trang tính trong số bốn mươi

SelectedSheets là một TStringList chứa tên trang tính. Khi không rỗng, Open chỉ phân tích XML ô cho các trang tính được nêu tên; mọi trang tính khác vẫn giữ tên và trạng thái hiển thị đúng nhưng không chứa ô. Một danh sách rỗng nghĩa là hành vi trước đây, tức là tải mọi thứ

Tương tác với MetadataOnly đáng nói rõ, vì làm ngược lại sẽ tạo ra một sổ làm việc rỗng gây bối rối: MetadataOnly = True ghi đè sự lựa chọn và bỏ qua mọi trang tính. Hãy dùng một trong hai. Khám phá dùng metadata-only; công việc có mục tiêu dùng một selection

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) hiện thực hóa một trang tính đã bỏ qua theo nhu cầu từ kho lưu gốc, và đó là điều khiến mẫu này dùng được trong một ứng dụng tương tác thay vì chỉ trong một lô. Mở với trang tính mà người dùng đang xem, tải cái khác khi họ nhấp vào. Kho lưu mở đúng vì lý do đó, nên hãy giữ sổ làm việc sống miễn là người dùng còn có thể xin một trang tính khác

Vì sao một vòng chuyến lại thay đổi các part bạn chưa hề chạm?

Vì một phép lưu ngây ngô tái sinh lại mọi thứ. Giải nén theme, dựng một object model, tuần tự hóa lại, nén lại — và giờ byte khác biệt dù theme chẳng thay đổi gì. Đối với dự án VBA và pivot cache thì điều đó tệ hơn lãng phí, vì các part đó mang cấu trúc mà object model không đại diện đầy đủ

PreserveRawParts trả lời điều đó bằng cách chép biểu diễn nén của các part không thay đổi trực tiếp từ kho lưu nguồn trong SaveAs. Theme, dự án VBA, pivot table và pivot cache chuyển qua dưới dạng byte khi chúng không bị sửa. Không giải nén, không nén lại, không rủi ro mất thứ gì trong một vòng chuyến tuần tự hóa

Chi phí là một ràng buộc bạn đã có: kho lưu nguồn phải vẫn còn khả dụng lúc lưu. Nếu quy trình của bạn đọc file vào bộ nhớ, đóng nó lại và lưu một giờ sau, đường chép raw chẳng có gì để chép. Hãy giữ nguồn tiếp cận được trong toàn bộ vòng đời sổ làm việc, đó là cùng yêu cầu mà LoadSheet áp đặt

Một pipeline khám phá cố tình mở lại

Mẫu hoạt động trong sản xuất có hai lượt và không có sự khéo léo nào. Lượt một mở metadata-only rồi quyết định. Lượt hai mở lại các file quan trọng với một selection trang tính và làm việc. Mở lại có vẻ lãng phí cho đến khi bạn đếm thứ mà lượt một đã tránh: lần mở thứ hai là lần duy nhất phân tích ô, và nó chỉ phân tích các trang tính mà lượt một đã chọn

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

Đừng cố thăng hạng một sổ làm việc metadata-only tại chỗ bằng cách xoá cờ sau Open. Cờ được đọc trong lúc mở; xoá nó sau đó chẳng thay đổi gì về một sổ làm việc mà XML ô chưa từng được viếng

Nơi điều này phù hợp với các đòn bẩy tệp lớn khác

Tải chọn lọc giảm điều bạn phân tích. Nó không giảm chi phí của một trang tính khi đã tải, và không giúp ích khi bạn thực sự cần mọi ô của mọi trang tính. Cho trường hợp đó, công việc liên quan nằm ở phía lưu trữ, được mô tả trong các ghi chú về lưu trữ ô theo khối dòng và overlay style dạng khoảng, và phía phân tích trong phân tích XLSX song song và bộ cấp phát bộ nhớ. Khi tác vụ là một quét thuần không chỉnh sửa gì, trình đọc trực tiếp streaming bỏ qua object model hoàn toàn và sẽ vượt bất kỳ chiến lược tải nào có dựng object model

HotXLS mở file XLS và XLSX từ mã Delphi và C++Builder bản địa không phụ thuộc Excel, nên một tác vụ khám phá phía máy chủ chạy mà không cần cài gì ngoài thực thi của chính bạn — xem trang thành phần bảng tính HotXLS để biết các định dạng và giấy phép được hỗ trợ