Kezdőlap > .NET, C#, Excel, Office, WCF > Összetett Excel Add-in készítése + WCF szolgáltatás

Összetett Excel Add-in készítése + WCF szolgáltatás

2012. január 26. csütörtök Hozzászólás Go to comments

Feladat ismertetése

A következő feladatban egy WCF (Windows Communication Foundation) szolgáltatást fogunk készíteni, és ennek a szolgáltatásnak a metódusait fogjuk meghívni egy Excel Add-in-ből. A szolgáltatás segítségével el fogjuk érni a Northwind adatbázis Customer tábláját. Az Excel bővítmény segítségével lekérdezzük a Customers tábla adatait és megjelenítjük azt, illetve egy form segítségével új adatot fogunk eltárolni az adatbázisba, és és ehhez mindössze egy Excel bővítmény megírására van szükség.

Ez a feladat kicsivel hosszabb, mint a korábbiak. Amennyiben elakadnál, a feladathoz mellékelt tutorial videó segítségével végig követheted az egész folyamatot.

Az eredmény képekben

image

image

 

Előkészületek

Az alábbi két alfejezet azoknak szól, akiknek a gépén még nincs SQL Server és SQL Server Management Studio telepítve, illetve a Northwind példa adatbázis sincs létrehozva.

Akik a korábbi Export To Excel feladatot elkészítették, azoknak a feltételek már adottak.
Amennyiben a követelmények megvannak, ugorj tovább a következő fejezetre!

Adatbázisszerver telepítése

Ahhoz, hogy az alkalmazásunkat elkészítsük, szükségünk lesz egy adatbázisra is. Az adatbázis motorunk ebben az esetben a Microsoft SQL Server 2008 Express változata lesz. Ha esetleg nincs telepítve (Visual Studio 2010 alapból telepíti), akkor legegyszerűbben a Web Platform Installerrel tudjuk a telepítést elvégezni.

Web Platform Installert innen tudjuk letölteni.

Miután elindítottuk kattintsunk a Products fülre felül, majd a bal oldali menüben válasszuk ki a Database menüpontot! A listából válasszuk ki az SQL Server Express 2008 R2 változatát illetve az SQL Server 2008 R2 Management Studio Express változatát, és kattintsunk az Add gombra (Ha már telepítve van, akkor az Installed üzenet fog fogadni)! Miután hozzáadtuk a kívánt komponenseket kattintsuk az Install gombra, és a varázslót végigkövetve feltelepül az SQL Server Express 2008 R2 és a Management Studio a gépünkre.

image

Adatbázis telepítése

Ha sikerült a telepítés vagy már volt korábban is SQL Server a gépünkön, akkor már csak a példa adatbázis létrehozása maradt hátra. A feladatok elvégzéséhez mi a Northwind példaadatbázist fogjuk használni. Töltsük le a Northwind adatbázis SQL Scriptjét!

imageNorthwind példa adatbázis

SQL Script

Indítsuk el az SQL Server 2008 R2 Management Studio Express-t (vagy a számunkra megfelelő menedzsment felületet), és jelentkezzünk be az ábrán látható módon:

image

 

Amennyiben a bejelentkezés nem sikerül, abban az esetben vizsgáljuk meg a következő lehetőségeket:

·         Fut-e az SQL Server Express szolgáltatás (services.msc),

·         Van-e jogunk elérni az adatbázist,

·         Megfelelő címen és példány nevén akarjuk-e elérni az adatbázist,

·         Nincs-e valamilyen speciális tűzfal / proxy szabály, amely akadályozná a hozzáférést az SQL Serverhez?

Miután sikerült a bejelentkezés, kattintsunk a New Query gombra a bal felső sarokban, majdimage amikor bejön a Management Studio SQL Script editorja, a File menü -> Open -> Open File menüpontjárra kattintva tallózuk ki a letöltött SQL Scriptet és nyissuk meg! Ekkor az SQL Editorban fogjuk látni az SQL Script teljes tartalmát. Ezt követően nincs más dolgunk, mint az Execute gombra kattintani. A script lefut és létrehozza a Northwind adatbázist a példa adatokkal együtt.

image

Szolgáltatás elkészítése

Ebben a fejezetben egy egyszerű WCF (Windows Communication Foundation) szolgáltatást fogunk elkészíteni, amely publikálni fogja a Northwind adatbázis Customer tábláját, valamint lehetőséget biztosít arra, hogy új rekordot vigyünk fel az adatbázisba.

Indítsuk el a Visual Studio 2010 Ultimate változatát, majd kattintsunk a File -> New -> Project… menüpontra! A megjelenő ablakban állítsuk be az alábbiakat:

A jobb oldali menüből válasszuk ki a Visual C# elemet, azon belül is a Web elemet, a template listából pedig az ASP.NET Empty Web Application-t! Adjuk neki az WebNwService projekt nevet, majd kattintsunk az OK gombra!

image

Megjelenik egy üres Solution, amiben csak web.config fájl van, adjunk tehát hozzá egy WCF szolgáltatást. Kattintsunk a projektre jobb egérgombbal és válasszuk ki az Add -> New Item menüpontot! A megjelenő ablakban válasszuk a WCF Service templatet és adjuk neki az NwService nevet!

image

Miután hozzáadtuk a szolgáltatást, a Solutionünk része lesz egy INwService.cs fájl, amely egy azonos nevű interface-t tartalmaz, és egy NwService.svc / NwService.svc.cs fájlt, amely az interface megvalósítását tartalmazza, valamint a szolgáltatást ezen az svc-n (ServiceHoston) keresztül tudjuk majd elérni. Egyelőre még a szolgáltatást nem módosítjuk.

Adjunk a solution-ünkhüz egy Linq To SQL Classes-t, amely segítségével kapcsolódunk majd az adatbázishoz! Kattintsunk a Solution Explorer -ben a projektünkre, majd: Add -> New Item. A megjelenő ablakban válasszuk ki a LINQ To SQL Classes –t és adjuk neki az Nw.dbml nevet.

image

A megjelenő ablakban kattintsunk a Server Explorer linkre, melynek hatására a bal oldalt megjelenik az adott bővítmény. A Server Explorerben pedig kattintsunk a Connect To DataBase menüpontra!

image

Ha először kapcsolódunk Server Explorer-ből az adatbázishoz, megkérdezi tőlünk, hogy milyen adatforráshoz szeretnénk csatlakozni. Itt a Microsoft SQL Servert kell kiválasztani.

image

Ha már használtuk a Server Explorer-t akkor az alábbi kép fog fogadni minket, ahol meg kell adnunk az SQL Server nevét, ami ebben az esetben ez a .\SQLEXPRESS . Miután megadtuk az SQL Szerver elérést, a Select or enter a database name –nél válasszuk ki a Northwindet, majd kattintsunk az OK gombra!

image

Ekkor a Server Explorerben megjelenik a Northwind adatbázis. Bontsuk ki az elemeit, majd a Tables elemek közül fogjuk meg a Customers táblát, és helyezzük át O/R Designer ablakába! Ekkor az SQLMetal.exe a háttérben az adatbázis Customers táblájából Entitás osztályt generál, amelyeken lekérdezéseket tudunk majd megfogalmazni egyszerűen, objektum orientált módon.

image

Elkészült az adott tábla leképzése. Készítsük el a szolgáltatást!

Nyissuk meg az INwService.cs fájlt, és a bene lévő DoWork metódust töröljük ki, majd írjuk bele a következő kódsorokat:

[OperationContract]

List<Customer> GetAllCustomers();

 

[OperationContract]

void AddNewCustomer(Customer newCustomer_in);

Definiálunk két metódust: az egyik a GetAllCustomers metódus, amely egy generikus listával tér vissza, amiben Customer objektumok vannak (szerializálva tömb lesz), a másik metódus az AddNewCustomer metódus, amelynek nincs visszatérési értéke (void), de van egy paraméter, ami egy Customer objektum.

Értelemszerűen az első metódussal fogjuk lekérdezni az összes ügyfelet (Customer), a másik metódussal pedig új ügyfelet fogunk az adatbázis táblájához adni.

