Word dokumentum generálása adatkötéssel - 6. rész: Végjáték

Az előző részekben megszerzett tudásunkat felhasználhatjuk arra, hogy kibővítsük a SharePoint lista elemekkel kapcsolatos szolgáltatásait. A WSS listák beépített funkciói közé tartozik, hogy kiválóan integrálódnak Excellel, Outlookkal és Access-szel, de a Word kimaradt a sorból. Pedig milyen szép is lenne, ha egy névjegyalbum valamelyik eleméből egy kattintással megcímzett levelet generálhatnánk! Nem is olyan nehéz...

Mivel a névjegyalbum típusú lista mezői ismertek, valamint azt is tudjuk, hogy hogyan néz ki nálunk egy levél címzése, ezért gyárthatunk egy Word sablont, meg némi extra kódot, ami a Word sablonba beírja a mezők értékeit. A kód egy ASPX oldalban fog futni, amit a _layouts mappába fogunk tenni és a felhasználó a névjegyalbum listában az egyes elemek helyi menüjéből tudja elérni.

Először tehát a korábbiak alapján készítsük el a Word dokumentumot, legyen benne minden olyan mező, amit egy levél címzésénél használni szoktunk: vezetéknév, keresztnév, város, irányítószám, utca és házszám, sőt még egy cég nevet is beletehetünk, mert olyan mező is van a névjegyalbumban. Akár így:

Sablon dokumentum

Második lépésként használjuk a korábban megismert Word 2007 Content Control Toolkitet, hogy hozzákapcsoljuk a tartalomvezérlőinket például az alábbi szerkezetű XML fájlhoz, ami a DOCX fájlon belül lesz elérhető:

    <?xml version="1.0" encoding="utf-8"?>
    <Contact xmlns="http://www.msdnkk.hu/samples/Contact">
        <FirstName>György</FirstName>
        <LastName>Balássy</LastName>
        <Company>MSDN Kompetencia Központ</Company>
        <City>Budapest</City>
        <Zip>1117</Zip>
        <Address>Magyar Tudósok krt. 2.</Address>
    </Contact>

Következő lépésben készítsünk egy ASPX oldalt, ahova a felhasználó el fog navigálni, amikor egy névjegyalbum listaelem szerkesztő menüjére kattint. Mivel az oldal a _layouts mappában fog lakni és application page lesz, származtassuk a LayoutsPageBase ősosztályból. Az oldal query string paraméterként meg fogja kapni a lista és a lista elem azonosítóját, amiből ki kell bogarászni egy SPListItem típusú objektumot, valahogy így (persze hibakezeléssel):

    private SPListItem GetListItem()
    {
        string listparam = this.Request.QueryString[ "listid" ];
        string itemparam = this.Request.QueryString[ "itemid" ];

        Guid listGuid = new Guid( listparam );
        int itemId = Int32.Parse( itemparam );
        SPList list = this.Web.Lists[ listGuid ];
        SPListItem item = list.Items.GetItemById( itemId );

        return item;
    }

Ebből az SPListItem példányból elő kell állítani a fenti XML-t, amihez én egy saját Contact osztályt használtam, ami a SharePointos típusból tudja inicializálni magát és kisorosítva épp a kívánt XML-t adja.

Meg kell írnunk azt a kódot, ami beteszi a sablonba az XML-t és visszaküldi a felhasználónak. Azt már korábban láttuk, hogyan tudunk egy XML partot betenni egy DOCX package-be. Itt most csak arra kell figyelnünk, hogy a sablon dokumentumunkból készítsünk egy munka másolatot, hiszen webes környezetben előfordulhat, hogy több felhasználó hívja meg ugyanezt az oldalt egyidőben. Ehhez feltételeztem, hogy a Word sablon dokumentumot egy WordExport nevű feature-ben fogom telepíteni. Így készül az ideiglenes munkafájl az SPUtility.GetGenericSetupPath metódus és a System.IO.Path osztály segítségével:

    string featureFolder = SPUtility.GetGenericSetupPath( @"TEMPLATE\FEATURES\WordExport" );
    string originalTemplatePath = Path.Combine( featureFolder, "Sablon.docx" );
    string currentTemplatePath = Path.GetTempFileName();
    File.Copy( originalTemplatePath, currentTemplatePath, true );

Miután beírtuk a tartalmat a munkafájlba, vissza kell küldenünk azt a felhasználónak, például így:

    this.Response.ClearContent();
    this.Response.ClearHeaders();
    this.Response.AddHeader( "content-disposition", "attachment; filename=export.docx" );
    this.Response.ContentEncoding = Encoding.UTF8;
    this.Response.TransmitFile( currentTemplatePath );
    this.Response.Flush();
    this.Response.Close();

És persze nem szabad elfeledkeznünk az ideiglenes állomány törléséről sem:

    File.Delete( currentTemplatePath );

