Generăm documente Microsoft Word în PHP. Exwog - generator de rapoarte de la Excel la Word folosind un șablon Vă permite să setați caractere de încadrare pentru numele coloanelor Excel

A, nume de familie în coloană Bși profesii în rubrica C.

2. Creați un document Word (.doc sau .docx)


(A), (B)Și (C).

(A), (B)Și (C) (A)- Nume, (B)- nume, (C)- profesie.

Setări programe.

3. Selectați căile pentru fișiere și foldere


Selectați

4. Specificați foile și rândurile de date necesare


Fișe de date ale fișierului Excel

Rânduri de date ale fișierului Excel Fișe de date ale fișierului Excel

1 .

Dacă doriți ca toate foile și/sau rândurile fișierului dumneavoastră Excel cu date să participe la formarea documentului, faceți clic pe butonul corespunzător din dreapta cu inscripția Numerele(inscripția sa se va schimba în Toate).

5. Setați un șablon pentru denumirea noilor fișiere cu cuvinte


Setați modelul de denumire pentru fișierele de cuvinte noi:

Șablon nou de nume de fișiere de cuvinte- acesta este un șablon pentru numele documentelor noi (fișiere Word) generate de program. Aici modelul de nume conține numele coloanelor fișierului Excel, înconjurate de acolade: (A)Și (B). Când creați un document nou, programul va înlocui totul (A)Și (B) valorile celulelor corespunzătoare din fișierul Excel - acesta va fi numele noului document (fișier Word).

Puteți seta încadrarea caracterelor pe filă Setări programe.

6. Faceți clic pe „Generați”


Faceți clic pe butonul Genera iar progresul va apărea pe ecran. Se vor crea exact la fel de multe documente (fișiere word) cât numărul de rânduri din fișierul excel implicat în formare.

7. Totul


Toate documentele (fișierele word) au fost create și se află în folderul specificat în Folder pentru a salva noile fișiere Word. Toate:)

exwog- generator de rapoarte din Excel în Word folosind un șablon

Generator gratuit de fișiere Word folosind un șablon (fișier Word) bazat pe datele fișierului Excel

Funcționează pe Mac OS, Windows și Linux

Vă permite să specificați numele noilor fișiere de cuvinte generate

Vă permite să specificați foi și rânduri cu datele necesare

Vă permite să specificați caracterele din jur pentru numele coloanelor Excel

Ușor de folosit

Stocați datele în format Excel (.xls și .xlsx) și generați fișiere Word (.doc și .docx) în câteva clicuri :)


Cum functioneaza?

Aruncă o privire la fișierul tău excel


În acest exemplu, fișierul excel conține informații despre clienți. Fiecare linie corespunde unui anumit client. Numele sunt aranjate într-o coloană A, nume de familie în coloană Bși profesii în rubrica C.

Click pentru a vedea

Creați un document Word (.doc sau .docx)


Click pentru a vedea

Creați un „șablon” (fișier word) pentru generarea de noi documente (fișiere word). Aici textul „șablon” conține numele coloanelor fișierului excel, înconjurate de acolade: (A), (B)Și (C).

Programul va genera noi documente conform „șablonului” înlocuind toate (A), (B)Și (C) valorile celulelor corespunzătoare din fișierul Excel: (A)- Nume, (B)- nume, (C)- profesie.

De asemenea, puteți seta caracterele de încadrare pe filă Setări programe.

Selectați căile pentru fișiere și foldere


Selectați căile pentru fișiere și foldere (butoane etichetate Selectați). În program specificați următoarele căi:

Fișier Excel cu date (*.xls, *.xlsx)- aceasta este calea către fișierul dumneavoastră Excel cu date (informații despre client);

Fișier șablon Word (*.doc, *.docx)- aceasta este calea către „șablonul” dvs. (fișierul de cuvinte creat în pasul anterior);

Folder pentru a salva noile fișiere Word- aceasta este calea către folderul în care programul va salva documentele noi generate.

Click pentru a vedea

Specificați foile și rândurile datelor solicitate


Click pentru a vedea

Specificați numărul de foi și rânduri ale fișierului Excel cu date (informații despre client) pentru care doriți să generați documente:

Fișe de date ale fișierului Excel- numerele de foi ale fișierului dumneavoastră excel care vor participa la formarea de noi documente;

Rânduri de date ale fișierului Excel- numerele liniilor de foi (colile specificate în Fișe de date ale fișierului Excel) din fișierul dumneavoastră excel care va participa la generarea de noi documente. Pe baza datelor fiecărei linii specificate, va fi creat un document separat (fișier word).

Numerotarea foilor și liniilor din program începe cu 1 .

Trăim într-o lume în care dezvoltatorii PHP trebuie să interacționeze din când în când cu sistemul de operare Windows. WMI (Windows Management Interface) este un astfel de exemplu - interacțiunea cu Microsoft Office.

În acest articol, ne vom uita la o integrare simplă între Word și PHP: generarea unui document Microsoft Word pe baza câmpurilor de intrare într-un formular HTML folosind PHP (și extensia sa Interop).

Etape pregătitoare

În primul rând, să ne asigurăm că avem configurat un mediu WAMP de bază. Deoarece Interop este prezent doar pe Windows, avem nevoie de serverul nostru Apache și instalarea PHP pentru a fi implementate pe o mașină Windows. În această calitate, folosesc EasyPHP 14.1, care este extrem de ușor de instalat și configurat.

Următorul lucru pe care trebuie să-l faceți este să instalați Microsoft Office. Varianta nu este foarte importantă. Folosesc Microsoft Office 2013 Pro, dar orice versiune de Office mai veche de 2007 ar trebui să fie în regulă.

De asemenea, trebuie să ne asigurăm că avem bibliotecile instalate pentru dezvoltarea aplicației Interop (PIA, Primary Interop Assemblys, Basic Interop Assemblys). Puteți afla deschizând Windows Explorer și accesând directorul \assembly și acolo ar trebui să vedem un set de ansambluri instalate:

Aici puteți vedea elementul Microsoft.Office.Interop.Word (subliniat în captură de ecran). Aceasta va fi versiunea pe care o vom folosi în demonstrația noastră. Vă rugăm să acordați o atenție deosebită câmpurilor „Nume ansamblu”, „Versiune” și „Jeton cheie publică”. În curând le vom folosi în scriptul nostru PHP.

Acest director conține și alte ansambluri (inclusiv întreaga familie Office) disponibile pentru utilizare în programele dumneavoastră (nu numai pentru PHP, ci și pentru VB.net, C# etc.).

Dacă lista de ansambluri nu include întregul pachet Microsoft.Office.Interop, atunci trebuie fie să reinstalăm Office adăugând PIA, fie să descarcăm manual pachetul de pe site-ul Microsoft și să îl instalăm. Pentru instrucțiuni mai detaliate, vă rugăm să consultați această pagină MSDN.

cometariu: Doar distribuția PIA Microsoft Office 2010 este disponibilă pentru descărcare și instalare Versiunea ansamblurilor din acest pachet este 14.0.0, iar versiunea 15 este furnizată numai cu Office 2013.

În cele din urmă, trebuie să activați extensia php_com_dotnet.dll în php.ini și să reporniți serverul.

Acum poți trece la programare.

formular HTML

Deoarece cea mai mare parte a acestui exemplu este pe partea serverului, vom crea o pagină simplă cu un formular care va arăta astfel:

Avem un câmp de text pentru nume, un grup de butoane radio pentru sex, un glisor pentru vârstă și o zonă de introducere a textului pentru introducerea unui mesaj, precum și infamul buton „Trimite”.

Salvați acest fișier ca „index.html” în directorul gazdă virtuală, astfel încât să poată fi accesat la o adresă precum http://test/test/interop.

Partea serverului

Fișierul de gestionare pe partea serverului este scopul principal al conversației noastre. Pentru început, voi furniza codul complet pentru acest fișier, apoi îl voi explica pas cu pas.

vizibil = adevărat; $fn = __DIR__ . „\\template.docx”; $d = $w->Documente->Open($fn); echo „Documentul este deschis.


"; $flds = $d->Fields; $count = $flds->Count; echo "Există $count câmpuri în document.
"; ecou"
    "; $mapping = setupfields(); foreach ($flds ca $index => $f) ( $f->Select(); $key = $mapping[$index]; $value = $inputs[$key]; dacă ($cheie == „sex”) ( dacă ($valoare == „m") $value = "Domnul."; else $value = "Domnișoară"; } if($key=="printdate") $value= date ("Y-m-d H:i:s"); $w->Selection->TypeText($value); echo "!}
  • Asignez câmpului $index: $key valoarea $value
  • ";) ecou"
"; echo "Procesarea finalizată!

"; echo "Tastau, vă rog așteptați...
"; $d->PrintOut(); sleep(3); echo „Terminat!”; $w->Quit(fals); $w=null; funcția setupfields() ($mapping = array(); $mapping = "gen"; $mapping = "name"; $mapping = "printdate";

După ce am completat variabila $inputs cu valorile primite din formular și am creat și un element gol cu ​​cheia printdate (vom discuta de ce am făcut asta mai târziu), ajungem la patru rânduri foarte importante:

$assembly = "Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"; $class = "Microsoft.Office.Interop.Word.ApplicationClass"; $w = DOTNET nou($asamblare, $clasa); $w->vizibil = adevărat;

Manipulatorul COM în PHP necesită crearea unei instanțe a clasei în cadrul unui „asamblare”. În cazul nostru, lucrăm cu Word. Dacă vă uitați la prima captură de ecran, puteți nota semnătura completă a ansamblului pentru Word:

  • „Nume”, „Versiune”, „Public Key Token” - toate acestea sunt preluate din informațiile care pot fi vizualizate în „c:\Windows\assembly“.
  • „Cultura” este întotdeauna neutră

Clasa la care vrem să facem referință se numește întotdeauna „nume ansamblu” + „.ApplicationClass”.

Prin setarea acestor doi parametri putem obține un obiect pentru lucrul cu Word.

Acest obiect poate rămâne în fundal sau îl putem pune în modul de lucru setând atributul vizibil la true .

Următorul pas este să deschideți documentul care necesită procesare și să scrieți o instanță a „documentului” în variabila $d.

Pentru a crea conținut într-un document pe baza datelor din formular, puteți lua mai multe rute.

Cel mai rău lucru ar fi să codificați conținutul documentului în PHP și apoi să îl scoateți într-un document Word. Recomand cu tărie să nu faceți acest lucru din următoarele motive:

  1. Pierzi flexibilitatea. Orice modificare a fișierului de ieșire va necesita modificări ale codului PHP.
  2. Acest lucru rupe separația dintre control și vedere
  3. Aplicarea stilurilor la conținutul documentului (aliniere, fonturi, stiluri etc.) într-un script va crește foarte mult numărul de linii de cod. Schimbarea stilurilor în mod programatic este prea greoaie.

O altă opțiune ar fi să folosiți căutarea și înlocuirea. PHP are facilități bune încorporate pentru aceasta. Putem crea un document Word în care vom plasa etichete cu delimitatori speciali, care ulterior vor fi înlocuite. De exemplu, putem crea un document care conține următorul fragment:

iar cu ajutorul PHP-ului îl putem înlocui cu ușurință cu conținutul câmpului „Nume” primit din formular.

Este simplu și ne scutește de toate consecințele neplăcute pe care le întâlnim în prima metodă. Trebuie doar să decidem asupra separatorului corect, caz în care ajungem să folosim un model.

Recomand a treia metodă și se bazează pe o cunoaștere mai profundă a Word. Vom folosi câmpuri ca substituenți, iar folosind cod PHP vom actualiza direct valorile din câmpuri cu valorile corespunzătoare.

Această abordare este flexibilă, rapidă și în concordanță cu cele mai bune practici Word. De asemenea, vă poate ajuta să evitați căutarea text integral într-un document, ceea ce este bun pentru performanță. Observ că această soluție are și dezavantaje.

Word nu a acceptat de la început indecși cu nume pentru câmpuri. Chiar dacă am specificat nume pentru câmpurile care sunt create, totuși trebuie să folosim identificatorii numerici ai acestor câmpuri. Acest lucru explică și de ce trebuie să folosim o funcție separată (setupfields) pentru a potrivi indexul câmpului cu numele câmpului din formular.

În această lecție demonstrativă vom folosi un document cu 5 câmpuri MERGEFIELD. Vom plasa documentul șablon în același loc cu handlerul nostru de script.

Vă rugăm să rețineți că câmpul pentru data tipăririi nu are un câmp corespunzător în formular. De aceea am adăugat un element printdate gol la matricea $inputs. Fără aceasta, scriptul va porni și va rula în continuare, dar PHP va emite un avertisment că indexul printdate nu se află în matricea $inputs.

După înlocuirea câmpurilor cu valori noi, vom tipări documentul folosind

$d->PrintOut();