Valósítsuk meg ezt az interface-t! Kattintsunk az NwService.svc.cs fájlba, az osztály törzsét töröljük, majd kattintsunk az INwService interfacere és vagy a helyi menüből vagy a Ctrl + . (pont) gyors billentyűvel valósítsuk meg az interface-t!

image

Ekkor a metódusok legenerálódnak az alábbi módon:

public List<Customer> GetAllCustomers()

{

    throw new NotImplementedException();

}

 

public void AddNewCustomer(Customer newCustomer_in)

{

    throw new NotImplementedException();

}

Valósítsuk meg először a GetAllCustomers metódusát! Töröljük ki a benne lévő NotImplementedException sort, és írjuk bele a következőt:

NwDataContext db = new NwDataContext();

return (from c in db.Customers

        select c).ToList<Customer>();

Itt annyit teszünk, hogy példányosítjuk az NwDataContext –et, majd egy egyszerű Linq lekérdezés segítségével lekérdezzük az összes ügyfelet (Customer), és átalakítjuk egy generikus listává, amivel a metódus visszatér.

Az AddNewCustomer törzse a következőképpen fog kinézni:

NwDataContext db = new NwDataContext();

db.Customers.InsertOnSubmit(newCustomer);

db.SubmitChanges();

Itt is példányosítunk egy NwDataContextet (Másképp is meg lehetne oldani, de az egyszerűséget szem előtt tartva most így használjuk az NwDataContext-et), majd a Customers elem InsertOnSubmit metódusát meghívjuk, és a paraméteréül átadunk számára egy Customer objektumot. Ahhoz, hogy ez az adatbázisba is reprezentálódjon, meg kell hívnunk a SubmitChanges metódust is. Az eredmény tehát a háttérben egy SQL–es INSERT lesz, ez számunkra transzparens.

A teljes NwService osztály tehát így fog kinézni:

public class NwService : INwService

{

 

    public List<Customer> GetAllCustomers()

    {

        NwDataContext db = new NwDataContext();

        return (from c in db.Customers

                select c).ToList<Customer>();

    }

 

    public void AddNewCustomer(Customer newCustomer)

    {

        NwDataContext db = new NwDataContext();

        db.Customers.InsertOnSubmit(newCustomer);

        db.SubmitChanges();

    }

}

Most állítsuk be, hogy ezt a szolgáltatást mindig ugyanazon a címen és porton érjük el: kattintsunk a Solution Explorerben a projekt nevére (WebNwService) jobb egérgombbal, és a megjelenő menüben válasszuk ki a Properties elemet. A megjelenő ablakban válasszuk ki a Web Tab fület és a megjelenő beállítás ablakban válasszuk ki Server szekcióból a Specific Port tulajdonságot, majd adjunk neki egy tetszőleges port számot, ami az adott gépen még nem foglalt. Ebben az esetben a 8080 portot határoztuk meg a számára.

(Előfordul, hogy a Tűzfal vagy a Proxy megfoghatja az adott portot. Figyeljünk oda rá!)

image

Miután megírtuk és beállítottuk a szolgáltatást, indítsuk is el (F5)! Elindul egy development server és az adott szolgáltatást az adott porton publikálni fogja a számunkra.

Az Internet Explorerbe (vagy az alapértelmezett böngészőnkben) kb. az alábbi oldal fog megjelenni:

image

A szolgáltatásunkat megírtuk, itt az ideje a kliens add-in-t is megírni.

 

Ne kapcsoljuk ki a szolgáltatást! Fusson a háttérben!

Excel Add-in megírása

Indítsuk egy új Visual Studio 2010 -t. Kattintsunk File -> New -> Project… menüpontra, majd a megjelenő ablakban állítsuk be az alábbiakat:

A jobb oldali menüből válasszuk ki a Visual C# elemet, azon belül is az Office -> 2010 elemet, és a template listából válasszuk ki a Excel 2010 Add-in–t! Adjuk neki az ExcelDatabaseAddIn projekt nevet, majd kattintsunk az OK gombra (Figyeljünk arra, hogy a .NET Framework 4 legyen kiválasztva!)!

image

Első körben a Word Ribbon menüjéhez szeretnénk hozzáadni egy saját menüpontot. A Solution Explorerben kattintsunk jobb egérgombbal a projektre, majd az Add -> New Item menüpontra. A megjelenő ablakban válasszuk ki a Ribbon (Visual Designer) –t, és kattintsunk az Add gombra.

image

Ekkor a Visual Studio betölti a Ribbon Designer-t. Készítsük el az alábbi felhasználói felületet:

image

A Ribbon Tab Label tulajdonságának adjuk meg a „Database” szöveget, a benne található Ribbon Group Label-jét állítsuk át „Data Management”-re.

A Ribbon Groupba helyezzünk el két Ribbon Button-t! Az első a gombnak legyen a neve a btnGetAll, a Label-je az „Get All” szöveg legyen, a ControlSize tulajdonságát pedig állítsuk át RibbonControlSizeLarge-ra. Célszerű egy képet is megadni a számára: töltsük le például ezt a képet, és tallózzuk ki a számára. A második gombnak legyen a neve a btnAdd, a Label-je az „Add” szöveg legyen, a ControlSize tulajdonságát pedig itt is állítsuk át RibbonControlSizeLarge-ra. Célszerű itt is egy képet is megadni a számára: töltsük le például ezt a képet, és tallózzuk ki a számára.

A felhasználói felületünk elkészült, itt az ideje az üzleti logikát is megírnunk. Ehhez először a szolgáltatásra kell hivatkoznunk.

Kattintsunk jobb egérgombbal Solution Explorerben a References-re, majd a megjelenő helyi menüben válasszuk ki az Add Service Reference… menüpontot, és a megjelenő ablakban adjuk meg az Address-hez a következő URL címet: http://localhost:8080/NwService.svc, utána kattintsunk a Go gombra (Ha más címen van a szolgáltatás, értelemszerűen azt adjuk meg a számára)! Ekkor megtalálja a Northwind WCF szolgáltatást és annak leírását. Ezt követően a Namspacet írjuk át MyNwService-re!

image

A szolgáltatás referencia felvétele után már csak a saját kódunkat kell megírnunk. Jobb klikk a MyRibbon –on és menjünk át kódnézetbe!

A usingok közé adjuk meg a szolgáltatásunk névterét, hogy a feladat során könnyebben elérjük a benne található osztályokat, és azok metódusait.

using ExcelDataBaseAddIn.MyNwService;

A konstruktor előtt deklaráljunk egy NwServiceClient-et!

NwServiceClient dbClient;

A konstruktorban példányosítsuk a NwServiceClient-et, melynek a neve a dbClient lesz. Ezen az objektumon keresztül fogjuk meghívni a szolgáltatás publikus metódusait.

private void MyRibbon_Load(object sender, RibbonUIEventArgs e)

{

    dbClient = new NwServiceClient();

}

Térjünk vissza a MyRibbon vizuális felhasználói felületéhez, és kattintsunk a Get All gombra kétszer, és az esemény törzsébe írjuk bele az alábbi sorokat:

List<Customer> myResult = dbClient.GetAllCustomers().ToList();

 

Excel.Application x1 = Globals.ThisAddIn.Application;

x1.Cells.Clear();

 

x1.Cells[1, 1].Value2 = "Customer ID";

x1.Cells[1, 2].Value2 = "Company Name";

x1.Cells[1, 3].Value2 = "City";

 

int rowIndex = 2;

foreach (Customer item in myResult)

{

    x1.Cells[rowIndex, 1].Value2 = item.CustomerID;

    x1.Cells[rowIndex, 2].Value2 = item.CompanyName;

    x1.Cells[rowIndex, 3].Value2 = item.City;

    rowIndex++;

}

 

x1.Columns[1].AutoFit();

x1.Columns[2].AutoFit();

x1.Columns[3].AutoFit();

Az első sorban meghívjuk a szolgáltatásunk GetAllCustomers() metódusát, majd az eredményt egy generikus listává alakítjuk.

Most a szolgáltatás és a kliens egy azon gépen van. Ennek most elvileg nincs sok értelme, de gondoljunk bele abba a szituációba, hogy a szolgáltatás az adatbázist használva valahol a világ másik végén van, a kliensek pedig szétszórva a földön. A könnyebb érthetőség érdekében tekintsünk úgy a szolgáltatásunkra, hogy ő a szerver és az Excel add-inok most a kliensek, akik kapcsolódnak a szerverhez.