Ezzel tehát megvan a kód, már csak telepítenünk kell, amihez természetesen előbb egy feature-t készítünk belőle! Ehhez először is egy feature.xml leíró fájlra lesz szükségünk:

    <?xml version="1.0" encoding="utf-8"?>
    <Feature xmlns="http://schemas.microsoft.com/sharepoint/" 
        Id="{63b1e30f-b4e9-4caa-b8ed-3552103f06c5}" 
        Title="Word export"
        Description="Lehetővé teszi névjegy lista elemeinek exportálását Word dokumentumba."
        Version="1.0.0.1"
        Scope="Web"
        Hidden="false"
        >
        <ElementManifests>
            <ElementManifest Location="WordExportPage.xml"/>
        </ElementManifests>
    </Feature>

A lényeg persze a WordExportPage.xml fájlba került, itt található ugyanis az exportálás menüpont hozzárendelése a névjegy lista (RegistrationId=105) elemeinek helyi menüjéhez (Location=EditControlBlock) és nézet oldali eszközsávjához (Location=DisplayFormToolbar):

    <?xml version="1.0" encoding="utf-8"?>
    <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
        <CustomAction 
            Id="MyDetailsLink"
            Title="Exportálás Wordbe"
            Description="Erre a linkre kattintva a lista elemet Word dokumentumba exportálhatja."
            RegistrationType="List"
            RegistrationId="105"
            Location="EditControlBlock"
            ImageUrl="/_layouts/images/doc16.gif"
            >
            <UrlAction Url="/_layouts/WordExport.aspx?listid={ListId}&amp;itemid={ItemId}" />
        </CustomAction>

        <CustomAction 
            Id="MyWordExportButton" 
            Title="Exportálás Wordbe" 
            Description="Erre a gombra kattintva a lista elemet Word dokumentumba exportálhatja."
            RegistrationType="List" 
            RegistrationId="105"     
            Location="DisplayFormToolbar"
            ImageUrl="/_layouts/images/doc16.gif"        
            >
            <UrlAction Url="/_layouts/WordExport.aspx?listid={ListId}&amp;itemid={ItemId}" />
        </CustomAction>
    </Elements>

Érdemes megfigyelni, hogy az UrlAction Url attribútumában a {ListId} és az {ItemId} tokenek segítségével tudjuk átadni az oldalunk számára szükséges paramétereket.

Ezt a feature-t aktiválva megjelenik a felhasználónak a névjegy lista elemein egy Exportálás Wordbe opció, melyre kattintva elnavigálhat az általunk készített WordExport.aspx oldalra, amely query string paraméterben megkapja, hogy a felhasználó melyik lista melyik elemére kattintott. Az oldal ezek alapján kibogarássza az eredeti lista elemet, majd fogja a sablon DOCX fájlt, készít róla egy másolatot a Temp mappába, beleírja a lista elem adatait, ezután visszaküldi a fájlt a felhasználónak, végül pedig letörni az ideiglenes állományt.

Mindezt szerver oldalon anélkül, hogy Office lenne telepítve a szerverre, vagy ismernünk kellene az Office objektum modelljét!

(Vége)



Balássy György (MS RD, ASP.NET MVP, MCTS)

Balássy György (MS RD, ASP.NET MVP, MCTS) Villamosmérnök, a BME Automatizálási és Alkalmazott Informatikai Tanszékén webportálok fejlesztését oktatja. 2000 óta foglalkozik a Microsoft .NET platformjával, melynek meghonosításában jelentős szerepet vállalt előadóként, konzulensként és A .NET Framework és programozása című könyv társszerzőjeként. Az MSDN Kompetencia Központon belül a Portál Technológiák Csoport vezetője, szakterülete web alapú rendszerek fejlesztése és üzemeltetése. 2004-ben Magyarországon elsőként kapta meg a Most Valuable Professional címet, majd 2005 óta a Microsoft magyarországi regionális igazgatója. Publikációi a Technet Magazinban, az MSDN Kompetencia Központ honlapján és szakmai blogjában olvashatóak.

2008.05.05. 8:55:06 | Permalink | Hozzászólások: 0 | Tárgyszavak: , ,


  • Kattintható sorú GridView

    Dávid Zoltán Az ASP.NET GridView-t vagy szereti az ember, vagy nem, én mindenesetre használom. Egész jó listázáshoz, vagy master-detailhez. Utóbbihoz valahogy Select eseményt kell tudni kiváltani a GridView egy során. Normális esetben erre egy Button vagy LinkButton elég. Felmerült, hogy lehet megoldani egy adatsor kiválasztását úgy, hogy ahhoz bárhol lehessen kattintani a soron. Végül ezt találtam a legszebbnek. Tovább »
  • Futtatás közvetlenül Solution Explorerből

    Balássy György (MS RD, ASP.NET MVP, MCTS) Az egyik futó projektünkben elég sok batch fájlt írtunk a szokásos napi feladatok automatizálásra és miután meguntam, hogy a Visual Studioból nem lehet közvetlenül futtatni ezeket, hozzáadtam egy új menüpontot a Solution Explorer helyi menüjéhez. Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások