C# - Grafikon olvasása Excel állományból

forráskód letöltése
Cikkünkben megvizsgáljuk, hogyan jeleníthetünk meg egy Excel alkalmazásban elkészített grafikont saját Windows-os alkalmazásunk felületén. Bemutatjuk, hogyan jelölhetjük ki a megjelenítendő grafikai objektumot, és hogy milyen módszerrel konvertálhatjuk át egy Bitmap objektumba, mely már a felület PictureBox kontroljában megjeleníthető.
A grafikonok az Excel osztályhierarchiájában található Chart típusú objektumok, melyek dinamikusan létrehozhatóak, melyeknek tulajdonságai lekérdezhetőek, ugyanakkor csak bizonyos paraméterekkel hívhatóak meg azok a metódusok, melyekkel egy alkalmazás űrlapján megjeleníthetők.
A példában a mellékelt MyTest.xls állományban található grafikont és annak forrásadatait fogjuk megjeleníteni egy PictureBox kontrolban, illetve az adatokat egy táblázatban.
A mellékelt állomány eléréséhez szükséges egy példány az Excel alkalmazásból, így először azt hozzuk létre.
Excel.Application ea = new Excel.Application();
Szükségünk van egy Excel.Workbook objektumra is, mely tartalmazza a megnyitott állományt.
Excel.Workbook wb = null;
wb = ea.Workbooks.Open(Application.StartupPath + "\\MyTest.xls", m, m, m, m, m, m, m, m, m, m, m, m, m, m);
Az Open metódus első paramétere tartalmazza az állomány elérési útvonalát, a többi paraméter értéke Missing.Value.
A grafikon az állomány Munka1 nevű munkafüzetében van, így azt kell betöltenünk egy Worksheet objektumba.
Excel.Worksheet ws = (Excel.Worksheet)ea.Worksheets[1];
A grafikon alapadatait egy DataTable objektumban tároljuk el, majd megjelenítjük azokat egy DataGrid kontrolban. Ekkor cellánként kiolvassuk az adatokat úgy, hogy minden cellát egy Excel.Range objektummá konvertálunk, majd annak Text property-jét helyezzük el a DataTable egyik mezőjében.
DataRow dr = dt.NewRow();
dr[0] = ((Excel.Range)ws.Cells[3,1]).Text.ToString();
dr[1] = ((Excel.Range)ws.Cells[3,2]).Text.ToString();
dt.Rows.Add(dr);
...
A Munka1 munkafüzet első grafikonja lesz a megjelenítendő grafikon, így azt a ChartObjects metódussal kérdezhetjük le úgy, hogy egy 1 értékű object típusú objektumot adunk át paraméterként.
object index = 1;
Excel.ChartObject co = (Excel.ChartObject)ws.ChartObjects(index);
A grafikon objektumának CopyPicture metódusát használhatjuk arra, hogy a grafikont a Vágólapra másoljuk speciális formátumban.
co.CopyPicture(Excel.XlPictureAppearance.xlScreen,Excel.XlCopyPictureFormat.xlBitmap);
A paraméterek felsorol típusok, bármely más értéket választva meghiúsulhat a másolás. Ezt követően bezárjuk az Excel munkalapot, és az alkalmazást.
wb.Close(m,m,m);
ea.Quit();
A Vágólap tartalma egy IDataObject objektumba kérdezhető le.
IDataObject obj = Clipboard.GetDataObject();
Létrehozunk egy Bitmap objektumot, majd erre a formátumra konvertáljuk a kapott bináris adathalmazt.
Bitmap bmp;
bmp = (Bitmap)obj.GetData("System.Drawing.Bitmap");
A GetData metódusban szöveggel adhatjuk meg a típust, amilyen formátumba kívánjuk menteni az adathalmazt. Ezt követően átadjuk a PictureBox kontrolnak megjelenítésre.
pictureBox1.Image = bmp;