Metoda PrintOut preia mai mulți parametri opționali, iar noi folosim cea mai simplă formă a acesteia. Aceasta va imprima o copie a documentului pe imprimanta implicită atașată la aparatul Windows.

De asemenea, puteți apela PrintPreview pentru a previzualiza rezultatul înainte de a o tipări. Într-un mediu complet automat, vom folosi desigur metoda PrintOut.

Este posibil să fie necesar să așteptați un timp înainte de a închide aplicația Word, așa că este nevoie de timp pentru a pune în coadă lucrarea de imprimare. Fără întârziere(3), metoda $w->Quit se execută imediat și jobul nu este pus în coadă.

În cele din urmă, numim $w->Quit(false) , care închide aplicația Word care a fost apelată de scriptul nostru. Singurul parametru transmis metodei este o instrucțiune de salvare a fișierului înainte de a ieși. Am făcut modificări documentului, dar nu dorim să le salvăm, deoarece avem nevoie de un șablon curat pentru lucrări ulterioare.

Odată ce am terminat cu codul, putem încărca pagina formularului, completam câteva valori și îl trimitem. Imaginile de mai jos arată rezultatul scriptului, precum și documentul Word actualizat:

Viteza de procesare îmbunătățită și puțin mai multe despre PIA

PHP este un limbaj slab tastat. Obiect COM de tip Object. În timp ce scriem un script, nu avem nicio modalitate de a obține o descriere a unui obiect, fie că este o aplicație Word, un document sau un câmp. Nu știm ce proprietăți are acest obiect sau ce metode acceptă.

Acest lucru va încetini foarte mult viteza de dezvoltare. Pentru a accelera dezvoltarea, aș recomanda scrierea funcțiilor mai întâi în C# și apoi traducerea codului în PHP. Pot recomanda un IDE gratuit pentru dezvoltarea C# numit „#develop”. Îl poți găsi. Îl prefer decât Visual Studio pentru că #develop este mai mic, mai simplu și mai rapid.

Migrarea codului C# la PHP nu este atât de înfricoșătoare pe cât pare. Permiteți-mi să vă arăt câteva rânduri în C#:

Word.Application w=nou Word.Application(); w.Vizibil=adevărat; String path=Application.StartupPath+"\\template.docx"; Word.Document d=w.Documents.Open(cale) ca Word.Document; Word.Fields flds=d.Fields; int len=flds.Count; foreach (Word.Field f in flds) ( f.Select(); int i=f.Index; w.Selection.TypeText("..."); )

Veți observa că codul C# este foarte asemănător cu codul PHP pe care l-am arătat mai devreme. C# este un limbaj puternic tipizat, așa că veți observa în acest exemplu că există mai mulți operatori de distribuție și că variabilele trebuie tastate.

Specificând tipul unei variabile, vă puteți bucura de cod mai curat și de completare automată, iar viteza de dezvoltare crește semnificativ.

O altă modalitate de a accelera dezvoltarea PHP este apelarea unei macrocomenzi în Word. Efectuăm aceeași secvență de acțiuni și apoi o salvăm ca macrocomandă. Macrocomanda este scrisă în Visual Basic, care este, de asemenea, ușor de tradus în PHP.

Și, cel mai important, documentația Microsoft Office PIA, în special documentația cu spațiul de nume pentru fiecare aplicație Office, este cel mai detaliat material de referință disponibil. Cele mai utilizate trei aplicații sunt:

  • Excel 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel(v=office.15).aspx
  • Word 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word(v=office.15).aspx
  • PowerPoint 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint(v=office.15).aspx

Concluzie

În acest articol, am arătat cum să populați un document Word cu date folosind bibliotecile PHP COM și capabilitățile de interoperabilitate Microsoft Office.

Windows și Office sunt utilizate pe scară largă în viața de zi cu zi. Cunoașterea puterii Office/Window și PHP va fi utilă pentru fiecare dezvoltator PHP și Windows.

Extensia PHP COM deschide ușa utilizării acestei combinații.

În articolele anterioare din seria „Automatizarea umplerii documentelor”, am vorbit despre cum să creați interfața de utilizator a aplicației, să organizați validarea datelor de intrare și să obțineți numere în cuvinte fără a utiliza codul VBA. În acest articol final vom vorbi despre magia transferului tuturor valorilor necesare dintr-un registru de lucru Excel într-un document Word. Permiteți-mi să vă arăt ce ar trebui să se întâmple până la urmă:

