C# - Adatok importálása többlapos Excel munkafüzetből

forráskód letöltése
E példánkban egy olyan alkalmazást készítünk, mely egy Excel munkafüzetet használ arra, hogy konfigurációs adatait beolvassa, és ennek megfelelően állítsa be a Form tulajdonságait, mint a méret, háttérszín, vagy az aktuális pozíció. Az Excel munkafüzetének egy másik lapján tetszőleges számú elnevezés-URL értékpárt tárolunk, melyek szintén megjelenítésre kerülnek a Form-on.
A mellékelt Munkafüzet1.xls-ben két munkalapon tárolunk adatokat. Az elsőre került a Form-unk néhány property-je és azok beállítandó értéke(i). A példánkban a property-ket név alapján azonosítjuk, így az Excel cellákba egyszerűen csak be kell írnunk új property-ket és hozzájuk az új értéket, vagy értékeket. A példaprogram ezt kiolvassa, és az ott leírt property-nek értékül adja az Excel táblában szereplő értéket.
A második lapon az első oszlopban webhelyek megnevezéseit soroltuk fel, míg mellettük a hozzájuk tartozó URL-t. Készítettünk az első sorban egy számlálót is, mely megmondja, hogy hány webhelyet írtunk már be az Excel táblába.
Név szerint azonosított tulajdonságok
Az alkalmazás indulásakor hívjuk meg a LoadWorkSheet01 metódust, melyben felvesszük a kapcsolatot az Excel alkalmazással, megnyitjuk a Munkafüzet1.xls állományt, majd létrehozzuk a Worksheet objektumot.
A property-k nevei a második, míg azok értékei a harmadik oszlopban vannak elhelyezve. A System.Reflection névtér osztályainak segítségével képesek vagyunk a property-ket név szerint elérni, és értékeket adni nekik. Első lépésként létre kell hoznunk egy típust a Form1 osztályból.
Type t = typeof(Form1);
A sorokon végighaladva olvassuk be a property-k neveit, és létrehozunk egy-egy példányt a PropertyInfo osztályból.
...
string property = ((Excel.Range)ws.Cells[row,2]).Text.ToString();
...
pi = t.GetProperty(property);
A beolvasott értékeket – attól függően, hogy az adott property milyen típusú – a megfelelő típusra konvertáljuk, és a SetValue metódussal értékül adjuk.
pi.SetValue(this,new Point(Convert.ToInt32(values[0]),Convert.ToInt32(values[1])),null);
A Location property esetén például a cellában megadott számpárt két számmá konvertáljuk, és egy Point struktúrába írjuk, majd ezt adjuk értékül a property-nek.
Weblapok elérése
A másik munkalap webhelyek neveit és URL-eket tartalmaz. A neveket kiírjuk a Form felületére, majd gondoskodunk arról, hogy a nevek fölött kattintva a megfelelő URL töltődjön be a megnyíló Internet Explorer böngészőbe.
A LoadWorkSheet02 metódusban a neveket, a linkeket, valamint a nevek befoglaló téglalapjának adatait egy-egy tömbbe töltjük.
texts = new string[count];
rects = new Rectangle[count]; 
links = new string[count];
for(int i=0;i<count;i++)
{
  texts[i] = ((Excel.Range)ws.Cells[i+4,1]).Text.ToString();
  links[i] = ((Excel.Range)ws.Cells[i+4,2]).Text.ToString();
  SizeF s = this.CreateGraphics().MeasureString(texts[i],this.Font);
  rects[i] = new Rectangle(left,top,(int)s.Width,(int)s.Height);
  top = top + (int)s.Height + 5;
}
Az OnPaint metódusban jelenítjük meg a szövegeket úgy, hogy kiolvassuk az aktuális tömbelemet.
for(int i=0;i<count;i++)
{
  SizeF s = e.Graphics.MeasureString(texts[i],this.Font);
  e.Graphics.DrawRectangle(new Pen(new SolidBrush(this.BackColor)),rects[i]);
  e.Graphics.DrawString(texts[i],Font,new SolidBrush(Color.Blue),rects[i].X+2,rects[i].Y + (rects[i].Height-s.Height)/2);             
}
A PointInRect metódusban ellenőrizzük le, hogy az egérgomb lenyomásakor a pont koordinátái benne vannak-e a téglalapok valamelyikében. Ha a metódus igaz értékkel tér vissza, akkor a kurzor formája egy kézre változik (Cursors.Hand).
A feliratra kattintva elérhetjük, hogy a kapcsolódó URL-en található webhely betöltődik a megnyíló böngészőben. Ehhez létre kell hozni a böngésző objektumait.
private  SHDocVw.InternetExplorer FIE = null;
private  IWebBrowserApp FWebBrowser = null;
...
FIE = new SHDocVw.InternetExplorer();
FWebBrowser = (IWebBrowserApp) FIE;  
Ezek eléréséhez a Microsoft Internet Controls COM komponenst, mint referenciát a projekthez kell adni.
Az egérgomb lenyomáskor a böngészőpéldányt láthatóvá tesszük, és a Navigate metódussal megnyitjuk az URL-t.
FWebBrowser.Visible = true;
FWebBrowser.Navigate(links[num], ref o, ref o, ref o, ref o);
Az alkalmazás bezárásakor az Internet Explorer példány is bezárásra kerül.