Internet Windows Android

Generarea unui document șablon din datele utilizatorului. Generarea programatică de documente formular în Word

În articolele anterioare din seria „Automatizarea umplerii documentelor”, am vorbit despre cum să creați interfața de utilizator a unei aplicații, să organizați validarea intrării și să obțineți un număr în cuvinte fără a utiliza codul VBA. În acest articol final, vom vorbi despre magie - transferul tuturor valorilor necesare dintr-un registru de lucru Excel într-un document Word. Permiteți-mi să vă arăt rezultatul final:

Descrierea mecanismului

Pentru început, voi descrie în termeni generali exact cum vor fi transferate datele într-un document Word. În primul rând, avem nevoie de un șablon de document Word care să conțină toate markupurile, tabelele și acea parte a textului care va rămâne neschimbată. În acest șablon, trebuie să definiți locurile în care vor fi înlocuite valorile din registrul de lucru Excel - cel mai convenabil mod de a face acest lucru este cu ajutorul marcajelor. După aceea, trebuie să aranjați datele Excel în așa fel încât să se potrivească cu șablonul Word și, nu în ultimul rând, să scrieți procedura de transfer în sine în VBA.

Deci, primul lucru pe primul loc.

Creați un șablon de document Word

Totul este extrem de simplu aici - creăm un document obișnuit, tastam și formatăm textul, în general, realizăm pentru a obține forma necesară. În acele locuri în care va fi necesar să înlocuiți valorile din Excel, trebuie să creați marcaje. Acest lucru se face în felul următor:

Astfel, va trebui să creați toate marcajele, adică să marcați toate locurile în care vor fi inserate datele din Excel. Fișierul rezultat trebuie salvat ca „Șablon MS Word” utilizând elementul de meniu „Fișier” -> „Salvare ca...”.

Pregătirea datelor Excel

Pentru comoditate, am decis să pun toate datele care trebuie transferate în documentul Word pe o foaie de lucru separată numită Marcaje - marcaje. Această foaie are două coloane: prima conține numele marcajelor (exact așa cum sunt denumite în documentul Word), iar a doua conține valorile corespunzătoare de transferat.

Unele dintre aceste valori sunt obținute direct din foaia de introducere a datelor, iar unele sunt din tabele auxiliare aflate pe foaia Suport. În acest articol nu voi analiza formulele care calculează valorile dorite, dacă ceva nu este clar, pune întrebări în comentarii.

În această etapă, este important să specificați corect toate numele marcajelor - corectitudinea transferului de date depinde de aceasta.

Procedura de transfer

Dar acesta este cel mai interesant. Există două opțiuni pentru executarea codului de migrare a datelor:

  • Codul este executat într-un registru de lucru Excel, datele sunt transmise la Word câte o valoare și sunt imediat plasate în document.
  • Codul este executat într-un document Word separat, toate datele sunt transferate din Excel într-un singur lot.

Din punct de vedere al vitezei de execuție, mai ales cu un număr mare de marcaje, a doua opțiune pare mult mai atractivă, dar necesită acțiuni mai complexe. Acesta este cel pe care l-am folosit.

Iată ce trebuie făcut:

  • Creați un șablon de document Word cu macro-activate. Acest șablon va conține codul VBA executabil.
  • În șablonul creat, trebuie să plasați un program scris în VBA. Pentru a face acest lucru, atunci când editați un șablon, apăsați combinația de taste Alt + F11 și introduceți codul programului în fereastra editorului Visual Basic care se deschide.
  • Într-un registru de lucru Excel, scrieți cod care apelează procedura de completare din șablonul Word nou creat.

Nu voi furniza textul procedurii în articol - poate fi vizualizat cu ușurință în fișierul FillDocument.dotm aflat în folderul Template din arhiva exemplu.

Cum poți folosi toate acestea pentru a-ți rezolva problema?

Înțeleg că în cuvinte totul pare foarte simplu, dar ce se întâmplă în practică? Vă sugerez să utilizați doar opțiunea gata făcută. Descărcați arhiva cu exemplul, într-un registru de lucru Excel, apăsați combinația de taste Alt + F11 pentru a deschide editorul Visual Basic și citiți toate comentariile mele despre program. Pentru a modifica programul în funcție de nevoile dvs., trebuie doar să modificați valoarea câtorva constante, acestea fiind plasate chiar la începutul programului. Puteți copia liber întregul text al programului în proiectul dvs.

Structura arhivei

Arhiva atașată acestui articol conține mai multe fișiere.

Fișierul principal este un registru de lucru Excel numit „Generare confirmări”. Există 4 foi de lucru în acest registru de lucru, dintre care doar două sunt afișate: „Intrare” - o foaie de introducere a datelor și „Bază de date” - o arhivă a tuturor documentelor introduse.

Dosarul Șabloane conține șabloane de documente Word. Unul dintre ele este un șablon care conține un program de completare a marcajelor, iar al doilea este un formular de completat. Puteți utiliza șablonul cu programul fără modificări, dar formularul de completat, desigur, va trebui modificat în funcție de nevoile dumneavoastră.

Cum să reluați exemplul „pentru dumneavoastră”?

  1. Pregătiți un șablon de document Word pentru a fi completat. Creați toate marcajele necesare în el și salvați-l ca „Șablon MS Word”.
  2. Copiați fișierul FillDocument.dotm din arhiva atașată acestui articol în folderul cu șablonul pregătit. Acest fișier este responsabil pentru completarea marcajelor șablonului și nu trebuie schimbat nimic în el.
  3. Pregătiți un registru de lucru Excel pentru introducerea datelor. Depinde de dvs. să decideți dacă va avea vreo interfață de utilizator „avansată” și să efectuați diverse calcule complicate. Principalul lucru este că conține o foaie de lucru cu un tabel de corespondență între numele marcajului din șablonul Word și valoarea care trebuie înlocuită.
  4. Introduceți codul programului VBA din fișierul eșantion în registrul de lucru pregătit. Înlocuiți toate constantele în funcție de proiectul dvs.
  5. Testați pentru funcționarea corectă.
  6. Bucurați-vă activ!

Continuăm tema de lucru cu formulare în Word pe care am început-o mai devreme. În articolele anterioare, ne-am uitat doar la formulare dintr-o perspectivă „utilizator puternic”, adică. am creat documente care sunt convenabile pentru completarea manuală. Astăzi, vreau să propun extinderea acestei sarcini și încercarea de a folosi mecanismul de control al conținutului pentru a genera documente.

Înainte de a trece la sarcina noastră imediată, vreau să spun câteva cuvinte despre modul în care datele pentru controalele de conținut sunt stocate în documentele Word (voi omite în mod deliberat modul în care sunt legate de conținutul documentului deocamdată, dar sper să revin la aceasta cândva în articolele următoare).

Întrebarea legitimă este ce este itemProps1.xml si componente similare? Aceste componente stochează descrieri ale surselor de date. Cel mai probabil, așa cum au fost concepute de dezvoltatori, pe lângă fișierele xml încorporate în document, ar fi trebuit să folosească altele, dar până acum a fost implementată doar această metodă.

Ce ne este de folos itemPropsX.xml? Faptul că listează scheme xml (lor targetNamspace) care sunt folosite în părinte itemX.xml. Aceasta înseamnă că, dacă am inclus mai mult de un xml personalizat în document, atunci pentru a-l găsi pe cel potrivit, trebuie să parcurgem itemPropsX.xml componente și găsiți circuitul dorit și, prin urmare, cel dorit itemX.xml.

Acum încă un moment. Nu vom analiza manual relațiile dintre componente și le vom căuta pe cele potrivite folosind doar API-ul de bază pentru ambalaje! În schimb, vom folosi Open XML SDK (build-urile sale sunt disponibile prin NuGet). Desigur, nu am spus un cuvânt despre acest API mai devreme, dar pentru sarcina noastră este nevoie de un minim și tot codul va fi destul de transparent.

Ei bine, introducerea principală este făcută, puteți trece la exemplu.

Conform tradiției stabilite, vom lua același „Raport de întâlnire” pe care l-am desenat în articol. Permiteți-mi să vă reamintesc că așa arăta șablonul de document:

Și astfel, XML-ul la care au fost legate câmpurile documentului

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

Pasul 1. Creați un model de date

De fapt, sarcina noastră nu este doar să generăm un document, ci să creăm (cel puțin într-o versiune nefinalizată) un instrument convenabil pentru utilizare atât de către dezvoltator, cât și de către utilizator.

Prin urmare, vom declara modelul ca o structură de clase C#:

Clasa publică MeetingNotes ( public MeetingNotes() ( Participanți = listă nouă (); Decizii = Listă nouă (); ) public șir Subiect ( get; set; ) public DateTime Data ( get; set; ) public șir Secretar ( get; set; ) public List Participanți ( obțineți; setați; ) Listă publică Decizii ( get; set; ) ) public class Decizie ( public șir Problemă ( get; set; ) public șir Soluție ( get; set; ) public șir Responsabil ( get; set; ) public DateTime ControlDate ( get; set; ) ) public Class Participant ( șir public Nume ( get; set; ) )

În general, nimic special, cu excepția faptului că au fost adăugate atribute pentru a controla serializarea XML (deoarece numele din model și XML-ul necesar sunt ușor diferite).

Pasul 2: Serializați modelul de mai sus în XML

Sarcina este, în principiu, banală. Ceea ce se numește „luați XmlSerializer-ul nostru preferat și mergeți”, dacă nu unul dar

Din păcate, în versiunea actuală de Office, se pare că există o eroare, care este după cum urmează: dacă în xml personalizat față declarând spațiul de nume principal (cel din care Word ar trebui să ia elemente pentru afișare), mai declară câteva, apoi controalele de conținut repetate încep să se afișeze incorect (se afișează doar atâtea elemente câte erau în șablonul însuși - adică secțiunea de repetare nu munca).

Acestea. Iată xml-ul care funcționează:

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

si acesta si acesta:

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

iar acesta a dispărut:

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

Am încercat să trimit o eroare la asistența Microsoft pe Connect, dar din anumite motive mi s-a refuzat accesul pentru a trimite erori prin Office. Nici o discuție pe forumul MSDN nu a ajutat.

În general, manevra de ocolire necesară. Dacă am forma XML manual, nu ar fi probleme - am face totul singuri. Cu toate acestea, în acest caz, vreau cu adevărat să folosesc XmlSerializer standard, care adaugă implicit câteva dintre spațiile de nume ale sale la XML de ieșire, chiar dacă aceste spații de nume nu sunt folosite.

Vom face o suprimare completă a ieșirii propriilor noastre spații de nume în XmlSerializer. Adevărat, această abordare va funcționa numai dacă nu are nevoie de ele (altfel vor fi adăugate în continuare și chiar ÎNAINTE de ale noastre).

De fapt, întregul cod (cu condiția ca variabila note de întâlnire conține un obiect populat anterior de tip MeetingNotes):

var serializer = new XmlSerializer(typeof (MeetingNotes));
var serializedDataStream = new MemoryStream();

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

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

Pasul 3. Introducem XML-ul rezultat într-un document Word.

Aici facem următoarele:

  • copiați șablonul și deschideți copia
  • găsiți XML personalizat dorit în el (căutați după spațiu de nume „urn:MeetingNotes”)
  • înlocuim conținutul componentei cu XML-ul nostru

File.Copy(nume șablon, rezultatNumeDocument, adevărat); folosind (var document = WordprocessingDocument.Open(resultDocumentName, true )) ( var xmlpart = document.MainDocumentPart.CustomXmlParts .Single(xmlPart => xmlPart.CustomXmlPropertiesPart.DataStoreItem.SchemaReferences.OfType) () .Any(sr => sr.Uri.Value == „(!LANG:urn:MeetingNotes"!}

Cu toții ne ocupăm de texte, într-un fel sau altul. Uneori este nevoie să generați o cantitate mare sau nu foarte mare de text pentru o anumită sarcină, de exemplu, pentru a vă juca cu formatarea, dar nu există text la îndemână, este prea lene să îl scrieți singur. Ce să fac? Răspunsul este simplu: utilizați generatorul de text aleatoriu încorporat în Word!

În editorul Microsoft Word, puteți genera text rapid și ușor folosind comenzi speciale. Voi folosi Word 2007 ca cobai.Aceste comenzi ar trebui să funcționeze în toate versiunile de Word. Vă voi spune despre trei metode de generare a textului.

Metoda 1: Folosind rand()

Funcția rand() inserează un eșantion de text localizat, 3 paragrafe din 3 propoziții. Deschideți-vă Word, puneți cursorul acolo unde va apărea textul în curând și introduceți comanda:

și apăsați Enter. Funcția rand în sine va dispărea și în schimb vor apărea 3 paragrafe de text:

Dar asta nu este tot. Dacă aveți nevoie de mult text, atunci puteți utiliza funcția rand cu argumente suplimentare, ca acesta:

=rand(x,y)

Unde " X„ înseamnă numărul de paragrafe și „ y» este numărul de propoziții din fiecare paragraf. De exemplu, =rand(20,5) va insera 20 de paragrafe cu cinci fraze fiecare. A =rand(7) va insera câte 7 paragrafe a câte 3 propoziţii.

Metoda 2: Folosirea lorem()

Pentru a introduce vechiul Lorem Ipsum ca mostră - utilizați funcția lorem (). Tastați următoarea comandă și apăsați Enter:

Și obținem acest text în întregime latină

Funcția lorem() acceptă, de asemenea, cu ușurință argumente suplimentare, cum ar fi rand(), sub forma unui număr de paragrafe și propoziții. Fără argumente, funcția inserează implicit 3 paragrafe cu câte 3 propoziții.

Metoda 3. Funcția rand.old().

Utilizarea este similară cu comenzile anterioare:

=rand.old()

și apăsați Enter.

Funcția rand.old() este lăsată pentru compatibilitate cu vechiul birou, până în 2003 inclusiv. Metoda de aplicare este aceeași cu cele două anterioare, doar textul va consta din aceleași fraze „Mănâncă mai multe din aceste rulouri franțuzești moi și bea ceai”. Această frază este cunoscută de toți cei care uneori au fost nevoiți să lucreze cu fonturi.

Puteți transmite argumente ca în primele două metode.

Asta e tot, textele au fost generate, acum poți să mănânci mai multe din aceste chifle franțuzești moi și să bei ceai :)

Ați reușit să inserați text folosind funcțiile de mai sus?