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ợ