מאמר טכני

תרשימים, תמונות ואובייקטי ציור ב-HotXLS עבור Delphi

ב-HotXLS, ספריית גיליונות האלקטרוניים הנייטיבית של losLab עבור Delphi ו-C++Builder, גרפיקה ואובייקטי ציור מטופלים שונה בין שתי המשפחות. שמיים הקונטיינרים עצמם: XLS ו-XLSX

שתי משפחות קונטיינר, שתי מערכות ציור

ב-XLSX, תרשימים ותמונות חיים בשכבת DrawingML שמוגדרת ב-ECMA-376. ב-XLS הם שוכנים ב-OfficeArt, המבנה הבינארי הישן של BIFF8. שתי המשפחות חושפות ממשק API מסודר, אבל הנתונים הבסיסיים שונים, וחשוב לזכור זאת בעת מעבר בין פורמטים

הטמעת תרשים ב-XLSX

בצד XLSX, TXLSXWorkbook חושף אוסף Charts על כל גיליון. כל תרשים מוטמע מוחזק בתוך TXLSXChart עם שדות לטווח הנתונים, סוג התרשים ועוגן ה-DrawingML שלו. אפשר לאחזר, לבדוק ולכתוב את הנתונים הללו, אך לא ליצור תרשים מאפס: HotXLS משמר אובייקטי תרשים קיימים אך אינו כולל מנוע בנייה של תרשימים

תמונות ב-XLSX: מידות EMU

תמונות ב-XLSX נמדדות ב-EMU — יחידות מטרה אנגליות. יחידה אחת EMU שווה ל-1/914400 אינץ'. TXLSXPicture חושף WidthEmu ו-HeightEmu יחד עם הנתונים הבינאריים של התמונה. כדי לחשב פיקסלים ל-EMU השתמש ב-Round(Pixels * 914400 / DPI). עבור תמונות ברזולוציית 96 DPI, פיקסל אחד שווה בערך 9525 EMU. אם תציין מימדים שגויים, התמונה תשתרע מעבר לגבולות התא בעת פתיחה ב-Excel

גיליונות תרשים וצורות ב-XLS

בצד XLS, תרשימים יושבים על גיליונות תרשים ייעודיים, לא מוטמעים בגיליון עבודה. IXLSWorkbook.Sheets מחזיר גם גיליונות עבודה וגם גיליונות תרשים; השתמש ב-IXLSSheet.SheetType כדי להבחין ביניהם. צורות מוחזקות ב-IXLSSheet.Shapes, וניתן לאחזר אותן ע"י index. OfficeArt blob עוברת round-trip שלמה: HotXLS קורא ושומר אותה ללא שינוי, ולכן עריכה ושמירה ב-XLS לא תאבד גרפיקה

צבעי נושא

שני הפורמטים תומכים בצבעי נושא. ב-XLSX, TXLSXTheme מחשוף 12 צבעי נושא כ-RGB values. ב-XLS, צבעי הפלטה מאוחסנים ב-IXLSWorkbook.ColorPalette. כאשר אתה מעביר קובץ מ-XLS ל-XLSX ע"י SaveXLSWorkbookAsXLSX, צבעי הנושא עשויים להשתנות כי שתי המערכות אינן זהות

יציבות עוגנים

ב-XLSX, כל תמונה ותרשים מעוגנים לתא דרך TwoCellAnchor או OneCellAnchor. כאשר InsertRows פועל מעל הגרפיקה, DrawingML מעדכן את מיקום העוגן אוטומטית. ב-XLS, OfficeArt shapes מעוגנות ל-row/column coordinates בינאריות שאינן מעודכנות ע"י InsertRows, ולכן אם אתה מוסיף שורות מעל תמונות ב-XLS, תצטרך לעדכן את מיקומן ידנית

HotXLS קומפל לתוך שירות Delphi או C++Builder שלך ללא תלויות חיצוניות; מהדורות ורישוי זמינים בדף HotXLS Component

דוגמאות קוד נוספות

var
  Book: TXLSXWorkbook;
  Sheet: TXLSXWorksheet;
  Chart: TXLSXChart;
begin
  Book := TXLSXWorkbook.Create;
  try
    Sheet := Book.Sheets.Add('Sales');
    Sheet.Cells[1, 1].Value := 'Region';
    Sheet.Cells[1, 2].Value := 'Revenue';
    Sheet.Cells[2, 1].Value := 'East';
    Sheet.Cells[2, 2].Value := 1184350;
    Sheet.Cells[3, 1].Value := 'Central';
    Sheet.Cells[3, 2].Value := 902210;
    Sheet.Cells[4, 1].Value := 'West';
    Sheet.Cells[4, 2].Value := 1010675;

    // Frame anchored to rows 6..22, columns 1..8
    Chart := Sheet.AddChart(xlsxChartColumn, 'Revenue by Region', 6, 1, 22, 8);
    Chart.AddSeries('Revenue', 'Sales!$A$2:$A$4', 'Sales!$B$2:$B$4');
    Chart.ValueAxisTitle := 'USD';

    Sheet.AddImageFromFile(1, 5, 'logo.png');
    Book.SaveAs('dashboard.xlsx');
  finally
    Book.Free;
  end;
end;
var
  Book: IXLSWorkbook;
  Data, Trend: IXLSWorksheet;
  Series: array[0..0] of TXLSChartSeriesInfo;
begin
  Book := TXLSWorkbook.Create;   // interface-counted: do not Free
  Data := Book.Sheets.Add;
  Data.Name := 'Data';
  Data.Cells.Item[1, 1].Value := 'Month';
  Data.Cells.Item[1, 2].Value := 'Units';
  Data.Cells.Item[2, 1].Value := 'Apr';
  Data.Cells.Item[2, 2].Value := 1530;
  Data.Cells.Item[3, 1].Value := 'May';
  Data.Cells.Item[3, 2].Value := 1721;

  Series[0].Name := 'Units';
  Series[0].Categories := 'Data!$A$2:$A$3';
  Series[0].Values := 'Data!$B$2:$B$3';
  Trend := Book.Sheets.AddChartSheet('Trend', xlsChartTypeLine,
    'Units sold', 'Month', 'Units', Series);
  // Trend is a chart substream: never call cell methods on it

  Data.Shapes.AddTextBox('Source: ERP nightly export', 6, 1, 8, 4);
  Data.Shapes.AddPicture('approved-stamp.bmp');
  Book.SaveAs('trend.xls');
end;