Ezt követően lekérjük a jelenlegi Excel alkalmazást, majd az összes cella tartalmát töröljük a Clear metódus segítségével. Elkészítjük az excelünk fejlécét, így az első sor adott oszlopaiba felvisszük az adott szövegeket, majd egy foreach ciklus segítségével végiglépkedünk a lista elemein és az adott sor meghatározott oszlopához írjuk az értékeket. Legvégül pedig meghívjuk mind a három oszlop AutoFit metódusát.

Nos, ez elég egyszerű. Indítsuk el az Excel Add-in unkat (F5), a megjelenő Excel alkalmazásban kattintsunk a Database tab fülre és kérjük le az összes adatot!

 

FIGYELJÜNK arra, hogy a szolgáltatásnak élnie kell! Ne legyen leállítva a háttérben!

 

image

Amikor a Get All gombot megnyomtuk akkor látható volt, hogy egy pillanatra megfagyott a felhasználói felület. Ez azért következet be, mert a szolgáltatást szinkron módon hívtuk meg, azaz amíg a szolgáltatás vissza nem adta a választ, addig blokkolódik a kód futása, és így a UI is (Ezt persze meglehet oldani aszinkron módon is, de az egyszerűség miatt most csak szinkron módot fogjuk megnézni)

Látható, hogy sikerült lekérni az adatokat most már csak fel szeretnénk venni új adatot az adatbázisba, és mindehhez csak Excelt használtunk, bár erre más lehetőségünk is van.

 

1. A Ribbonra elhelyezünk editboxokat, és ha feltöltöttük őket, mentjük az adatbázisba

Szűkös a ribbon menüje és elég zsúfolt tud lenni egy idő után a ribbon sáv, ráadásul elég szegényes kontrol készlettel gazdálkodhatunk.

2. Az Exelbe alakítunk ki mezőket erre a célra, és felolvassuk a tartalmukat

A kialakítása macerás, és sok feladatnál makrókat is célszerű igénybe venni, ami tovább bonyolíthatja a feladatot.

3. A task pane-t készítünk (oldalsó menüsáv)

Jó és kényelmes megoldás lehet, de az oldalsó sáv olykor keretet szabhat az összetett felviteli mezőknek.

4. Feldobunk egy ablakot

Kényelmes és megszokott megoldás. A megszokott Windows Forms (esetlegesen WPF) kontrollokból építkezhetünk. Hátrányok közt említendő, hogy ez az Office környezetből kitüremkedik.

Készítsünk egy új Windows Forms ablakot! Kattintsunk a Solution Explorer-en jobb egérgombbal, és a megjelenő helyi menüben válasszuk ki az Add -> New Item … menüpont (Az Add menüpontot alól is hozzáadható)!

image

A megjelenő ablakban válasszuk ki a Windows Forms elemet és adjuk neki a NewCustomer.cs nevet!

Állítsuk be az ablak tulajdonságait az alábbiak szerint:

· FormBorderStyle: FixedSingle

· MaximizeBox: False

· MinimizeBox: False

· Size: 300, 160

· Text: Database Add-in – New Customer

Alakítsuk ki az ablak felhasználói felületét az alábbi módon:

image

Dobjunk fel 3 labelt, 3 textboxot és két gombot, a Customer ID –hez tartozó Textbox MaxLength tulajdonságát állítsuk 5-re! A textboxok nevei legyenek a következők:

· txtCustomerId

· txtCompanyName

· txtCity

A gombok nevei pedig a btnClose és a btnSave legyenek. Ha ezzel meg vagyunk, akkor térjünk vissza az ablak (form) tulajdonságaihoz, és az AcceptButton állítsuk be btnSave-re (így ha entert nyomunk a formon a btnSavehez tartozó esemény fog lefutni), a CancelButton-t pedig btnClose-re (esc).

Kattintsunk a btnSave gombra kétszer, ekkor kódnézetben leszünk.

A néveterekez vegyük fel a szolgáltatás névterét az alábbi módon:

using ExcelDataBaseAddIn.MyNwService;

Majd a gombunk eseményvezérlőjébe írjuk a következőt:

