Tài liệu HotXLS

Tham chiếu sổ làm việc ngoài

Tổng quan

Các mô hình bảng tính thường lấy dữ liệu từ các sổ làm việc phụ bằng các công thức tham chiếu chéo; HotXLS hỗ trợ phân tích, ghi và bảo toàn các tham chiếu sổ làm việc ngoài trong cả tài liệu BIFF8 (XLS cổ điển) và OpenXML (XLSX)

Workspace sổ làm việc trực tiếp

TXLSWorkbookWorkspace trong lxWorkbookWorkspace là lõi nhận dạng và đăng ký dùng chung cho các sổ làm việc ngoài trực tiếp; cả TXLSWorkbook lẫn TXLSXWorkbook đều hiển thị CreateWorkspaceWorkbook và sở hữu một ExternalWorkspace mà bộ đánh giá công thức của chúng sử dụng, còn sổ làm việc ODS mở qua TXLSXWorkbook báo cáo loại engine OpenDocument thông qua cùng adapter đó

var
  Host, Target: TXLSXWorkbook;
begin
  Host.ExternalWorkspace.Add(
    '..\Data\Target.xlsx',
    '..\Data\Target.xlsx',
    'C:\Models\Host.xlsx',
    Target.CreateWorkspaceWorkbook);

  // The compatibility facade maps an unambiguous name to the
  // relationship target already stored in Host.ExternalLinks
  Host.RegisterExternalWorkbook('Target.xlsx', Target);

  // The matching call revokes a facade-level registration
  Host.UnregisterExternalWorkbook('Target.xlsx');
end;

Sổ làm việc cổ điển dùng cùng các phương thức tương thích với đích TXLSWorkbook; RegisterExternalWorkbook và UnregisterExternalWorkbook chỉ quản lý ánh xạ tên cấp facade, còn ExternalWorkspace.Remove và Clear thu hồi chính các đăng ký workspace. Caller đa engine có thể thêm trực tiếp adapter Classic, XLSX hoặc ODS nào vào ExternalWorkspace

  • Chuẩn hóa nhận dạng mang tính từ vựng và không phân biệt chữ hoa-thường, bảo toàn đường dẫn và phần mở rộng, phân giải các đích tương đối dựa trên nhận dạng nguồn của owner, gộp các dot segment, và không thực hiện truy cập hệ thống tệp hay mạng nào
  • Nhận dạng chính xác và alias tường minh được phân giải trước; tra cứu chỉ theo basename chỉ thành công khi có đúng một đăng ký đang kết nối khớp, nếu không Resolve trả về xlswrsConflict
  • Add từ chối xung đột khóa chính xác, alias và sổ làm việc trùng lặp; các đường dẫn đầy đủ khác nhau và phần mở rộng khác nhau có thể cùng tồn tại
  • Remove và Clear thu hồi đăng ký, còn việc hủy trực tiếp một đích Classic hoặc XLSX sẽ ngắt kết nối adapter của nó và chờ các reader đang hoạt động trước khi mô hình được giải phóng
  • Trang tính ngoài được phân giải theo tên khai báo trước khi fallback về vị trí tính từ 1, nên thứ tự trang tính của sổ làm việc đích không cần khớp với thư mục liên kết nguồn
  • Bộ đánh giá công thức đọc sổ làm việc trực tiếp đã phân giải trước, sau đó mới fallback về cache có kiểu của tệp host; host Classic XLS giải mã các giá trị XCT và CRN thưa, còn host XLSX dùng cache liên kết ngoài mà mô hình gói đã nắm giữ
  • OnLoadWorkbook là một yêu cầu tài nguyên có kiểm soát, tùy chọn; giá trị mặc định của nó là nil, nên tính toán lại vẫn không thực hiện truy cập hệ thống tệp hay mạng nào trừ khi mã ứng dụng cung cấp chính sách đó một cách tường minh
  • Mỗi nhận dạng đã chuẩn hóa chỉ gọi loader nhiều nhất một lần cho đến ResetLoadAttempts; các yêu cầu cấp cao nhất đồng thời chia sẻ kết quả đang thực hiện, kể cả các kết quả không tìm thấy và lỗi có kiểu, thay vì mở cùng một tài nguyên lặp đi lặp lại
  • MaxLoadDepth mặc định là 16 và MaxWorkbookCount mặc định là 64; việc nhập lại cùng nhận dạng, phụ thuộc lồng nhau vào một nhận dạng đang thực hiện, cạn độ sâu và cạn số sổ làm việc đều trả về chẩn đoán có kiểu mà không chặn trong một chu kỳ tải
  • Các IRI nguồn ngoài của ODF vẫn là nhận dạng từ vựng đầy đủ, bao gồm URI scheme và ký tự được đặt trong ngoặc, nhưng không bao giờ cho phép truy cập tệp hay mạng ngầm định
  • Xung đột nhận dạng vẫn là #REF! để dữ liệu cache cũ không thể che khuất định tuyến mơ hồ; một ô cache vắng mặt chỉ là giá trị rỗng khi tệp khai báo một cache hợp lệ cho trang tính đó