Descrierea mecanismului

Pentru început, voi descrie în termeni generali exact cum vor fi transferate datele într-un document Word. În primul rând, vom avea 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, acest lucru se face cel mai convenabil folosind marcaje. După aceasta, trebuie să organizați datele Excel în așa fel încât să asigurați conformitatea 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 aici este extrem de simplu - creăm un document obișnuit, tastam și formatăm textul, în general, obținem forma necesară. În acele locuri în care va trebui să înlocuiți valorile din Excel, trebuie să creați marcaje. Acest lucru se face după cum urmează:

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ă plasez toate datele care trebuie transferate într-un document 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 obținute din tabele auxiliare aflate pe foaia Suport. În acest articol nu voi analiza formulele care calculează valorile cerute dacă ceva este neclar, pune întrebări în comentarii;

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

Procedura de transfer

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

  • Codul rulează într-un registru de lucru Excel, datele sunt transferate în Word câte o valoare și 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, în special cu un număr mare de marcaje, a doua opțiune pare mult mai atractivă, dar necesită acțiuni mai complexe. Exact asta am folosit.

Iată ce trebuie să faci:

  • Creați un șablon de document Word cu suport macro. Acest șablon va conține cod 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 codul care apelează procedura de completare din șablonul Word nou creat.

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

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 pur și simplu o opțiune gata făcută. Descărcați arhiva cu exemplul, în registrul 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 pentru a se potrivi nevoilor dvs., trebuie doar să modificați valoarea mai multor constante care sunt situate 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 „Crearea confirmărilor”. Acest registru de lucru are 4 foi 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, firește, va trebui reproiectat î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 exemplu în registrul de lucru pregătit. Înlocuiți toate constantele în funcție de proiectul dvs.
  5. Testați pentru funcționarea corectă.
  6. Folosește-l activ!

Continuăm subiectul de lucru cu formulare în Word pe care l-am început mai devreme. În articolele anterioare, ne-am uitat la formulare doar din punctul de vedere al unui „utilizator avansat”, adică. Am creat documente care au fost ușor de completat 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).

O întrebare logică - ce este? itemProps1.xml si componente similare? Aceste componente stochează descrieri ale surselor de date. Cel mai probabil, așa cum a planificat dezvoltatorii, pe lângă fișierele xml încorporate în document, ar fi trebuit să fie folosite și altele, dar până acum a fost implementată doar această metodă.

De ce ne sunt 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 de care avem nevoie, trebuie să parcurgem itemPropsX.xml componente și găsiți circuitul potrivit și, prin urmare, cel potrivit itemX.xml.

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

Ei bine, introducerea de bază este făcută, putem începe cu exemplul.

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 acesta este 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 sub forma unei structuri de clasă 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 pentru un singur lucru Dar

Din păcate, pare să existe o eroare în versiunea curentă a Office, care este după cum urmează: dacă în xml personalizat inainte de prin declararea spațiului de nume principal (cel din care Word ar trebui să ia elemente pentru a fi afișate), declarați altul, apoi repetarea Controalelor de conținut încep să fie afișate incorect (sunt afișate doar atâtea elemente câte erau în șablonul însuși - adică secțiunea care se repetă nu funcționează ).

Acestea. Acesta este 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" />

dar acesta nu mai este acolo:

< 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 nu am acces pentru a trimite erori Office. Și nici discuția de pe forumul MSDN nu a ajutat.

În general, o soluție necesară. Dacă am fi generat manual XML-ul, nu ar fi fost probleme - am fi făcut totul singuri. Cu toate acestea, în acest caz, îmi doresc foarte mult să folosesc XmlSerializer standard, care adaugă implicit câteva dintre spațiile sale de nume la fișierul XML de ieșire, chiar dacă aceste spații de nume nu sunt folosite.

Vom suprima complet ieșirea propriilor noastre spații de nume în XmlSerializer. Adevărat, această abordare va funcționa numai dacă într-adevăr nu are nevoie de ele (altfel vor fi adăugate în continuare și chiar ÎNAINTE de a noastră).

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. Introduceți XML rezultat într-un document Word.

Aici procedăm astfel:

  • copiați șablonul și deschideți copia
  • găsiți XML personalizat necesar în el (căutați după spațiu de nume „urn:MeetingNotes”)
  • înlocuiți 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 == „urn:MeetingNotes"!}