Word dokumentum generálása adatkötéssel - 2. rész: Új remény

Ahogy az előző részben megállapítottuk, a Word 2007 alapértelmezett Open XML fájl formátumainak programozott módon történő közvetlen kezelése nem éppen kellemes élmény. Bár kapunk támogatást a fájl kibontásához és a részek eléréséhez, sőt az egyes részek tartalmát is tudjuk szerkeszteni, ez utóbbinak a megalkotása során váratlan akadályokba ütközhetünk. Mindennek pedig az az oka, hogy a Word ML nyelvben a tartalom, azon belül is a sok sallang között a dokumentum információtartalma és a megjelenítés bizony elég erősen keveredik.

A szétválasztásra szerencsére van lehetőség, és a megoldás lelke természetesen az XML.

1. Custom XML

Ha már a Word XML támogatása szóba került, mindenképpen meg kell említenünk a Custom XML szolgáltatást, amely már megvolt a Word 2003-ban is és lényegében nem is változott a 2007-es verzióban. Ennek a funkciónak a lényege, hogy a dokumentumunkhoz hozzárendelünk egy XSD sémát, majd definiáljuk, hogy melyik szövegrész melyik XML elemnek felel meg. Végül a Word Mentés ablakában kiválasztjuk, hogy nem az egész dokumentumot akarjuk menteni Word formátumban címestül, bekezdésestül, formázásostul, hanem csak az információk alapján előállított nyers XML-t.

Ennek a szolgáltatásnak tehát az a célja, hogy a szövegből ki tudjuk nyerni a lényegi információt, mellőzve minden körítést. A módszer sajnos nem alkalmas dokumentum előállítására, a mentéskor előálló XML és az eredeti dokumentum között nincs kapcsolat és nem tudok olyan módszerről, ami lehetővé tenné, hogy egy adott XML tartalmát jelenítse meg a Word a sablon dokumentumunkban. Krisztián számára viszont jó hír, hogy tökéletesen kezeli a táblázatokat ;-)

Vegyük például az alábbi dokumentumot, amely egy tanfolyami ajánlatot tartalmaz:

Egy általános Word dokumentum

Ha az a feladatunk, hogy ebből kellene kinyernünk az oktató nevét, óraszámot illetve az érintett témákat, akkor használhatjuk a Custom XML szolgáltatást. Ehhez először készítenünk kell egy XSD sémát. Bevallom nem sűrűn gyártok sémát, az XSD szintaktika nem megy fejből, ezért inkább gyártottam egy XML dokumentumot Visual Studioval, pont olyan felépítésűt, amire szükségem van a Word feldolgozásnál is:

    <?xml version="1.0" encoding="utf-8"?>
    <Tanfolyam>
        <Oktato>Oktató neve</Oktato>
        <Oraszam>111</Oraszam>
        <Tartalom>
            <Tema>
                <Cim>Elsé téma</Cim>
                <Szint>könnyű</Szint>
            </Tema>
            <Tema>
                <Cim>Második téma</Cim>
                <Szint>közepes</Szint>
            </Tema>
            <Tema>
                <Cim>Harmadik téma</Cim>
                <Szint>nehéz</Szint>
            </Tema>
        </Tartalom>
    </Tanfolyam>

Miután ez megvolt, megkértem a Studiot, hogy generáljon ebből XSD-t:

VS: Create Schema

Íme az eredmény, amit így nem kellett megírnom:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema attributeFormDefault="unqualified" 
elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Tanfolyam"> <xs:complexType> <xs:sequence> <xs:element name="Oktato" type="xs:string" /> <xs:element name="Oraszam" type="xs:unsignedByte" /> <xs:element name="Tartalom"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="Tema"> <xs:complexType> <xs:sequence> <xs:element name="Cim" type="xs:string" /> <xs:element name="Szint" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>

Megvan tehát a séma, irány a Word! Először is elő kell varázsolnunk a szalagra a Developer fület, amit a Word options ablakban tehetünk meg:

Word options

Ha megjelent a Developer tab, bökjünk rá az XML csoportban található Structure gombra, majd a megjelenő jobb oldali XML Structure munkaablakban a Templates and Add-Ins... linkre:

XML Structure munkaablak

A felugró Templates and Add-Ins ablakban az Add Schema gombra kattintva válasszuk ki a korábban előállított XSD fájlunkat és adjuk meg a hozzá tartozó névtér URI-t. Ez lesz a Word által generált XML dokumentum alapértelmezett névtere, tehát jól gondoljuk ki, mit adunk meg:

Templates and Add Ins ablak

Innentől kezdve nincs is más dolgunk, mint a szöveg egyes részeit kijelölni és a munkaablak alsó részében rábökni az alkalmazandó XML elem nevére, aminek hatására lila jelölők tűnnek fel a dokumentumban, ha a Show XML tags in the document opciót bekapcsoljuk:

XML séma alkalmazása

Az ablak legalsó opcióját érdemes bekapcsolva hagyni: a List only child elements of current element azt jelenti, hogy a Word követi merre jár a kurzorunk a dokumentumban és csak azokat az elemeket kínálja fel, amik a séma alapján ott elérhetőek. Ez sokat segít.

Célszerű figyelni a munkaablak felső részében a sárga bejegyzéseket, amelyek felett tooltipben megjelenik, ha valamelyik elemet nem a sémának megfelelően használjuk.

Hasznos beállítási lehetőségeket találunk, ha a legalsó XML Options linkre kattintunk:

XML options

A Save data only bekapcsolásával érhetjük el, hogy csak az adatok mentődjenek, a formázás ne, sőt megadhatunk egy XSL transzformációt is, amit mentésnél alkalmaz a Word.

A validálási lehetőségek között szerintem célszerű bekapcsolni az Ignore mixed content opciót. Ezt bekapcsolva a Word eltekint az általunk XML elemként megjelölt részek közötti egyéb szövegtől. E nélkül a sémában a szabadszöveges részeket is definiálnunk kellene.

Érdemes kipróbálni, hogy a Word felismeri a táblázatokat, így ha később a táblázatba újabb sorokat szúrunk be, azokra is alkalmazni fogja az előző sor XML séma beállításait. Ha bekapcsoljuk a Show placeholder text for all empty elements opciót, akkor még az is látszik messziről, hogy a szöveg mely részét kell kitöltenie a felhasználónak (ez persze nem csak táblázatnál működik):

Táblázat és placeholder

Ha készen vagyunk a dokumentum felcímkézésével el is menthetjük és odaadhatjuk a felhasználóknak. Miután ők megszerkesztik a szöveget csak arra kell figyelniük, hogy a Save As dialógus ablakban Word 2003 XML Document típust válasszanak ki és jelöljék be a Save data only opciót:

Save As

Fontos, hogy Word 2003 XML Document a típus neve és nem 2007! Íme az eredmény:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <Tanfolyam xmlns="www.msdnkk.hu">
        <Oktato>Balássy György</Oktato>
        <Oraszam>24</Oraszam>
        <Tartalom>
            <Tema>
                <Cim>Bevezetés a SharePoint objektum modell használatába</Cim>
                <Szint>könnyű</Szint>
            </Tema>
            <Tema>
                <Cim>SharePoint webszolgáltatások</Cim>
                <Szint>könnyű</Szint>
            </Tema>
            <Tema>
                <Cim>Alkalmazás oldalak</Cim>
                <Szint>közepes</Szint>
            </Tema>
            <Tema>
                <Cim>Feature Framework</Cim>
                <Szint>közepes</Szint>
            </Tema>
            <Tema>
                <Cim>nincs címe</Cim>
                <Szint>nincs szintje</Szint>
            </Tema>
            <Tema>
                <Cim>Eseménykezelők</Cim>
                <Szint>közepes</Szint>
            </Tema>
            <Tema>
                <Cim>Webkijelzők készítése</Cim>
                <Szint>közepes</Szint>
            </Tema>
            <Tema>
                <Cim>Munkafolyamatok fejlesztése</Cim>
                <Szint>nehéz</Szint>
            </Tema>
        </Tartalom>
    </Tanfolyam>

Innen már aztán gyerekjáték akármilyen alkalmazásban feldolgozni az adatokat, hiszen ez standard XML, semmilyen formázást, Word ML-t vagy egyéb Word specifikus részt nem tartalmaz. Aki nem hiszi, innen letöltheti a cikkhez tartozó fájlokat. Persze az igazán szép az lenne, ha rá tudnánk kényszeríteni a felhasználókat, hogy mindig ebben a formátumban mentsenek, én erre sajnos nem találtam módszert :( Ha valaki tud, írja meg!

Sajnos ahogy azt korábban említettem, ezzel az XML-es módszerrel nem tudunk dokumentumot generálni. Csak arra jó, hogy a szövegből kinyerjük az adatokat, tudomásom szerint nem lehet megfordítani a folyamatot. Szerencsére van egy másik, szintén XML alapú szolgáltatás a Wordben, ami nem csak a dokumentum előállítását, de az adatkötésen alapuló generálást is biztosítja.

(folytatjuk)


zip Word_Custom_XML.zip (12 kB)


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.04.13. 0:47:18 | Permalink | Hozzászólások: 0 | Tárgyszavak: , ,


  • INSERT TABLE generálása

    Dávid Zoltán Gyakran kell valami gyors és akár ronda megoldás olyan egyszerű problémákra, mint minden tárolteljárásra valamilyen jog megadása, vagy hogy SQL INSERT TABLE szkriptet generáljunk minden sorra, ami jelenleg benne van egy megadott táblában. Hogy mikor jó ez? Például amikor fejlesztői környezetből kell átültetni egy tábla teljes tartalmát az élesbe (tesztkörnyezetbe), vagy fordítva. Persze van erre mindenféle adattranszformáló eszköz is, a 10 soros saját szkriptek viszont vagányak és kis problémákra piszok gyorsak. A mai ronda és gyors megoldásunk egy ilyen INSERT TABLE utasításhalmazt generál. SQL szkriptként kell futtatni és SQL szkriptet ad vissza. Tovább »
  • Böngészőtől jövő kérés nyelvi beállításainak meghamisítása (Accept-Language Header állítása ISAPI filterben)

    Dávid Zoltán Minden böngészőben beállítható, hogy működése során milyen értéket küldjön az “Accept-Language” headerben a webszervernek. Sok webalkalmazás ez alapján dönti el, hogy milyen nyelvű felhasználói felületet renderel a böngészőnek küldött válaszba. 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