Resolve thực hiện tra cứu trong số các đăng ký rồi tới bước tải có kiểm soát tùy chọn; kết quả của nó là một TXLSWorkspaceResolveStatus (xlswrsResolved, xlswrsNotFound, xlswrsConflict, xlswrsDisconnected, xlswrsLoadNotFound, xlswrsLoadLimit, xlswrsLoadLoop hoặc xlswrsLoadError), và ResolveWithLoader còn trả về một TXLSWorkspaceLoadDiagnostic ghép TXLSWorkspaceLoadDiagnosticCode với TXLSWorkspaceLoadResponseStatus (xlswlrsNotFound, xlswlrsResolved, xlswlrsError) để phân biệt các kết quả không tìm thấy, lỗi loader, đã ngắt kết nối, chạm giới hạn độ sâu hoặc số sổ làm việc, nhập lại nhận dạng, phụ thuộc đồng thời và xung đột đăng ký. Callback của loader nhận một TXLSWorkspaceLoadRequest (nhận dạng, độ sâu, số đăng ký, giới hạn) và trả lời bằng một TXLSWorkspaceLoadResponse

Recalculate báo cáo một TXLSWorkspaceRecalcStatus, tùy chọn kèm chi tiết TXLSWorkspaceRecalcResult, và bộ đánh giá ghi nhận nguồn gốc từng ô dưới dạng TXLSWorkspaceRuntimeLookup (xlswrlInactive, xlswrlResolved, xlswrlFallbackCache hoặc xlswrlError) để chẩn đoán có thể phân biệt đọc trực tiếp với fallback từ cache

Adapter IXLSWorkspaceWorkbook hiển thị EngineKind (kiểu TXLSWorkspaceEngineKind: xlsweClassic, xlsweOpenXml hoặc xlsweOpenDocument), SourceIdentity, InstanceIdentity và Generation, kiểm tra còn kết nối bằng IsConnected, đọc một ô qua TryGetCellValue (trả về TXLSWorkspaceCellStatus có kiểu: có giá trị, thiếu, tham chiếu không hợp lệ, đã ngắt kết nối hoặc lỗi, cộng thêm cờ nằm ngoài vùng used range), làm mới mô hình bằng Recalculate, và tách khỏi mô hình sổ làm việc bằng Disconnect

Sổ đăng ký bổ sung AddAlias cho các tên phụ gắn với một nhận dạng đã đăng ký, TryResolve làm biến thể tra cứu không ném ngoại lệ, và BaseNameMatchCount để xem trước có bao nhiêu đăng ký đang kết nối dùng chung một basename trước khi chọn một đích không mơ hồ

Đồ thị phụ thuộc liên sổ làm việc

