Tài liệu HotXLS

Truyền phát bảng tính lớn

Tổng quan

Tải các bảng tính rất lớn (ví dụ hàng triệu ô có dữ liệu) vào bộ nhớ có thể dẫn đến lỗi hết bộ nhớ trong các tiến trình 32-bit; HotXLS cung cấp các trình đọc và ghi truyền phát với mức sử dụng bộ nhớ gần như không đổi, bỏ qua việc tạo DOM trong quá trình phân tích sổ làm việc

API Đọc trực tiếp

Lớp TXLSDirectReader phân tích các luồng sổ làm việc mà không tạo mô hình ô trong bộ nhớ và kích hoạt các sự kiện OnSheet và OnCell khi gặp các ô được chọn

Reader := TXLSDirectReader.Create;
try
  Reader.ParallelSheets := True;
  Reader.ParallelMaxThreads := 4;
  Reader.ParallelBufferMemoryLimit := 16 * 1024 * 1024;
  Reader.OnDimension := HandleDimension;
  Reader.OnColumn := HandleColumn;
  Reader.OnRow := HandleRow;
  Reader.OnMerge := HandleMerge;
  Reader.OnCell := HandleCell;
  Reader.ReadFile('large.xlsx');
finally
  Reader.Free;
end;

ParallelSheets bật các inflater trang tính và bộ đọc XML cục bộ theo worker trong khi luồng gọi phát các callback theo thứ tự trang tính và ô

ParallelBufferMemoryLimit giới hạn tổng payload ô-thô xếp hàng trên các worker đang hoạt động và mặc định là 16 MiB, còn ParallelPeakBufferedBytes báo đỉnh của lần đọc song song cuối cho chẩn đoán và kiểm thử dung lượng

Mỗi trang tính đang hoạt động nhận một phần ngân sách hàng đợi độc lập, ngăn một trang tính về sau đói mồi trang tính đang được phát; một ô đơn lớn hơn phần của nó vẫn được nhận như payload không thể chia nhỏ

OnDimension, OnSheetFormat, OnColumn, OnRow, OnPane, và OnMerge expose vùng dùng thực tế, độ rộng và chiều cao mặc định, các đoạn cột, chiều cao hoặc trạng thái ẩn của hàng, chỉ mục outline và kiểu, trạng thái khung xem, và các vùng gộp mà không dựng đối tượng trang tính

Các callback bố cục là tùy chọn và chạy trong một lượt metadata có giới hạn bộ nhớ trước các callback OnCell của trang tính được chọn; nhờ đó các vùng gộp đến trước các ô bên trong vùng gộp mặc dù OOXML lưu mergeCells sau sheetData

Khi phân tích trang tính song song được bật, các callback bố cục vẫn nằm trên luồng gọi và hoàn tất cho các trang tính được chọn trước khi các hàng đợi worker được rút hết

Đặt Abort trong OnCell đánh thức các producer và consumer đang bị chặn, dừng các lần đọc ZIP và giải nén đang chạy tại các bước nội bộ có giới hạn, join mọi worker, và để trình đọc dùng lại được

API Ghi trực tiếp

Lớp TXLSDirectWriter ghi các hàng trực tiếp vào gói tệp ZIP, đảm bảo chi phí bộ nhớ tối thiểu khi tạo các bản xuất dữ liệu lớn

Writer := TXLSDirectWriter.Create;
try
  Writer.BeginFile('large.xlsx');
  Writer.AddSheet('Data');
  Writer.AddRow(1);
  Writer.WriteString(1, 'Quarter');
  Writer.WriteString(2, 'Revenue');
  Writer.AddComment(2, 1, 'Validated source', 'Reviewer');
  Writer.AddImageFromFile(4, 1, 8, 12, 'logo.png',
    xlsDirectImagePng, 'Company logo');
  ChartIndex := Writer.AddChart(9, 1, 18, 16,
    xlsDirectChartColumn, 'Revenue');
  Writer.AddChartSeries(ChartIndex, 'Revenue',
    'Data!$A$2:$A$5', 'Data!$B$2:$B$5');
  Writer.Close;
finally
  Writer.Free;
end;

AddComment ghi các ghi chú ô cổ điển với metadata tác giả và các hình dạng ghi chú VML khớp mà không nạp mô hình đối tượng trang tính

AddImage, AddImageFromFile, và AddImageFromStream nhận các neo hai ô cùng payload PNG, JPEG, GIF, BMP, EMF, hoặc WMF; nguồn tệp chảy thẳng vào mục ZIP khi trang tính kết thúc, còn nguồn stream chỉ giữ tham chiếu stream và khoảng byte đã ghi

Khi AddImageFromStream nhận OwnsStream=True, trình ghi giải phóng stream đó sau khi các part phía trang tính được chốt; nếu không bên gọi phải giữ stream seekable sống đến lời gọi AddSheet hoặc Close kế tiếp

AddChart và AddChartSeries sinh ChartML cột, thanh, đường, vùng, tròn, vành nhẫn, hoặc phân tán với series dựa trên công thức, còn AddChartXml gắn vào một part biểu đồ hoàn chỉnh do bên gọi cung cấp cho các họ biểu đồ nâng cao và extension

Chú thích, neo drawing, và bộ mô tả biểu đồ chỉ được giữ cho trang tính hiện tại; sau khi sheetData đóng, trình ghi lần lượt phát các quan hệ trang tính, chú thích, VML, DrawingML, media, và ChartML, rồi giải phóng trạng thái kênh-phụ trước khi trang tính kế bắt đầu