Delphi - Excel grafikon képének megjelenítése egy Image komponensben

forráskód letöltése
Az MS Excel igen széleskörű támogatást nyújt a legkülönfélébb grafikonok elkészítésében. Milyen jó is lenne, ha Delphi-s alkalmazásunk szintén tudna ilyen szinten grafikonokat előállítani, saját adatbázisaink, vagy egyéb adataink alapján.
Felhasználva egy apró trükköt, erre is van lehetőségünk! Természetesen az Excel-re szükség lesz az adott gépen a mi programunk mellett, de a felhasználó észre sem fogja venni, hogy alkalmazásunk igénybe vette az Excel-t. Ő csak azt látja, hogy adataihoz programunk megjelenít egy igen látványos és tetszőleges grafikont, amilyet csak tud az Excel.
A programból készítünk egy véletlenszerű adatokat tartalmazó táblázatot, majd ugyanezen a munkalapon létrehozunk az adatokból egy grafikont is. Ezután az elkészült grafikon képét vágólapon keresztül az Image komponensbe másoljuk.
Az első lépés az, hogy csatlakozunk az Excel alkalmazáshoz, de gondoskodunk róla, hogy az ne jelenjen meg, mivel nekünk csak a háttérben kell.
    ExcelApp:=CreateOleObject('Excel.Application');
    if not VarIsNull(ExcelApp) then begin
      ExcelApp.Visible:=false;
      ...
Ezután létrehozunk egy új Excel munkafüzetet, és aktivizáljuk is azt. Ez utóbbira azért van szükség, mert a munkafüzet adatait nem a létrehozott objektumon keresztül tudjuk majd módosítani, hanem az Excel Application objektumán keresztül. Ez viszont az összes műveletet az aktív munkafüzeten hajtja végre.
Két egymásba ágyazott ciklussal készítünk egy 8x3-as táblázatot, melynek celláiban 0 és 100 közötti véletlen számokat fogunk tárolni. A számokat az ExcelApp objektum Range property-jén keresztül adhatjuk meg. A Range property tömbként használható úgy, hogy két indexet kell megadni. Mindkét index szöveges típusú, és az oszlop betűjelét, valamint a sor számát tartalmazza (pl. Range[’A1’,’B8’]).
Ha feltöltöttük a táblázatot, akkor az aktuális munkafüzet objektumát lekérdezzük egy változóba:
  WorkSheet:=WorkBook.ActiveSheet;
Ez egy Worksheet típusú objektum, amelynek ChartObjects property-jén keresztül érhetjük el a munkafüzeten található grafikonokat, illetve ezen keresztül hozhatunk létre újat az Add függvénnyel:
  ChartObj:=WorkSheet.ChartObjects.Add(20, 60, 340, 220);
A függvény paraméterei a grafikon X és Y koordinátája, valamint a szélesség és magasság. A függvény visszatérési értéke egy ChartObject típusú objektum, amely egy olyan konténer objektum, amely egy grafikont tartalmazhat. A grafikon objektumát a Chart property-n keresztül tudjuk elérni. Beállítjuk a grafikon típusát 3D oszlop diagrammra, és a SetSourceData függvénnyel megadjuk annak a táblázatnak az adatait, amelynek cellái a grafikonhoz szükséges adatokat tartalmazzák:
  ChartObj.Chart.Type:=$FFFFEFFC; { xl3DColumn }
  ChartObj.Chart.SetSourceData(ExcelApp.Range['A1','H5']);
A megjegyzésben lévő xl3DColumn a 3D oszlop diagramm azonosítója, de ha ezt használnánk, akkor szükség lenne az Excel Type Library-ra is. Ezt könnyen elkészíthetjük, de mivel általában verziófüggő, így nem javasolt a használata.
A SetSourceData függvény egy Range objektumot vár, amit legegyszerűbben a fent látható módon adhatunk meg.
Ha elkészült a grafikon, akkor a ChartObject objektum CopyPicture függvényével a vágólapra másoljuk képként, majd bezárjuk a munkafüzetet és kilépünk az Excel-ből.
  ChartObj.CopyPicture;
  WorkBook.Close(false);
  ExcelApp.Quit;
Most már csak a vágólapra másolt Windows Meta File típusú képet kell egy TMetaFile típusú objektumba másolni, ahonnan egy egyszerű Assign-nal átmásolhatjuk az Image komponensbe:
var
  mt: TMetaFile;
...
  mp.Assign(ClipBoard);
  Image1.Picture.Assign(mp);