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: , ,


  • Ajaxos fájl feltöltés

    Balássy György (MS RD, ASP.NET MVP, MCTS) Időnként felmerül, hogy jó lenne úgy feltölteni egy fájlt, hogy közben az oldal többi része nem változik, magyarul Ajaxosan. Rossz hírem van, az XMLHttpRequest objektum Level 1 változata ezt nem tudja, tehát ha régebbi böngészőkre is tekintettel kell lennünk, akkor nincs mese trükközni kell. Tovább »
  • Az STSADM parancsainak kibővítése

    Balássy György (MS RD, ASP.NET MVP, MCTS) A SharePoint üzemeltetők vagy a parancssoros megoldásokat kedvelők számára az STSADM igazi kincsesbánya a maga több, mint száz parancsával. Már a WSS-ben is 111 van belőlük, egy MOSS Enterprise változaton pedig összesen 184-et sikerült összeszámolnom. A dolog érdekessége, hogy ezt nem úgy oldották meg a fejlesztők, hogy a nagyobb változatnál más az stsadm.exe fájl, hanem úgy, hogy kiterjeszthetővé tették az eszközt. Íme a bizonyíték. 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