Delphi - Excel grafikonokat megjelenítő komponens készítése

forráskód letöltése
Készítünk egy komponenst, amely segítségével Delphi alkalmazásunkban könnyen megjeleníthetjük egy megadott Microsoft Excel munkafüzet bármely grafikonját. A grafikon szerepelhet külön munkalapon, vagy lehet egy munkalapon belüli, beágyazott grafikon is. Megadhatjuk azt is, hogy a komponens milyen időközönként frissítse a grafikon képét. Ezáltal a változásokat is, folyamatosan nyomon követhetjük.
A mellékelt példaprogram megnyitása előtt az ExcelChartView.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A példaprogram kipróbálása során, az egyes mezőkben a következő értékeket használhatjuk:
Munkalap: Munka1, Grafikon index: 1-2.
Munkalap: ’’, Grafikon index: 1.
A komponens hasonlóan működik, mint a TImage. Be kell állítanunk a megfelelő property-ket, majd a komponens megjeleníti a kért grafikont. A grafikon képe futási és szerkesztési időben is megjeleníthető.
A komponens használatához első lépésben meg kell adnunk azt az XLS munkafüzetet, amelyhez csatlakozni szeretnénk. Ezt a WorkBook property-n keresztül tehetjük meg.
A Microsoft Excel-ben kétféle grafikon létezik, különálló és beágyazott. A különálló grafikon egy külön munkalapon szerepel, teljesen egyedül. A beágyazott grafikonok pedig egy olyan munkalapon jelennek meg, ahol rajtuk kívül más is szerepelhet. Az összes grafikon elérhetősége szempontjából ezt a két típust kell megkülönböztetnünk.
A ChartIndex property értéke azonosítja a grafikont, mindkét esetben. A property a grafikon indexét jelenti. Az indexelés 1-el kezdődik.
Azt, hogy különálló vagy beágyazott grafikont akarunk megjeleníteni, a WorkSheet property értéke határozza meg. Ha az értékét üres String-re, azaz ’’-re állítjuk, akkor a különálló grafikonokkal foglalkozunk. Ha beágyazott grafikonokkal akarunk dolgozni, akkor a property-ben meg kell adnunk a grafikont tartalmazó munkalap nevét.
A komponens rendelkezik azzal a képességgel, hogy a grafikon képét automatikusan frissíti. Az automatikus frissítést a RefreshActive property értékének igazra vagy hamisra állításával kapcsolhatjuk be vagy ki. A frissítések között eltelt időt a RefreshInrerval property értéke határozza meg, ezredmásodpercekben.
A komponens Refresh metódusát meghívva, mi is bármikor kérhetünk frissítést.
A megjelenő grafikon méretét a komponens mérete határozza meg.
A komponens elkészítése
A komponenst a TGraphicControl osztályból származtatjuk.
Az időzítést egy TTimer objektum segítségével valósítjuk meg. A DoTimer metódus lesz az, ahol megnyitjuk a megadott munkafüzetet, majd kiolvassuk belőle a megfelelő grafikon képét.
Az Excel programhoz és objektumaihoz, OleVariant (ComObj unit) típusú változók segítségével kapcsolódunk.
Már a komponens Create metódusában csatlakozunk az Excel programhoz.
FExcelApp:=CreateOleObject('Excel.Application'); 
A teljes kapcsolatot csak a Destroy metódusban bontjuk.
FExcelApp.Quit;
DoTimer metódus
procedure TExcelChartView.DoTimer(Sender: TObject);
Egy Excel munkafüzetet az Open metódus meghívásával nyithatunk meg.
ExcelWorkBook:=FExcelApp.WorkBooks.Open(FileName:=FWorkBook, ReadOnly:=True);
A grafikon kiválasztását a WorkSheet property értékének megfelelően tesszük meg.
Ha a grafikon külön munkalapon szerepel, akkor a következő módon érhetjük el.
if ExcelWorkBook.Charts.Count>=FChartIndex then begin
  Chart:=ExcelWorkBook.Charts.Item[FChartIndex];
Ha beágyazott grafikonról van szó, akkor egy kicsit többet kell gépelnünk.
if ExcelWorkBook.WorkSheets.Item[FWorkSheet].ChartObjects.Count>=FChartIndex then begin
  Chart:=ExcelWorkBook.WorkSheets.Item[FWorkSheet].ChartObjects.Item[FChartIndex].Chart;
A kiválasztott grafikont a vágólapon keresztül jelenítjük meg, komponensünk Canvas-án.
Egy Chart objektum képét a CopyPicture metódussal helyezhetjük el a vágólapon.
Chart.CopyPicture;
A vágólap használatához szükségünk van a Clipboard unitra is.
A vágólapon elhelyezett képet egy TImage objektumba másoljuk.
Image.Picture.Assign(Clipboard);
Töröljük a Canvas-t.
Canvas.FillRect(Rect(0,0,Width,Height));
Az Image objektumban levő képet egyszerűen átmásoljuk a Canvas-ra, úgy, hogy a komponens mérete határozza meg a megjelenő grafikon képét.
Canvas.StretchDraw(Rect(0,0,Width-1,Height-1),Image.Picture.Graphic);
Végül bezárjuk a megnyitott munkafüzetet.
ExcelWorkBook.Close;