Customer cust = new Customer()

{

    CustomerID = txtCustId.Text,

    CompanyName = txtCompanyName.Text,

    City = txtCity.Text

};

NwServiceClient serviceClient = new NwServiceClient();

serviceClient.AddNewCustomer(cust);

MessageBox.Show("OK", "Database Management", MessageBoxButtons.OK, MessageBoxIcon.Information);

this.Close();

Itt létrehozunk egy új Customer objektumot és a tulajdonságait beállítjuk a textboxokba beírt értékekre, ezt követően példányosítjuk az NwServiceClient-et, és meghívjuk az objektum AddNewCustomer metódusát, amelynek átadjuk a korábban létrehozott Customer objektumot. Ekkor egy szolgáltatáshívást kezdeményezünk az NwService felé. A kéréssel együtt utazik egy Customer objektum a hálózaton (most azonos gépen). A szolgáltatás ezt a Customert megkapja és elmenti az adatbázisba. Ha minden rendben volt, akkor egy MessageBox segítségével értesítjük a felhasználót, majd az ablakot bezárjuk.

Térjünk vissza a MyRibbon felhasználói felületére, és kattintsunk az Add gombra, az esemény vezérlőjébe példányosítunk egy NewCustomer osztályt (Formot), amelynek meghívjuk a ShowDialog metódusát.

NewCustomer newCust = new NewCustomer();

newCust.ShowDialog();

Kész az alkalmazásunk. Indítsuk el az Excel bővítményünket (F5). A megjelenő Excel alkalmazásban kattintsunk a Database tab fülre és kérjük le az összes adatot, majd kattintsunk az Add gombra. A felugró formot töltsük ki pl. az alábbi módon és kattintsunk a Save gombra:

image

Miután hozzáadtuk az új rekordot az adatbázishoz, kérjük le újra az adatbázisban található ügyfelek listáját a Get All gomb megnyomásával.

image

Elkészültünk a feladattal. Készítettünk egy WCF szolgáltatást, ami az MSSQL adatbázisból lekérdezést hajt végre, ezt egy szolgáltatás formájában publikáljuk, ebben az esetben pedig egy Excel Add-in lesz a kliens alkalmazás.

Látható ezen a példán keresztül is, hogy Office bővítményt elég egyszerű írni, ami akár egy sima web szolgáltatással is együtt tud működni.

Függelék

Bizonyos esetekben, amikor elindítjuk a Word-öt, a bővítményünk nem töltődik be, csak egyszerűen elindul a Word. Előfordulhat olykor az is, hogy maga a Template-et sem engedi betölteni. Ilyenkor az alábbi lépésekkel lehet elhárítani a hibát:

Indítsunk el egy Word alkalmazást: File -> Options -> Add-Ins. Az ablak alján válasszuk ki a COM Add-ins –t és kattintsunk a Go gombra!

image

A megjelenő COM Add-Ins ablakban a Visual Studio Tools for Office Design-Time Adapter for Word legyen bepipálva (Értelemszerűen Excelnél vagy a többi Office alkalmazásnál szintén)!

image

Másik gyakori eset, hogy elindítjuk a bővítményünket, de nem töltődik be. Ez több okból is előfordulhat, de a leggyakoribb oka az, hogy történt egy kivétel és az Office az adott bővítményt letiltotta. Ebben az esetben válasszuk ki a File menü -> Options -> Add-ins menüpontot, a Manage elemek közül pedig a Disabled Items-et, majd kattintsunk a Go gombra! A megjelenő ablakban válasszuk ki (ha létezik) azt az elemet, ami le van tiltva és kattintsunk az Enable gombra (Célszerű ezután újraindítani a Word-öt).

image

Ez a két leggyakoribb jelenség, de előfordulhat, hogy fejlesztés során mással is találkozunk. Bizonyos gépeken a Visual Studio 2010 Service Packja okozott problémát, máshol pedig a biztonsági beállítások. További hibajelenségekre választ az MSDN Office Development fórumán lehet találni.

Kategóriák:.NET, C#, Excel, Office, WCF Címke: , , , ,
  1. Még nincs hozzászólás.
  1. No trackbacks yet.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: