HotXLS Docs

הפניות לחוברות עבודה חיצוניות

סקירה

מודלים של גיליונות אלקטרוניים שואבים לעיתים קרובות נתונים מחוברות עבודה משניות באמצעות נוסחאות הפניה מוצלבות; HotXLS תומך בניתוח, בכתיבה ובשימור הפניות לחוברות עבודה חיצוניות הן במסמכי BIFF8 (XLS קלאסי) והן ב־OpenXML (XLSX)

סביבת עבודה של חוברות עבודה חיות

TXLSWorkbookWorkspace ב־lxWorkbookWorkspace הוא ליבת הזהויות והרישום המשותפת עבור חוברות עבודה חיצוניות חיות; גם TXLSWorkbook וגם TXLSXWorkbook חושפים את CreateWorkspaceWorkbook ומחזיקים ב־ExternalWorkspace שבו משתמשים מעריכי הנוסחאות שלהם, וחוברת עבודה של ODS שנפתחת דרך TXLSXWorkbook מדווחת על סוג המנוע OpenDocument דרך אותו מתאם

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;

חוברות עבודה קלאסיות משתמשות באותן מתודות תאימות עם יעדים מסוג TXLSWorkbook; RegisterExternalWorkbook ו־UnregisterExternalWorkbook מנהלות רק את מיפוי השמות ברמת ה-Facade, ואילו ExternalWorkspace.Remove ו־Clear מבטלות את רישומי סביבת העבודה עצמם. קוראים חוצי־מנוע מוסיפים כל מתאם — Classic, XLSX או ODS — ישירות אל ExternalWorkspace

  • נרמול הזהות הוא לקסיקלי וחסר רגישות לרישיות, משמר נתיבים וסיומות, פותר יעדים יחסיים מול זהות המקור של החוברת המחזיקה, מצמצם מקטעי נקודה (dot segments) ואינו מבצע גישה למערכת הקבצים או לרשת
  • זהויות מדויקות וכינויים (aliases) מפורשים נפתרים ראשונים; חיפוש לפי שם בסיס בלבד מצליח רק כאשר רישום מחובר אחד בדיוק תואם, ואחרת Resolve מחזיר xlswrsConflict
  • Add דוחה התנגשויות של מפתח מדויק, כינוי או חוברת עבודה כפולה; נתיבים מלאים שונים וסיומות שונות יכולים להתקיים יחד
  • Remove ו־Clear מבטלות רישומים, ואילו הרס ישיר של יעד Classic או XLSX מנתק את המתאם שלו וממתין לקוראים פעילים לפני שחרור המודל
  • גיליונות עבודה חיצוניים נפתרים לפי השם המוצהר לפני ה-Fallback המיקומי שמבוסס על מספור מ־1, כך שסדר הגיליונות בחוברת היעד לא חייב להתאים לספריית הקישורים במקור
  • מעריך הנוסחאות קורא קודם מחוברת עבודה חיה שנפתרה ורק אז נופל למטמון המטופוס של קובץ המארח; מארחים של Classic XLS מפענחים ערכי XCT ו־CRN דלילים, ומארחי XLSX משתמשים במטמון הקישורים החיצוניים שכבר מוחזק על ידי מודל החבילה
  • OnLoadWorkbook הוא בקשת משאבים מרוסנת ואופציונלית; ברירת המחדל שלו היא nil, כך שחישוב מחדש עדיין אינו מבצע גישה למערכת הקבצים או לרשת אלא אם קוד היישום מספק במפורש מדיניות כזו
  • כל זהות מנורמלת מפעילה את הטוען (loader) לכל היותר פעם אחת עד לקריאה ל־ResetLoadAttempts; בקשות top-level מקבילות חולקות את התוצאה שבעיצומה — כולל תוצאות מטופוס של לא־נמצא ושל שגיאה — במקום לפתוח את אותו משאב שוב ושוב
  • MaxLoadDepth הוא 16 כברירת מחדל ו־MaxWorkbookCount הוא 64; כניסה חוזרת לאותה זהות, תלויות מקוננות בזהות שכבר בעיצומה, אזילת עומק ואזילת מכסת חוברות מחזירות אבחון מטופוס מבלי לחסום את מחזור הטעינה
  • IRIs של מקורות חיצוניים ב־ODF נשארים זהויות לקסיקליות שלמות, כולל סכמות URI ותווים מצוטטים, אך לעולם אינם מאשרים גישה מרומזת לקובץ או לרשת
  • התנגשות זהויות נשארת #REF! כך שנתוני מטמון מיושנים לא יוכלו להסתיר ניתוב דו־משמעי; תא חסר במטמון הוא ערך ריק רק כאשר הקובץ מצהיר על מטמון תקף עבור אותו גיליון

Resolve מבצע חיפוש ברישומים ולאחר מכן את הטעינה המרוסנת האופציונלית; התוצאה שלו היא TXLSWorkspaceResolveStatus (xlswrsResolved, xlswrsNotFound, xlswrsConflict, xlswrsDisconnected, xlswrsLoadNotFound, xlswrsLoadLimit, xlswrsLoadLoop או xlswrsLoadError), ו־ResolveWithLoader מחזיר בנוסף TXLSWorkspaceLoadDiagnostic שמצמיד TXLSWorkspaceLoadDiagnosticCode אל TXLSWorkspaceLoadResponseStatus (xlswlrsNotFound, xlswlrsResolved, xlswlrsError) כדי להבחין בין תוצאות של לא־נמצא, שגיאת טוען, תוצאה מנותקת, מגבלת עומק או מכסת חוברות, כניסה חוזרת לזהות, תלות מקבילה והתנגשות רישום. ה-callback של הטוען מקבל TXLSWorkspaceLoadRequest (זהות, עומק, מספר רישומים, מגבלות) ומשיב ב־TXLSWorkspaceLoadResponse

Recalculate מדווח TXLSWorkspaceRecalcStatus, לפי הצורך עם פירוט TXLSWorkspaceRecalcResult, והמעריך רושם לכל תא שיוך מקור (provenance) כ־TXLSWorkspaceRuntimeLookup (xlswrlInactive, xlswrlResolved, xlswrlFallbackCache או xlswrlError), כך שאבחון יכול להבחין בין קריאה חיה לבין Fallback למטמון

המתאם IXLSWorkspaceWorkbook חושף את EngineKind (מטיפוס TXLSWorkspaceEngineKind: xlsweClassic, xlsweOpenXml או xlsweOpenDocument), את SourceIdentity, InstanceIdentity ו־Generation, בודק חיות עם IsConnected, קורא תא בודד דרך TryGetCellValue (שמחזיר TXLSWorkspaceCellStatus מטופוס: ערך, חסר, הפניה לא תקפה, מנותק או שגיאה, ובנוסף דגל יציאה מחוץ לטווח השימוש), מרענן את המודל עם Recalculate ומתנתק ממודל חוברת העבודה עם Disconnect

רכיב הרישום מוסיף את AddAlias לשמות נוספים הקשורים לזהות רשומה אחת, את TryResolve כגרסת החיפוש ללא חריגות, ואת BaseNameMatchCount לתצוגה מקדימה של מספר הרישומים המחוברים שחולקים שם בסיס, לפני בחירת יעד חד־משמעי

גרף תלויות בין חוברות עבודה

BuildDependencyGraph לוכד תמונת מצב של כל מתאם חוברת עבודה רשום ומחלץ צמתי נוסחאות ממודלים של Classic XLS, XLSX ו־ODS אל TXLSWorkspaceDepGraph אחד; המתודה מחזירה False ואינה מחזירה גרף חלקי כאשר מתאם רשום כלשהו אינו יכול לספק מטא־נתוני תלויות

  • כל צומת נוסחה שומר את זהות חוברת העבודה הקנונית שלו, את שם גיליון העבודה ומיקומו הממוספר מ־1, את מיקום התא הממוספר מ־0, את מלבן הפלט של המערך, את תכונת הנדיפות ואת מצב ההפניה הבלתי־פתורה
  • הפניות לתאים ולטווחים מלבניים שומרות על זהויות קנוניות של חוברת היעד ושל גיליון העבודה; הפניות לעמודה שלמה, לשורה שלמה ולגיליון שלם נשארות מרווח אחד במקום להתפשט למיליוני תאים
  • שמות מוגדרים מקומיים נשארים זמינים לשאילתה כתלויות סימבוליות, ובמקביל מתרחבים לתלויות המוחשיות שלהם בתאים או בטווחים כאשר ניתן לפתור את ההגדרה באופן סטטי
  • שמות מוגדרים חיצוניים משמרים את משבצת הקישור החיצוני, את השם המוצהר, את היקף גיליון העבודה האופציונלי ואת זהות היעד הקנונית, מבלי להתייחס למטא־נתונים של DDE, OLE או פונקציות משתמש כאל שמות חוברת עבודה
  • FindDependentsOfCell ובניית קשתות הגרף משתמשים בעצי מרווח־שורות עם גיזום לפי קצה מרבי; LastRangeCandidateChecks ו־EdgeCandidateChecks חושפים את מספר בדיקות המלבנים המדויקות לצורך אימות ביצועים
  • חילוץ הנוסחאות רץ במסגרת leases של קריאת חוברת עבודה וסורק רק אובייקטי נוסחה שמומשו, כך שאחסון הערכים הדחוס נשאר דחוס ויצירת הגרף אינה משנה את דורות חוברת העבודה

חישוב מחדש מתוכנן

Recalculate משמר את הגרף המשותף ובונה אותו מחדש רק כאשר משתנה רישום סביבת העבודה או דור התלויות־בנוסחאות של חוברת עבודה; דורות של ערכים מזריעים מעבר חישוב חדש של תאים שהשתנו (dirty), והשינוי מתפשט דרך קשתות התלות בין־חוברתיות

var
  RecalcInfo: TXLSWorkspaceRecalcResult;
  Status: TXLSWorkspaceRecalcStatus;
begin
  Status := Workspace.Recalculate(RecalcInfo);
  if Status <> xlswrcOk then
    HandleWorkspaceCalculation(Status, RecalcInfo);
end;
  • רכיבים קשירים חזק מחושבים על תאי נוסחה, כך שחוברות עבודה יכולות לקשר זו לזו בשני הכיוונים ולהישאר חסרות מעגלים כל עוד מסלולי התלות ברמת התא אינם יוצרים לולאה
  • חברי מעגל אמיתיים וצאצאים שהשתנו ונחסמים על ידי מעגל מבוטלים ומוצאים מחוץ לסדר הטופולוגי, כך שערכי מטמון מיושנים לא יוצגו כתוצאות מוצלחות
  • הפניות נדיפות או בלתי־פתורות סטטית מכתיבות את התנהגות ה-dirty השמרנית הנדרשת לנכונות, ואילו גרפים יציבים משתמשים מחדש בעבודת התלויות הקודמת
  • קריאות חיצוניות בתוך מעבר משתמשות במטמון מדויק לפי מופע חוברת עבודה, גיליון עבודה, שורה ועמודה; נוסחה מתוכננת מבטלת את תוקף טווח הפלט שלה לפני ההערכה, כך שתלויים מאוחרים יראו את הערך החדש
  • המטמון המקומי למעבר אינו מעניק סמכות גישה למשאבים; חוברות עבודה רשומות והטוען האופציונלי בשליטת הקורא נשארים מקורות הפתרון החיים היחידים, ואחריהם מטמוני קבצים מטופוסים ו־#REF!
  • TXLSWorkspaceRecalcResult חושף האם הגרף נבנה מחדש, וכן מונים של תאים שהשתנו (dirty), תאים שהוערכו, תאים שבוטל תוקפם, מעגלים, חסימות, פגיעות במטמון והחטאות מטמון
  • הסטטוס מבחין בין הצלחה, מתאמים שאינם נתמכים, חוברות עבודה מנותקות, הפניות מעגליות, שגיאות חישוב ושינוי של סביבת העבודה במהלך המעבר
  • קריאות ל־Recalculate על אותה סביבת עבודה עוברות סריאליזציה, כך ששני סבבי חישוב לעולם אינם משנים במקביל את הגרף המשותף או את מטמוני חוברות העבודה
  • Remove או Clear יכולות לרוץ גם כאשר מעבר פעיל; המעבר שומר תמונות מצב בטוחות של המתאמים ומחזיר xlswrcWorkspaceChanged במקום לבצע dereference לרישום שהוסר
  • הרס של סביבת עבודה ממתין לסיום המעבר הפעיל שלה, ואילו הרס של חוברת עבודה רשומה מנתק את המתאם שלה וגורם לפתרון עתידי להיכשל בבטחה
  • כשלים של הטוען ותוצאות לא־נמצא נשמרים במטמון פעם אחת לכל זהות מנורמלת עד ל־ResetLoadAttempts, וחישוב שנכשל משמר מצב dirty מקומי לניסיון חוזר מפורש
  • הגרף הנשמר הופך מעבר המשך ללא שינויים לפרופורציונלי למספר חוברות העבודה הרשומות ולא למספר הנוסחאות; ניתוח רכיבים לא רקורסיבי וקשתות טווח קומפקטיות שומרות מודלים עמוקים ורחבים תחומים על ידי מטא־נתוני הנוסחאות שמומשו

ניתוק שמות מוגדרים חיצוניים

ConvertExternalDefinedNamesToRefErrors מספק את אותה פעולה ציבורית על TXLSWorkbook ועל TXLSXWorkbook; הוא מחזיר את מספר ההגדרות בהיקף חוברת עבודה ובהיקף גיליון עבודה שהוחלפו ב־#REF! מקורי

var
  Converted: Integer;
begin
  Converted := Workbook.ConvertExternalDefinedNamesToRefErrors;
  // External-link parts and ordinary cell formulas remain intact
end;
  • הבחירה ב־Classic XLS משתמשת באסימוני הפניה של BIFF לאחר הידור ובזהות חוברת התמיכה של XTI, כך שהפניות תלת־ממדיות בתוך אותה חוברת וזרמי אסימונים לא ודאיים נותרים ללא שינוי
  • הבחירה ב־XLSX משתמשת במשבצות חוברת ממוספרות עם מודעות לתחביר, לפי סדר המסמך של הקשרים, ומקבלת רק חלקי external link של חוברת עבודה — תוך הוצאה מן הכלל של DDE, OLE, משבצות לא פתורות, הפניות טבלה וטקסט בסוגריים מרובעים בתוך מחרוזות
  • כל ההחלפות מוכנות לפני השינוי הראשון ומבוצעות כפעולת כתיבה אחת; קריאה שנייה היא אידמפוטנטית
  • טקסט השם, היקף חוברת העבודה או גיליון העבודה, הנראות, ההערות, דגלי macro ו־built-in, מאפייני XLSX לא מוכרים וספריית הקישורים החיצוניים נשארים זמינים אחרי ההמרה ואחרי round-trip
  • הגדרות פגומות ולא נתמכות נשמרות כפי שהן — ברמת הבייט או הטקסט, ככל שניתן — ומוסיפות אבחון xlsDiagnosticDefinedNameConversionSkipped במקום לנחש את פשרן
  • נוסחאות תלויות מחושבות מחדש לערך השגיאה המתאים של Excel, ואילו תוצאת מטמון תקפה של נוסחה חיצונית ישירה רגילה נשארת זמינה גם אם חוברת העבודה החיה שלה מתנתקת מאוחר יותר
  • הפעולה ייחודית ל-Excel ואינה מפרשת מחדש את סמנטיקת שם־נוסחה של OpenDocument

הפניות חיצוניות ל־XLS קלאסי

בחוברות עבודה קלאסיות של XLS, קישורים חיצוניים מאוחסנים בבלוק הספרייה הגלובלית באמצעות רשומות EXTERNALBOOK ו־EXTERNNAME; HotXLS משמר ספריות אלו במהלך מחזורי קריאה/כתיבה של קבצים, ומבטיח שהפניות לטווחים מרוחקים ישרדו לולאות עריכה

יחסים חיצוניים של XLSX

עבור חוברות עבודה של OOXML, מיפוי קישורים חיצוניים מנוהל באמצעות חלקי יחסים; עיין בפרטי הממשקים התומכים להלן