BuildDependencyGraph chụp nhanh mọi adapter sổ làm việc đã đăng ký và trích xuất các node công thức từ các mô hình Classic XLS, XLSX và ODS vào một TXLSWorkspaceDepGraph duy nhất; phương thức trả về False và không có đồ thị một phần khi bất kỳ adapter đã đăng ký nào không cung cấp được siêu dữ liệu phụ thuộc

  • Mỗi node công thức giữ nhận dạng sổ làm việc chính tắc, tên trang tính và vị trí trang tính tính từ 1, vị trí ô tính từ 0, hình chữ nhật đầu ra mảng, tính bay hơi, và trạng thái tham chiếu chưa phân giải
  • Tham chiếu ô và vùng hình chữ nhật giữ nhận dạng chính tắc của sổ làm việc đích và trang tính; tham chiếu toàn cột, toàn hàng và toàn trang tính vẫn là một khoảng duy nhất thay vì phình ra thành hàng triệu ô
  • Tên đã định nghĩa cục bộ vẫn tra cứu được như các phụ thuộc ký hiệu, đồng thời được mở rộng thành các phụ thuộc ô hoặc vùng cụ thể khi định nghĩa có thể phân giải tĩnh
  • Tên đã định nghĩa ngoài bảo toàn slot liên kết ngoài, tên khai báo, phạm vi trang tính tùy chọn và nhận dạng đích chính tắc, mà không coi siêu dữ liệu DDE, OLE hay user-function là tên sổ làm việc
  • FindDependentsOfCell và việc dựng cạnh đồ thị dùng cây khoảng hàng với kỹ thuật cắt tỉa maximum-end; LastRangeCandidateChecks và EdgeCandidateChecks hiển thị số lần kiểm hình chữ nhật chính xác để thẩm định hiệu năng
  • Việc trích xuất công thức chạy dưới các read lease của sổ làm việc và chỉ quét các đối tượng công thức đã hiện thực hóa, nên kho lưu giá trị đóng gói vẫn giữ nguyên trạng thái đóng gói và việc tạo đồ thị không làm thay đổi thế hệ sổ làm việc

Tính toán lại theo lịch

Recalculate giữ lại đồ thị dùng chung và chỉ dựng lại khi đăng ký workspace hoặc thế hệ phụ thuộc công thức của một sổ làm việc thay đổi; các thế hệ giá trị khởi động một lượt quét dirty mới, và trạng thái dirty lan truyền qua các cạnh phụ thuộc liên sổ làm việc

var
  RecalcInfo: TXLSWorkspaceRecalcResult;
  Status: TXLSWorkspaceRecalcStatus;
begin
  Status := Workspace.Recalculate(RecalcInfo);
  if Status <> xlswrcOk then
    HandleWorkspaceCalculation(Status, RecalcInfo);
end;
  • Các thành phần liên thông mạnh được tính trên các ô công thức, nên các sổ làm việc có thể liên kết theo cả hai chiều mà vẫn không có chu trình khi các đường phụ thuộc cấp ô của chúng không tạo thành vòng lặp
  • Các thành viên chu trình thực sự và các hậu duệ dirty bị chu trình chặn sẽ bị vô hiệu hóa và loại khỏi thứ tự topo, ngăn giá trị cache cũ bị trình bày như thể là kết quả thành công
  • Tham chiếu bay hơi hoặc chưa phân giải được tĩnh buộc hành vi dirty bảo thủ cần cho tính đúng đắn, trong khi đồ thị ổn định tái sử dụng công việc phân tích phụ thuộc trước đó
  • Đọc ngoài trong một lượt tính dùng cache chính xác theo instance sổ làm việc, trang tính, hàng và cột; một công thức theo lịch vô hiệu hóa vùng đầu ra của nó trước khi được đánh giá để các phụ thuộc sau quan sát được giá trị mới
  • Cache cục bộ theo lượt tính không bao giờ cấp quyền truy cập tài nguyên; sổ làm việc đã đăng ký và loader do caller kiểm soát (tùy chọn) vẫn là các nguồn phân giải trực tiếp duy nhất, sau đó mới đến các cache tệp có kiểu và #REF!
  • TXLSWorkspaceRecalcResult hiển thị việc đồ thị có được dựng lại hay không cùng các số đếm dirty, đã đánh giá, đã vô hiệu hóa, chu trình, bị chặn, cache-hit và cache-miss
  • Trạng thái phân biệt thành công, adapter không được hỗ trợ, sổ làm việc đã ngắt kết nối, tham chiếu vòng, lỗi tính toán và việc biến đổi workspace trong lúc tính
  • Các lời gọi Recalculate trên cùng một workspace được tuần tự hóa, nên hai phiên tính toán không bao giờ cùng lúc sửa đồ thị dùng chung hay các cache sổ làm việc
  • Remove hoặc Clear có thể chạy trong khi một lượt tính đang hoạt động; lượt tính giữ các ảnh chụp nhanh adapter an toàn và trả về xlswrcWorkspaceChanged thay vì dereference một đăng ký đã bị xóa
  • Hủy một workspace sẽ chờ lượt tính đang hoạt động của nó kết thúc, còn hủy một sổ làm việc đã đăng ký sẽ ngắt kết nối adapter và khiến các lần phân giải sau thất bại một cách an toàn
  • Lỗi loader và kết quả không tìm thấy vẫn được cache một lần cho mỗi nhận dạng đã chuẩn hóa cho đến ResetLoadAttempts, và một lần tính thất bại giữ trạng thái dirty cục bộ để chờ được thử lại tường minh
  • Đồ thị được giữ lại giúp lượt tính kế tiếp không đổi có chi phí tỉ lệ với số sổ làm việc đã đăng ký thay vì số công thức; phân tích thành phần không đệ quy và các cạnh vùng gọn nhẹ giữ các mô hình sâu và rộng bị chặn bởi siêu dữ liệu công thức đã hiện thực hóa

Tách tên đã định nghĩa ngoài

ConvertExternalDefinedNamesToRefErrors cung cấp cùng một thao tác công khai trên TXLSWorkbook và TXLSXWorkbook; nó trả về số định nghĩa phạm vi sổ làm việc và phạm vi trang tính được thay bằng #REF! gốc

var
  Converted: Integer;
begin
  Converted := Workbook.ConvertExternalDefinedNamesToRefErrors;
  // External-link parts and ordinary cell formulas remain intact
end;
  • Việc chọn trong Classic XLS dùng các token tham chiếu BIFF đã biên dịch và nhận dạng supporting-workbook XTI, nên các tham chiếu ba chiều cùng sổ làm việc và các dòng token không chắc chắn vẫn giữ nguyên
  • Việc chọn trong XLSX dùng các slot sổ làm việc dạng số có nhận diện cú pháp theo thứ tự tài liệu quan hệ và chỉ chấp nhận các phần external-link của sổ làm việc, loại trừ DDE, OLE, slot chưa phân giải, tham chiếu bảng và văn bản trong ngoặc nằm bên trong chuỗi
  • Mọi thay thế được chuẩn bị trước lần biến đổi đầu tiên và được commit như một thao tác ghi duy nhất; lời gọi thứ hai là luỹ đẳng
  • Văn bản tên, phạm vi sổ làm việc hoặc trang tính, khả năng hiển thị, chú thích, cờ macro và built-in, các thuộc tính XLSX không nhận dạng được, và thư mục liên kết ngoài vẫn còn nguyên sau chuyển đổi và qua các chu kỳ Roundtrip
  • Các định nghĩa méo mó và không được hỗ trợ được giữ nguyên từng byte hoặc theo văn bản khi có thể và thêm chẩn đoán xlsDiagnosticDefinedNameConversionSkipped thay vì bị đoán bừa
  • Các công thức phụ thuộc được tính lại thành giá trị lỗi Excel tương ứng, trong khi một kết quả cache hợp lệ của công thức ngoài trực tiếp thông thường vẫn khả dụng nếu sổ làm việc trực tiếp của nó về sau ngắt kết nối
  • Thao tác này dành riêng cho Excel và không diễn giải lại ngữ nghĩa name-formula của OpenDocument

Tham chiếu ngoài XLS cổ điển

Trong sổ làm việc XLS cổ điển, liên kết ngoài được lưu trữ trong khối thư mục toàn cục bằng các bản ghi EXTERNALBOOK và EXTERNNAME; HotXLS duy trì các thư mục này trong các chu kỳ đọc/ghi tệp, đảm bảo rằng các tham chiếu phạm vi từ xa tồn tại qua các vòng lặp sửa đổi

Quan hệ ngoài XLSX

Đối với sổ làm việc OOXML, việc ánh xạ liên kết ngoài được quản lý thông qua các phần quan hệ; xem chi tiết giao diện hỗ trợ bên dưới