C# - Excel sablonok kitöltése WebService által szolgáltatott adatokkal

WebService elérése Office alkalmazásokból 2. rész

forráskód letöltése
A sorozat ezt megelőző számában bemutattuk, hogyan teremthetünk kapcsolatot Microsoft Word alkalmazásunk és egy Web szerviz közt úgy, hogy egy makróból hívjuk meg a szerviz metódusait, és a kapott adatokkal megcímzünk egy faxborító sablont. Mai cikkünkben azt vizsgájuk meg, hogy miként tehető ez meg Excel alkalmazásból. A mellékelt példában egy munkafüzet sablont fogunk kitölteni tekintélyes mennyiségű adattal.
Mellékelt példa megnyitása előtt szükséges egy OfficeService02 nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez nyissa meg a mellékelt mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
A mellékelt példa használatához el kell végeznünk bizonyos beállításokat. Ehhez olvassa el a Kezdeti beállítások című fejezetet.
Kezdeti beállítások
A példához szükséges az OfficeDb adatbázis, melyet a példa mappájának Database alkönyvtárában megtalálható Run_script.cmd BATCH állomány lefuttatásával hozhatunk létre. Az OfficeDb.sql script 5. sorában adja meg helyesen a létrehozandó adatbázisfájlok mappájának nevét és elérési útvonalát.
Az adatbázis megalkotása után meg kell bizonyosodnunk arról, hogy a feladathoz szükséges Excel sablon megtalálható-e az MS Office alkalmazáscsomag valamely almappájában. Alapértelmezésben a következő mappában található: <winroot>:\Program Files\Microsoft Office\Templates\1038, és az Invoice.xlt, vagy a Sales Invoice.xlt nevet viseli. Amennyiben a sablon nem érhető el a megfelelő helyen, akkor az Office programcsomag telepítőkészletét felhasználva fel kell azt telepíteni, vagy felhasználni a mellékelt mappa EmptyTemplate alkönyvtárában elhelyezett Invoice.xlt állományt. A makro használatakor a Form szövegmezőjében meg kell adni az állomány elérési útvonalát. Ellenkező esetben a művelet hibaüzenettel befejeződik.
A példaalkalmazás mappájában elhelyezett Macro alkönyvtár tartalmazza annak a makrónak a kódállományait, melyből a Web szerviz alkalmazásunkat elérhetjük, és metódusainak meghívásával végül kitölthetjük az említett sablon mezőit. Amennyiben nem kívánunk makrót telepíteni, használjuk fel a Macro almappa Worksheet_with_macro.xls nevű állományt, melyet meg kell nyitni, és az Eszközök menüből ki kell választani a Makró pontot, majd az almenüből a Makrók almenüpontot ahhoz, hogy a makrót indíthassuk.
Telepítés esetén kicsit hosszabb a művelet. Ehhez el kell indítani a beépített Visual Basic makró-szerkesztő kisalkalmazást, és a Module1.bas, valamint UserForm1.frm állományokat importálnunk kell egy új projektbe.
A makró futtatásához a Run menüben ki kell választanunk a Run Makro pontot, vagy meg kell nyomnunk az F5 nyomógombot. Elindítva a makrót annak Form-ján megadhatjuk a sablonállomány elérési útvonalát, majd a listából kiválaszthatunk egy elemet. A MEGCÍMEZ gombbal indítható a művelet.
WebService jellemzői
A Web szerviz alkalmazásunk csak abban különbözik a korábbi verziótól, hogy az adatbázis kapcsolatot megvalósító SqlConnection komponens az OfficeDb adatbázis Table1 táblájából kéri az adatokat.
A szerviz két metódussal rendelkezik. Az első metódus (GetCustomerIDs) visszatérési értékként egy karakterlánc tömböt ad vissza, mely tartalmazza a Table1 táblában található rekordok CustomerID oszlopértékeit, melyeket megjelenítünk a makrónk Form-ján.
[WebMethod]
public string[] GetCustomerIDs()
{
  ...  
}
A szerviz másik metódusával (GetParticulars) a Table1 tábla egy rekordjának elemeit kaphatjuk vissza, paraméterként adva meg, hogy melyik azonosítóval rendelkező elem legyen az.
[WebMethod]
public string[] GetParticulars(string id)
{
  ...
}
Makró UserForm1 objektuma
A UserForm1 objektum kódjában kell megvalósítanunk azt, hogy a szerviz első metódusa a Form inicializációjakor végrehajtódjon, és az azonosítók bekerüljenek a Form-ra helyezett ListBox kontrolba.
Private Sub UserForm_Initialize()
  Dim oSOAPClient As Object
Létrehozzuk a SoapClient objektumot:
  Set oSOAPClient = CreateObject("MSSOAP.SoapClient")
Megadjuk a szerviz alkalmazásunk URL-jét:
  oSOAPClient.mssoapinit "http://localhost/OfficeService02/Service1.asmx?wsdl", "Service1", "Service1Soap"
Lekérdezzük egy karakterlánc-tömbbe az azonosítókat:
  Dim arrTemp() As String
  arrTemp = oSOAPClient.GetCustomerIDs()
Majd a tömb elemeit egy ciklussal bedolgozzuk a ListBox kontrolba:
  For i = 0 To UBound(arrTemp)
    ListBox1.AddItem arrTemp(i)
  Next
End Sub
Makró Module1 objektuma
A makrónk Module1 objektumában létrehozunk egy metódust, mely paraméterként megkapja a listából kiválasztott azonosítót, és ezt az azonosítót a átadja a szerviz metódusának, mely az adott rekord oszlopaiban megtalálható értékekkel tér vissza.
Sub GenerateForm(sID As String)
  ...
A SoapClient objektumra itt is szükség van:
  Set oSOAPClient = CreateObject("MSSOAP.SoapClient")
  oSOAPClient.mssoapinit "http://localhost/OfficeService02/Service1.asmx?wsdl", "Service1", "Service1Soap"
A metódus eredménye itt is egy tömbbe kerül:
  arrTemp = oSOAPClient.GetParticulars(sID)
A sablonhoz szükségünk van egy Excel munkafüzet-objektumra:
  Dim oBook As Excel.Workbook
A Form TextBox kontroljában meg kell adni ennek a Template objektumnak a fizikai elérési útvonalát. Ezt a karakterláncot adjuk át az Excel objektumnak:
  Set oBook = Application.Workbooks.Add(UserForm1.TextBox1.Text)
A MS Office 2000 és 2002 (XP) verzióiban működik a makró, azonban a sablon celláit más és más elnevezéssel illeti a két verzió, így mindkét variációra megoldottuk a kitöltést úgy, hogy a Range tömb elemire való hivatkozáskor eltérő nevet adtunk meg:
  With oBook.ActiveSheet
    If Application.Version = "10.0" Then
      .Range("L4").Value = arrTemp(0)
      ...
    ElseIf Application.Version = "9.0" Then
      .Range("NO").Value = arrTemp(0)
      ...
    End If
  End With
Exit Sub
A metódust a Form felületén elhelyezett gomb lenyomásakor hívjuk meg a ListBox kontrolban kiválasztott elemmel a paraméterében:
GenerateForm ListBox1.List(ListBox1.ListIndex)
A művelet végén megkapjuk a kitöltött sablont.

WebService elérése Office alkalmazásokból cikksorozat

Template dokumentumok címzése WebService által szolgáltatott adatokkal - WebService elérése Office alkalmazásokból 1. rész

Excel sablonok kitöltése WebService által szolgáltatott adatokkal - WebService elérése Office alkalmazásokból 2. rész