מאמר טכני

עריכת תרשימי Excel בלי לאבד ChartML ב-HotXLS

HotXLS שומר את ה-ChartML המקורי של תרשים Excel מיובא ומשמיע אותו בייט-לבייט כששום דבר במודל המוקלד לא השתנה, כך שפתיחה ושמירה מחדש של חוברת עבודה אינה מפשיטה בשקט את החלקים של תרשים שמודל האובייקט אינו מייצג. ערוך כותרת, סדרה או ציר ו-HotXLS ממזג מבנית את הצמתים המוקלדים החדשים לתוך העץ המקורי במקום לייצר את התרשים מאפס

ההבחנה הזו — השמעה כשלא נוגעים, מיזוג כשעורכים — היא מה שהופך יישום דלפי לבטוח להפנות אל תרשימים שאנליסט בנה ב-Excel. ייצור תרשים מחדש ממודל מוקלד תמיד מאבד את מה שהמודל אינו יודע עליו, ותרשימי Excel מלאים בדברים שספרייה אינה יודעת עליהם: סגנונות מותאמים אישית, רשימות הרחבה, ענפי תוכן חלופיים, עיצוב מוסמך-מרחב-שמות מתוספים

למה שמירה מחדש של חוברת עבודה משטחת את התרשימים שלה?

מפני שהמימוש הרגיל קורא את מה שהוא מבין וכותב את מה שהוא מבין. כל מה שביניהם — extLst מגרסת Excel חדשה יותר, ענף mc:AlternateContent, אפקט צורה שלמודל אין מאפיין עבורו — קיים בקובץ, אין לו בית במודל האובייקט, ונעלם בזמן השמירה. המשתמש רואה תרשים שאיבד את הגרדיאנט שלו, את תוויות הנתונים המותאמות שלו או את אפקט התלת-ממד שלו, וחוברת העבודה אינה יכולה להסביר למה

כש-PreserveUnsupportedParts מופעל על חוברת העבודה, HotXLS מאחסן את בייטי ה-UTF-8 המקוריים של התרשים בייבוא יחד עם אורך וטביעת-אצבע 64-סיביות של התוכן הממודל. אם המודל המוקלד לא השתנה עד זמן השמירה, הוא כותב את הבייטים המקוריים בחזרה. ללא סידור-מחדש של XML, ללא סחף רווחים לבנים, ללא עותק UTF-16 תושב של התרשים תלוי בזיכרון עבור תרשים שאף אחד לא ערך

var
  Workbook: TXLSXWorkbook;
  Chart: TXLSXChart;
begin
  Workbook := TXLSXWorkbook.Create(nil);
  try
    Workbook.PreserveUnsupportedParts := True;   // set before Open
    Workbook.Open('quarterly-review.xlsx');
    Chart := Workbook.Sheets[1].Charts[0];   // Sheets[] is 1-based
    if Chart.HasPreservedXml then
      Log('original ChartML retained; untouched charts replay exactly');
    Chart.Title := 'Revenue by region, Q3 2026';  // now the merge path runs
    Workbook.SaveAs('quarterly-review-out.xlsx');
  finally
    Workbook.Free;
  end;
end;

מה המיזוג שומר ומה המודל מחזיק בו

הכלל הוא בעלות. צמתים ציבוריים של המודל — כותרת, סדרות, מטמונים, קבוצות plot, צירים — מוכרעים על ידי העץ שזה עתה נוצר. תת-עצים לא-ממודלים מועברים מהמקור. אי-סימטריה זו מכוונת, והיא החלק שלוקח רגע להפנים: מחיקת סדרה אסור שתקים לתחייה את הסדרה הישנה מתוך ה-XML השמור, כך שכל דבר שהמודל מחזיק בו נלקח מהמודל גם כשהמודל אומר "נעלם"

תוכן לא-בעלות מוכנס מחדש ליד הצמתים התואמים שישב לידם, ו-extLst נשאר אחרון בתוך ההורה שלו מפני ששם הסכמה דורשת אותו. ניקוי מאפיין מוכר — הסרת דגל מודגש, השמטת צבע — מטופל כניקוי, לא כפער שיש למלא מהעץ המקורי. מאפיינים לא-מוכרים באותו השכונה שומרים על מקומם

תוכן markup-compatibility מקבל טיפול ספציפי. בניתוח, HotXLS מדלג על mc:Choice וקורא את mc:Fallback; אם אותו ענף חלופי עוטף קבוצת plot שהמודל מכיר, המיזוג כותב את התוכן המוקלד החדש בחזרה לתוך תת-העץ החלופי. בלי צעד זה שמירה הייתה פולטת את קבוצת ה-plot החדשה ומשאירה את הישנה בתוך החלופי, והתרשים היה נושא שתיים

ביטול שימור עבור תרשים אחד

ClearPreservedXml משמיט את ה-XML המקורי וטביעת-האצבע עבור תרשים אחד, כך שהשמירה הבאה בונה את אותו תרשים טהור מהמודל המוקלד. זוהי החלטה לכל-תרשים; PreserveUnsupportedParts ברמת חוברת העבודה עדיין שולטת האם מצב שימור נבנה בייבוא

הגע אליו כשאתה רוצה תרשים נקי במקום נאמן — למשל כשתרשים תבנית נושא עיצוב מערכת נושא ארגונית ישנה והעניין של הפעולה הוא להשליכו. אל תגיע אליו כהיגיון ניפוי: תרשים שמרונדר שגוי לאחר עריכה הוא לעיתים קרובות יותר שאלת מידול מאשר שאלת שימור, וניקוי ה-XML השמור הורס את הראיה

תרשימי קומבינציה והציר השני

AddPlotGroup בונה תרשימי קומבינציה מסודרים, שבהם כל קבוצת plot שומרת על משפחת התרשים שלה ועל הקצאת הציר הראשי או המשני שלה. זה מה שתרשים העסקים האוביקוויטורי זקוק לו: הכנסה כעמודות על הציר השמאלי, אחוז מרווח כקו על הימני

תרשימים חושפים צירי קטגוריה וערך ראשיים ומשניים בתוספת ציר סדרה, עם הגדרות מוקלדות של קטגוריה, ערך, תאריך וציר-סדרה שמכסות מיקומים, מזהים, הצטלבויות, יחידות תאריך, מרווחי תווית ותצוגה. ה-API השטוח הישן — ChartType, AddSeries, אוסף Series השטוח — עדיין פונה לקבוצת ה-plot הראשית, כך שקוד קיים ממשיך לעבוד בעוד המודל מתחת מחזיק כל קבוצה מסודרת

var
  Chart: TXLSXChart;
  Line: TXLSXChartPlotGroup;
begin
  // Column chart anchored over rows 1..15, columns 5..12
  Chart := Sheet.Charts.Add(xlsxChartColumn, 'Revenue and margin',
    1, 5, 15, 12);
  Chart.AddSeries('Revenue', 'Data!$A$2:$A$13', 'Data!$B$2:$B$13');
  // Second plot group: a line, read against the secondary value axis
  Line := Chart.AddPlotGroup(xlsxChartLine, xlsxAxisSecondary);
  Line.AddSeries('Margin %', 'Data!$A$2:$A$13', 'Data!$C$2:$C$13');
end;

לפני שמודל זה התקיים, פתיחה ושמירה מחדש של תרשים קומבינציה קרסה אותו למשפחת תרשים אחת ואיבדה את הצירים המשניים, התאריך והסדרה. הפניות נוסחאות תרשים וערכי סדרה במטמון עתה שורדים העתקות חוברת עבודה ומחזורי פתח/שמור גם כן, ועוגני תרשים מותאמים לחלקי התרשים שלהם לפי מזהה קשר — כך שיישום שמסדר מחדש רשומות קשר כבר אינו מחליף תוכן תרשים בין מיקומי גיליון עבודה

מלכודת ה-layout הידני

אם אתה ממקם אזור plot, כותרת, כותרת ציר או מקרא ביד, כתוב את כל ארבע הקואורדינטות. Office דורש x, y, w ו-h כקבוצה שלמה בכל פעם שאחד מהם נוכח, ומתעלם מכל ה-manualLayout אחרת. HotXLS תמיד פולט את המלבן המלא מסיבה זו, ו-SetPositionAndSize מגדיר ומפעיל אותו בקריאה אחת

שני פרטים נוספים עוקבים אחר Excel במקום אחר החופש המלא של המפרט. מיקום נכתב עם xMode ו-yMode מוגדרים ל-edge בעוד גודל משתמש ב-factor עבור wMode ו-hMode, מפני שזה מה ש-Excel כותב ולמה הוא ממיר קומבינציות אחרות. ו-layoutTarget נפלט רק עבור אזור ה-plot, לעולם לא עבור כותרות או מקרא, שם הערות המימוש של Microsoft אוסרות עליו

שילוב זה במעבר-הלוך של חוברת עבודה

שימור תרשים הוא מופע אחד של מדיניות כללית: ספרייה שעורכת מסמכים שנוצרו במקומות אחרים צריכה לשנות את מה שהתבקשה לשנותו ושום דבר נוסף. אותו היגיון מניע את HotXLS על ערכות נושא, שרשראות חישוב והרחבות גיליון עבודה, המתוארות בהערות על מעברי-הלוך ללא-איבוד לערכת נושא, extLst ו-calcChain, ועל פרויקטי VBA וקישורים חיצוניים בשימור VBA וקישורים חיצוניים. למשטח ה-authoring של תרשימים עצמו — יצירת תרשימים, הצבת תמונות ושרטוטים מדלפי — ראה הסקירה של תרשימים, תמונות ושרטוטים ב-HotXLS

HotXLS קורא, עורך וכותב תרשימי XLSX מקוד דלפי ו-C++Builder מקורי ללא התקנת Excel על המכונה, מה שהופך את הנאמנות לבעיית ספרייה במקום בעיית אוטומציה — דף רכיב הגיליון האלקטרוני HotXLS מכיל את רשימת תכונות התרשים והורדת ניסיון