Internet ablakok Android

Sablondokumentum létrehozása felhasználói adatokból. Űrlapdokumentumok programozott generálása a Wordben

A „Dokumentumkitöltés automatizálása” sorozat korábbi cikkeiben arról beszéltem, hogyan lehet egy alkalmazás felhasználói felületét létrehozni, megszervezni a bevitel érvényesítését, és VBA-kód használata nélkül szavakkal leírni a számokat. Ebben az utolsó cikkben a varázslatról fogunk beszélni – az összes szükséges érték átviteléről egy Excel-munkafüzetből egy Word-dokumentumba. Mutatom a végeredményt:

A mechanizmus leírása

Először általánosságban leírom, hogy pontosan hogyan kerülnek át adatok egy Word-dokumentumba. Először is szükségünk van egy Word dokumentumsablonra, amely tartalmazza az összes jelölést, táblázatokat és a szövegnek azt a részét, amely változatlan marad. Ebben a sablonban meg kell határoznia azokat a helyeket, ahol az Excel-munkafüzet értékei helyettesítésre kerülnek – a legkényelmesebb módja ennek a könyvjelzők segítségével. Ezt követően úgy kell elrendezni az Excel adatokat, hogy illeszkedjenek a Word sablonhoz, és nem utolsósorban magát az átviteli eljárást is meg kell írni VBA-ban.

Tehát először a dolgok.

Hozzon létre egy Word dokumentumsablont

Itt minden rendkívül egyszerű - rendes dokumentumot készítünk, beírjuk és formázzuk a szöveget, általában elérjük a szükséges formát. Azokon a helyeken, ahol szükség lesz az értékek helyettesítésére az Excelből, könyvjelzőket kell létrehoznia. Ez a következő módon történik:

Így létre kell hoznia az összes könyvjelzőt, azaz meg kell jelölnie az összes helyet, ahová az Excelből származó adatokat beilleszti. Az így létrejövő fájlt "MS Word Template"-ként kell elmenteni a "Fájl" -> "Mentés másként..." menüpont segítségével.

Excel adatkészítés

A kényelem kedvéért úgy döntöttem, hogy az összes adatot, amelyet át kell vinni a Word dokumentumba, egy külön munkalapra teszem, amelyet Könyvjelzők - könyvjelzők néven írnak le. Ennek a lapnak két oszlopa van: az első a könyvjelzők neveit tartalmazza (pontosan úgy, ahogy a Word dokumentumban el vannak nevezve), a második pedig a megfelelő átvinni kívánt értékeket.

Ezen értékek egy része közvetlenül az adatbeviteli lapról, néhány pedig a Támogatási lapon található segédtáblázatokból származik. Ebben a cikkben nem elemzem a kívánt értékeket kiszámító képleteket, ha valami nem világos, tegyen fel kérdéseket a megjegyzésekben.

Ebben a szakaszban fontos a könyvjelzők összes nevét helyesen megadni - az adatátvitel helyessége ettől függ.

Áthelyezési eljárás

De ez a legérdekesebb. Két lehetőség van az adatmigrációs kód végrehajtására:

  • A kód egy Excel-munkafüzetben fut le, az adatokat egyenként adjuk át a Word-nek, és azonnal bekerül a dokumentumba.
  • A kód végrehajtása külön Word dokumentumban történik, az Excelből minden adat egy kötegben kerül átvitelre.

A végrehajtási sebesség szempontjából, különösen sok könyvjelzővel, a második lehetőség sokkal vonzóbbnak tűnik, de összetettebb műveleteket igényel. Ezt használtam.

Íme, mit kell tenni:

  • Hozzon létre egy makró-kompatibilis Word dokumentumsablont. Ez a sablon a végrehajtható VBA kódot fogja tartalmazni.
  • A létrehozott sablonban egy VBA-ban írt programot kell elhelyezni. Ehhez sablon szerkesztésekor nyomjuk meg az Alt + F11 billentyűkombinációt, és írjuk be a programkódot a megnyíló Visual Basic szerkesztő ablakban.
  • Írjon egy Excel-munkafüzetbe olyan kódot, amely meghívja a kitöltési rutint az imént létrehozott Word-sablonból.

Az eljárás szövegét a cikkben nem adom meg - könnyen megtekinthető a példaarchívum Template mappájában található FillDocument.dotm fájlban.

Hogyan használhatja mindezt a konkrét problémája megoldására?

Megértem, hogy szavakkal minden nagyon egyszerűnek tűnik, de mi történik a gyakorlatban? Azt javaslom, hogy csak a kész opciót használja. Töltse le az archívumot a példával, egy Excel-munkafüzetben nyomja meg az Alt + F11 billentyűkombinációt a Visual Basic szerkesztő megnyitásához, és olvassa el az összes megjegyzésemet a programmal kapcsolatban. Ahhoz, hogy a programot az igényeinek megfelelően módosítsa, csak néhány konstans értékét kell módosítania, ezek a program legelején kerülnek elhelyezésre. A program teljes szövegét szabadon bemásolhatja a projektbe.

Az archívum szerkezete

A cikkhez csatolt archívum több fájlt is tartalmaz.

A fő fájl egy Excel-munkafüzet, melynek neve "Megerősítések generálása". Ebben a munkafüzetben 4 munkalap található, amelyek közül csak kettő jelenik meg: "Input" - adatbeviteli lap és "Adatbázis" - az összes bevitt dokumentum archívuma.

A Sablonok mappa Word dokumentumsablonokat tartalmaz. Az egyik egy könyvjelző-kitöltő programot tartalmazó sablon, a másik pedig egy kitöltendő űrlap. A sablont változtatás nélkül használhatja a programmal, de a kitöltendő űrlapot természetesen az Ön igényeinek megfelelően módosítani kell.

Hogyan dolgozzuk át a példát „magadnak”?

  1. Készítsen Word dokumentumsablont a kitöltéshez. Hozzon létre benne minden szükséges könyvjelzőt, és mentse el "MS Word sablonként".
  2. Másolja a FillDocument.dotm fájlt a cikkhez csatolt archívumból az előkészített sablont tartalmazó mappába. Ez a fájl felelős a sablon könyvjelzőinek kitöltéséért, és semmit sem kell megváltoztatni benne.
  3. Készítsen Excel munkafüzetet az adatbevitelhez. Ön dönti el, hogy lesz-e „fejlett” felhasználói felülete, és végezzen különféle trükkös számításokat. A lényeg az, hogy tartalmazzon egy munkalapot a Word sablonban lévő könyvjelző neve és a behelyettesítendő érték közötti megfelelési táblázattal.
  4. Illessze be a VBA programkódot a mintafájlból az előkészített munkafüzetbe. Cserélje ki az összes állandót a projektnek megfelelően.
  5. Tesztelje a megfelelő működést.
  6. Élvezd aktívan!

Folytatjuk a korábban elkezdett témát az űrlapokkal való munka Wordben. A korábbi cikkekben az űrlapokat csak „erős felhasználó” szemszögéből vizsgáltuk, i.e. olyan dokumentumokat készítettünk, amelyek kényelmesek a kézi kitöltéshez. Ma szeretném javasolni ennek a feladatnak a kibővítését és a tartalomvezérlő mechanizmus használatának megkísérlését dokumentumok generálására.

Mielőtt rátérnénk közvetlen feladatunkra, szeretnék néhány szót szólni arról, hogy a tartalomvezérlők adatai hogyan tárolódnak a Word dokumentumokban (egyelőre szándékosan kihagyom, hogy ezek hogyan kapcsolódnak a dokumentum tartalmához, de remélem visszatérek erre valamikor a következő cikkekben).

Jogos kérdés, hogy mi az itemProps1.xmlés hasonló alkatrészek? Ezek az összetevők az adatforrások leírását tárolják. Valószínűleg a fejlesztők elképzelése szerint a dokumentumba ágyazott xml fájlok mellett másokat is kellett volna használnia, de eddig csak ez a módszer valósult meg.

Mi hasznos számunkra itemPropsX.xml? Az a tény, hogy felsorolják az xml-sémákat (a saját targetNamespace), amelyek a szülőben használatosak itemX.xml. Ez azt jelenti, hogy ha egynél több egyéni xml-t is tartalmaztunk a dokumentumban, akkor ahhoz, hogy megtaláljuk a megfelelőt, át kell futnunk itemPropsX.xml alkatrészeket, és megtalálja a kívánt áramkört, és ezáltal a kívánt itemX.xml.

Most még egy pillanat. Nem fogjuk manuálisan elemezni az összetevők közötti kapcsolatokat, és csak az alap Packaging API segítségével keressük a megfelelőket! Ehelyett az Open XML SDK-t fogjuk használni (a buildjei a NuGeten keresztül érhetők el). Erről az API-ról persze korábban egy szót sem ejtettünk, de a mi feladatunkhoz minimálisan szükséges, és az összes kód elég átlátható lesz.

Nos, a fő bevezetés kész, folytathatja a példát.

A kialakult hagyomány szerint ugyanazt a „Találkozási Jelentést” vesszük, amelyet a cikkben megrajzoltunk. Hadd emlékeztesselek arra, hogy így nézett ki a dokumentumsablon:

És így, az XML, amelyhez a dokumentummezők kötve voltak

< meetingNotes xmlns ="urn:MeetingNotes" subject ="" date ="" secretary ="" > < participants > < participant name ="" /> < decisions > < decision problem ="" solution ="" responsible ="" controlDate ="" />

1. lépés: Hozzon létre egy adatmodellt

Valójában nem csak egy dokumentum generálása a feladatunk, hanem egy kényelmes eszköz létrehozása (legalábbis vázlatos változatban), amelyet mind a fejlesztő, mind a felhasználó használhat.

Ezért a modellt C# osztályok szerkezeteként deklaráljuk:

Nyilvános osztály MeetingNotes ( nyilvános MeetingNotes() ( Résztvevők = új lista (); Döntések = új lista (); ) public string Tárgy ( get; set; ) public DateTime Dátum ( get; set; ) public string Titkár ( get; set; ) public List Résztvevők ( get; set; ) nyilvános lista Döntések ( get; set; ) ) public class Decision ( public string Probléma ( get; set; ) public string Megoldás ( get; set; ) public string Responsible ( get; set; ) public DateTime ControlDate ( get; set; ) ) public osztály Résztvevő ( nyilvános karakterlánc Név ( get; set; ) )

Nagyjából semmi különös, kivéve, hogy attribútumokat adtak hozzá az XML szerializálás vezérléséhez (mivel a modellben szereplő nevek és a szükséges XML kissé eltérnek).

2. lépés: Sorolja fel a fenti modellt XML-re

A feladat elvileg triviális. Az úgynevezett „vegyük a kedvenc XmlSerializerünket és menjünk”, ha nem egy de

Sajnos az Office jelenlegi verziójában láthatóan van egy hiba, ami a következő: ha egyéni xml-ben elülső deklarálva a fő névteret (ahonnan a Word elemeket kell vennie a megjelenítéshez), deklaráljon még néhányat, majd az ismétlődő tartalomvezérlők hibásan kezdenek megjelenni (csak annyi elem jelenik meg, amennyi volt magában a sablonban - azaz az ismétlődő szakasz nem munka).

Azok. Itt van az xml ami működik:

< test xmlns ="urn:Test" attr1 ="1" attr2 ="2" > < repeatedTag attr ="1" /> < repeatedTag attr ="2" /> < repeatedTag attr ="3" />

és ezt is:

< test xmlns ="urn:Test" attr1 ="1" attr2 ="2" xmlns:t ="urn:TTT" > < repeatedTag attr ="1" /> < repeatedTag attr ="2" /> < repeatedTag attr ="3" />

és ez eltűnt:

< test xmlns:t ="urn:TTT" xmlns ="urn:Test" attr1 ="1" attr2 ="2" > < repeatedTag attr ="1" /> < repeatedTag attr ="2" /> < repeatedTag attr ="3" />

Megpróbáltam hibát beküldeni a Microsoft támogatásának a Connect webhelyen, de valamilyen oknál fogva megtagadták a hozzáférést a hibák beküldéséhez az Office-on keresztül. Az MSDN fórumán folyó vita sem segített.

Általában a szükséges kerülő manőver. Ha kézzel alakítanánk ki az XML-t, akkor nem lenne probléma – mindent magunk csinálnánk. Ebben az esetben azonban valóban a szabványos XmlSerializer-t szeretném használni, amely alapértelmezés szerint több névterét hozzáadja a kimeneti XML-hez, még akkor is, ha ezeket a névtereket nem használja.

Teljesen letiltjuk a saját névtereink kimenetét az XmlSerializerben. Igaz, ez a megközelítés csak akkor működik, ha valóban nincs rájuk szüksége (ellenkező esetben továbbra is hozzáadásra kerülnek, és csak a miénk ELŐTT).

Valójában a teljes kód (feltéve, hogy a változó meetingJegyzetek tartalmaz egy korábban feltöltött MeetingNotes típusú objektumot):

var serializer = new XmlSerializer(típusa (MeetingNotes));
var serializedDataStream = new MemoryStream();

var namespaces = new XmlSerializerNamespaces();
névterek.Add(“” , “” );

serializer.Serialize(serializedDataStream, meetingNotes, namespaces);
serializedDataStream.Seek(0, SeekOrigin.Begin);

3. lépés: A kapott XML-t beírjuk egy Word dokumentumba.

Itt a következőket tesszük:

  • másolja ki a sablont, és nyissa meg a másolatot
  • keresse meg benne a kívánt egyéni xml-t (keresés névtér szerint „urn: Meeting Notes”)
  • a komponens tartalmát az XML-ünkre cseréljük

File.Copy(sablonnév, eredményDokumentumnév, igaz ); using (var document = WordprocessingDocument.Open(resultDocumentName, true )) ( var xmlpart = document.MainDocumentPart.CustomXmlParts .Single(xmlPart => xmlPart.CustomXmlPropertiesPart.DataStoreItem.OfTReferences () .Any(sr => sr.Uri.Value == "(!LANG:urn:MeetingNotes"!}

Mindannyian szövegekkel foglalkozunk, így vagy úgy. Néha nagy vagy nem túl nagy mennyiségű szöveget kell generálni egy-egy feladathoz, például a formázással való játékhoz, de nincs kéznél szöveg, lusta saját maga megírni. Mit kell tenni? A válasz egyszerű: használja a Word beépített véletlenszerű szöveggenerátorát!

A Microsoft Word szerkesztőben speciális parancsok segítségével gyorsan és egyszerűen hozhat létre szöveget. Tengerimalacként a Word 2007-et fogom használni, ezeknek a parancsoknak a Word összes verziójában működniük kell. Három módszert fogok elmondani a szöveg generálására.

1. módszer: A rand() használata

A rand() függvény egy lokalizált szövegmintát szúr be, 3 bekezdésből 3 mondatból. Nyissa meg a Word-et, helyezze a kurzort arra a helyre, ahol hamarosan megjelenik a szöveg, és írja be a parancsot:

és nyomja meg az Entert. Maga a rand függvény eltűnik, helyette 3 bekezdésnyi szöveg jelenik meg:

De ez még nem minden. Ha sok szövegre van szüksége, akkor a rand függvényt további argumentumokkal használhatja, például:

=rand(x,y)

ahol " x" a bekezdések számát jelenti, és " y» az egyes bekezdésekben található mondatok száma. Például, =rand(20,5) 20 bekezdést fog beilleszteni, egyenként öt mondattal. A =rand(7) 7, egyenként 3 mondatos bekezdést fog beilleszteni.

2. módszer: A lorem() használata

A jó öreg Lorem Ipsum mintaként való beillesztéséhez használja a lorem () függvényt. Írja be a következő parancsot, és nyomja meg az Enter billentyűt:

És ezt a csupa latin szöveget kapjuk

A lorem() függvény további argumentumokat is elfogad, mint például a rand(), számos bekezdés és mondat formájában. Argumentumok nélkül a függvény alapértelmezés szerint 3, egyenként 3 mondatos bekezdést szúr be.

3. módszer. A rand.old() függvény

A használat hasonló az előző parancsokhoz:

=rand.old()

és nyomja meg az Entert.

A rand.old() függvény megmarad a régi irodával való kompatibilitás érdekében, 2003-ig bezárólag. Az alkalmazás módja megegyezik az előző kettővel, csak a szöveg ugyanazokból a mondatokból áll majd: "Egyél többet ezekből a puha francia tekercsekből és igyál teát." Ezt a kifejezést mindenki ismeri, akinek néha fontokkal kellett dolgoznia.

Az argumentumokat az első két módszerhez hasonlóan adhatja át.

Ennyi, generáltak a szövegek, most már többet is ehetsz ezekből a puha francia tekercsekből és teázhatsz :)

Sikerült szöveget beszúrni a fenti függvényekkel?