Internet Windows Android
Kengaytirish

Foydalanuvchi ma'lumotlaridan shablon hujjatini yaratish. Word dasturida shakl hujjatlarini dasturiy yaratish

"Hujjatlarni to'ldirishni avtomatlashtirish" turkumidagi oldingi maqolalarda men VBA kodini ishlatmasdan qanday qilib dasturning foydalanuvchi interfeysini yaratish, kiritilgan ma'lumotlarni tekshirishni tashkil qilish va raqamni so'z bilan olish haqida gapirdim. Ushbu yakuniy maqolada biz sehr haqida gapiramiz - barcha kerakli qiymatlarni Excel ish kitobidan Word hujjatiga o'tkazish. Sizga yakuniy natijani ko'rsataman:

Mexanizmning tavsifi

Boshlash uchun men Word hujjatiga ma'lumotlar qanday uzatilishini umumiy ma'noda tasvirlab beraman. Avvalo, barcha belgilar, jadvallar va matnning o'zgarishsiz qoladigan qismini o'z ichiga olgan Word hujjati shabloniga muhtojmiz. Ushbu shablonda siz Excel ish kitobidagi qiymatlar almashtiriladigan joylarni belgilashingiz kerak - buni qilishning eng qulay usuli xatcho'plar yordamida. Shundan so'ng, siz Excel ma'lumotlarini Word shabloniga mos keladigan tarzda tartibga solishingiz kerak va oxirgi, lekin eng muhimi, VBA-da uzatish jarayonini o'zi yozing.

Shunday qilib, birinchi narsa.

Word hujjati shablonini yarating

Bu erda hamma narsa juda oddiy - biz oddiy hujjat yaratamiz, matnni yozamiz va formatlaymiz, umuman olganda, kerakli shaklni olish uchun erishamiz. Excel-dan qiymatlarni almashtirish kerak bo'lgan joylarda siz xatcho'plarni yaratishingiz kerak. Bu quyidagi tarzda amalga oshiriladi:

Shunday qilib, siz barcha xatcho'plarni yaratishingiz kerak, ya'ni Excel ma'lumotlari kiritiladigan barcha joylarni belgilashingiz kerak. Olingan fayl menyuning “Fayl” -> “Boshqa saqlash...” bandi yordamida “MS Word shabloni” sifatida saqlanishi kerak.

Excel ma'lumotlarini tayyorlash

Qulaylik uchun men Word hujjatiga o'tkazilishi kerak bo'lgan barcha ma'lumotlarni Xatcho'plar - xatcho'plar deb nomlangan alohida ish varag'iga qo'yishga qaror qildim. Ushbu varaqda ikkita ustun mavjud: birinchisi xatcho'plarning nomlarini o'z ichiga oladi (ular Word hujjatida xuddi shunday nomlangan), ikkinchisi esa o'tkazilishi kerak bo'lgan mos qiymatlarni o'z ichiga oladi.

Ushbu qiymatlarning ba'zilari to'g'ridan-to'g'ri ma'lumotlarni kiritish varag'idan olinadi, ba'zilari esa qo'llab-quvvatlash varag'ida joylashgan yordamchi jadvallardan olinadi. Ushbu maqolada men kerakli qiymatlarni hisoblaydigan formulalarni tahlil qilmayman, agar biror narsa aniq bo'lmasa, sharhlarda savollar bering.

Ushbu bosqichda xatcho'plarning barcha nomlarini to'g'ri ko'rsatish muhim - ma'lumotlarni uzatishning to'g'riligi bunga bog'liq.

O'tkazish tartibi

Ammo bu eng qiziqarli. Ma'lumotlarni ko'chirish kodini bajarish uchun ikkita variant mavjud:

  • Kod Excel ish kitobida bajariladi, ma'lumotlar Word-ga bir vaqtning o'zida bir qiymatdan o'tkaziladi va darhol hujjatga joylashtiriladi.
  • Kod alohida Word hujjatida bajariladi, barcha ma'lumotlar Exceldan bitta to'plamda uzatiladi.

Bajarish tezligi nuqtai nazaridan, ayniqsa ko'p sonli xatcho'plar bilan, ikkinchi variant ancha jozibali ko'rinadi, ammo murakkabroq harakatlarni talab qiladi. Bu men foydalangan.

Bu erda nima qilish kerak:

  • Ibratli Word hujjati shablonini yarating. Ushbu shablon bajariladigan VBA kodini o'z ichiga oladi.
  • Yaratilgan shablonda siz VBA da yozilgan dasturni joylashtirishingiz kerak. Buning uchun shablonni tahrirlashda Alt + F11 tugmalar birikmasini bosing va ochilgan Visual Basic muharriri oynasiga dastur kodini kiriting.
  • Excel ish kitobida yangi yaratilgan Word shablonidan to'ldirish protsedurasini chaqiruvchi kodni yozing.

Maqolada protsedura matnini bermayman - uni misol arxividagi Andoza papkasida joylashgan FillDocument.dotm faylida osongina ko'rish mumkin.

Muayyan muammoni hal qilish uchun bularning barchasidan qanday foydalanishingiz mumkin?

Men tushunaman, so'z bilan aytganda, hamma narsa juda oddiy ko'rinadi, lekin amalda nima sodir bo'ladi? Men sizga faqat tayyor variantdan foydalanishni maslahat beraman. Arxivni misol bilan yuklab oling, Excel ish kitobida, Visual Basic muharririni ochish uchun Alt + F11 tugmalar birikmasini bosing va dastur bo'yicha barcha sharhlarimni o'qing. Dasturni o'z ehtiyojlaringizga mos ravishda o'zgartirish uchun siz faqat bir nechta konstantalarning qiymatini o'zgartirishingiz kerak, ular dasturning eng boshida joylashtiriladi. Siz dasturning butun matnini loyihangizga bemalol nusxalashingiz mumkin.

Arxiv tuzilishi

Ushbu maqolaga biriktirilgan arxivda bir nechta fayllar mavjud.

Asosiy fayl "Tasdiqlashlarni yaratish" deb nomlangan Excel ish kitobidir. Ushbu ish kitobida 4 ta ish varag'i mavjud bo'lib, ulardan faqat ikkitasi ko'rsatiladi: "Kirish" - ma'lumotlarni kiritish varag'i va "Ma'lumotlar bazasi" - barcha kiritilgan hujjatlar arxivi.

Shablonlar papkasida Word hujjati shablonlari mavjud. Ulardan biri xatcho'pni to'ldirish dasturini o'z ichiga olgan shablon, ikkinchisi esa to'ldirish uchun shakl. Siz shablonni dastur bilan o'zgartirmasdan ishlatishingiz mumkin, ammo to'ldirish uchun shakl, albatta, sizning ehtiyojlaringizga qarab o'zgartirilishi kerak.

"O'zingiz uchun" misolini qanday qayta ishlash kerak?

  1. To'ldirish uchun Word hujjati shablonini tayyorlang. Unda barcha kerakli xatcho'plarni yarating va uni "MS Word shabloni" sifatida saqlang.
  2. FillDocument.dotm faylini ushbu maqolaga biriktirilgan arxivdan tayyorlangan shablonli papkaga ko'chiring. Ushbu fayl shablon xatcho'plarini to'ldirish uchun javobgardir va unda hech narsani o'zgartirish kerak emas.
  3. Ma'lumotlarni kiritish uchun Excel ish kitobini tayyorlang. U har qanday "ilg'or" foydalanuvchi interfeysiga ega bo'ladimi yoki yo'qmi va turli qiyin hisoblarni amalga oshirish sizga bog'liq. Asosiysi, unda Word shablonidagi xatcho'p nomi va almashtiriladigan qiymat o'rtasidagi yozishmalar jadvali mavjud bo'lgan ish varag'i mavjud.
  4. Tayyorlangan ish kitobiga namuna faylidan VBA dastur kodini kiriting. Loyihangizga muvofiq barcha konstantalarni almashtiring.
  5. To'g'ri ishlash uchun sinov.
  6. Faol zavqlaning!

Biz avval boshlagan Wordda shakllar bilan ishlash mavzusini davom ettiramiz. Avvalgi maqolalarda biz faqat "quvvat foydalanuvchi" nuqtai nazaridan shakllarni ko'rib chiqdik, ya'ni. qo'lda to'ldirish uchun qulay bo'lgan hujjatlarni yaratdik. Bugun men ushbu vazifani kengaytirish va hujjatlarni yaratish uchun Kontentni boshqarish mexanizmidan foydalanishni taklif qilmoqchiman.

To'g'ridan-to'g'ri vazifamizga o'tishdan oldin, Word hujjatlarida kontentni boshqarish uchun ma'lumotlar qanday saqlanishi haqida bir necha so'z aytmoqchiman (hozircha ular hujjat mazmuni bilan qanday bog'langanligini ataylab o'tkazib yuboraman, lekin men qaytishga umid qilaman. Bu haqda ba'zan keyingi maqolalarda).

Bu nima degani qonuniy savol itemProps1.xml va shunga o'xshash komponentlar? Ushbu komponentlar ma'lumotlar manbalarining tavsiflarini saqlaydi. Ehtimol, ishlab chiquvchilar tomonidan o'ylab topilganidek, hujjatga kiritilgan xml fayllariga qo'shimcha ravishda, u boshqalardan foydalanishi kerak edi, ammo hozirgacha faqat ushbu usul amalga oshirildi.

Bizga nima foydali itemPropsX.xml? Ularning xml sxemalarini ro'yxatga olishlari (ularning targetNamespace) ota-onada ishlatiladigan itemX.xml. Bu shuni anglatadiki, agar biz hujjatga bir nechta maxsus xml-ni qo'shgan bo'lsak, to'g'risini topish uchun biz uni ishga tushirishimiz kerak. itemPropsX.xml komponentlar va kerakli sxemani toping va shuning uchun kerakli itemX.xml.

Endi yana bir daqiqa. Biz komponentlar o'rtasidagi munosabatlarni qo'lda tahlil qilmaymiz va faqat asosiy Packaging API yordamida to'g'risini qidiramiz! Buning o'rniga biz Open XML SDK dan foydalanamiz (uning tuzilmalari NuGet orqali mavjud). Albatta, biz ilgari ushbu API haqida bir og'iz so'z aytmadik, ammo bizning vazifamiz uchun u minimal talab qiladi va barcha kodlar juda shaffof bo'ladi.

Xo'sh, asosiy kirish tugadi, siz misolga o'tishingiz mumkin.

O'rnatilgan an'anaga ko'ra, biz maqolada chizilgan "Uchrashuv hisoboti" ni olamiz. Sizga eslatib o'taman, hujjat shablonining ko'rinishi quyidagicha:

Shunday qilib, hujjat maydonlari bog'langan XML

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

Qadam 1. Ma'lumotlar modelini yarating

Aslida, bizning vazifamiz shunchaki hujjat yaratish emas, balki ishlab chiquvchi va foydalanuvchi uchun qulay vosita yaratish (hech bo'lmaganda qoralama versiyada).

Shuning uchun biz modelni C# sinflarining tuzilishi sifatida e'lon qilamiz:

Umumiy sinf MeetingNotes ( ommaviy MeetingNotes() ( Ishtirokchilar = yangi roʻyxat (); Qarorlar = yangi ro'yxat (); ) umumiy satr Mavzu (olish; o'rnatish; ) umumiy DateTime Sana (olish; o'rnatish; ) umumiy qator Kotib (olish; o'rnatish; ) umumiy ro'yxat Ishtirokchilar (olish; belgilangan; ) umumiy roʻyxati Decisions ( get; set; ) ) public class Decision ( public string Problem ( get; set; ) public string Solution ( get; set; ) public string Responsible ( get; set; ) public DateTime ControlDate ( get; set; ) ) public sinf ishtirokchisi (ommaviy qator nomi (olish; oʻrnatish; ) )

Umuman olganda, XML serializatsiyasini boshqarish uchun atributlar qo'shilganidan tashqari hech qanday maxsus narsa yo'q (chunki modeldagi nomlar va kerakli XML biroz farq qiladi).

2-qadam: Yuqoridagi modelni XML-ga seriyalashtiring

Vazifa, printsipial jihatdan, ahamiyatsiz. "Bizning sevimli XmlSerializerimizni oling va boring" deb ataladigan narsa, agar bitta bo'lmasa lekin

Afsuski, Office-ning joriy versiyasida xatolik mavjud bo'lib, u quyidagicha: agar maxsus xml da bo'lsa. old asosiy nom maydonini (Word ko'rsatish uchun elementlarni olishi kerak bo'lgan joy) e'lon qiling, yana bir oz ko'proq e'lon qiling, keyin takrorlangan Kontentni boshqarish elementlari noto'g'ri ko'rsatila boshlaydi (faqat shablonning o'zida qancha elementlar ko'rsatilgan bo'lsa, ya'ni takrorlanadigan bo'lim ko'rsatilmaydi). ish).

Bular. Mana ishlaydigan xml:

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

va bu ham:

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

va bu ketdi:

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

Men Connect-da Microsoft-ning qo'llab-quvvatlash xizmatiga xatolik haqida xabar berishga harakat qildim, lekin negadir menga Office orqali xatolarni yuborishga ruxsat berilmadi. MSDN forumidagi muhokama ham yordam bermadi.

Umuman olganda, zarur aylanma manevra. Agar biz XML ni qo'lda shakllantirsak, hech qanday muammo bo'lmaydi - biz hamma narsani o'zimiz qilamiz. Biroq, bu holda, men standart XmlSerializer-dan foydalanmoqchiman, bu nomlar bo'shliqlari ishlatilmasa ham, sukut bo'yicha chiqish XML-ga bir nechta nomlar maydonini qo'shadi.

Biz XmlSerializer-da o'z nom maydonlarimiz chiqishini to'liq bostiramiz. To'g'ri, bu yondashuv, agar u haqiqatan ham ularga muhtoj bo'lmasa, ishlaydi (aks holda ular hali ham qo'shiladi va biznikidan oldin).

Aslida, butun kod (agar o'zgaruvchi bo'lsa uchrashuv eslatmalari MeetingNotes turidagi ilgari to'ldirilgan ob'ektni o'z ichiga oladi):

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

var namespaces = new XmlSerializerNamespaces();
nom bo'shliqlari.Qo'shish("" , "" );

serializer.Serialize(serializedDataStream, majlis eslatmalari, nomlar maydoni);
serializedDataStream.Seek(0, SeekOrigin.Begin);

Qadam 3. Olingan XML ni Word hujjatiga kiritamiz.

Bu erda biz quyidagilarni qilamiz:

  • shablonni nusxalash va nusxasini ochish
  • unda kerakli maxsus xml ni toping (nomlar maydoni bo'yicha qidiring "urn: Uchrashuv eslatmalari")
  • komponent tarkibini bizning XML bilan almashtiramiz

File.Copy(shablon nomi, natija hujjat nomi, rost ); yordamida (var hujjat = WordprocessingDocument.Open(resultDocumentName, true )) ( var xmlpart = document.MainDocumentPart.CustomXmlParts .Single(xmlPart => xmlPart.CustomXmlPropertiesPart.DataStoreItem.SchemaReferences.OfTy) () .Har qanday(sr => sr.Uri.Value == "(!LANG:urn:MeetingNotes"!}

Biz hammamiz matnlar bilan u yoki bu tarzda ishlaymiz. Ba'zida biron bir vazifa uchun katta yoki unchalik katta bo'lmagan matnni yaratish kerak bo'ladi, masalan, formatlash bilan o'ynash, lekin qo'lda matn yo'q, uni o'zingiz yozish juda dangasa. Nima qilish kerak? Javob oddiy: Word-da o'rnatilgan tasodifiy matn generatoridan foydalaning!

Microsoft Word muharririda siz maxsus buyruqlar yordamida tez va oson matn yaratishingiz mumkin. Men Word 2007 dan gvineya cho'chqasi sifatida foydalanaman.Bu buyruqlar Word ning barcha versiyalarida ishlashi kerak. Men sizga matn yaratishning uchta usuli haqida gapirib beraman.

1-usul: rand() dan foydalanish

Rand() funksiyasi mahalliylashtirilgan matn namunasini, 3 ta jumladan 3 ta paragrafni kiritadi. Word-ni oching, kursorni matn tez orada paydo bo'ladigan joyga qo'ying va buyruqni kiriting:

va Enter tugmasini bosing. Rand funksiyasining o'zi yo'qoladi va o'rniga matnning 3 paragrafi paydo bo'ladi:

Lekin bu hammasi emas. Agar sizga ko'p matn kerak bo'lsa, unda siz rand funktsiyasidan qo'shimcha argumentlar bilan foydalanishingiz mumkin, masalan:

=rand(x,y)

qayerda" x' paragraflar sonini bildiradi va' y» - har bir paragrafdagi jumlalar soni. Masalan, =rand(20,5) har birida beshta iboradan iborat 20 ta paragraf kiritiladi. A =rand(7) har biri 3 ta jumladan iborat 7 ta xatboshini kiritadi.

2-usul: lorem() dan foydalanish

Yaxshi eski Lorem Ipsumni namuna sifatida kiritish uchun - lorem () funktsiyasidan foydalaning. Quyidagi buyruqni kiriting va Enter tugmasini bosing:

Va biz bu lotincha matnni olamiz

lorem() funktsiyasi, shuningdek, rand() kabi qo'shimcha argumentlarni bir qator paragraflar va jumlalar ko'rinishida bajonidil qabul qiladi. Argumentlarsiz funktsiya sukut bo'yicha har biri 3 ta jumladan iborat 3 ta paragrafni qo'shadi.

3-usul. Rand.old() funksiyasi

Foydalanish avvalgi buyruqlarga o'xshaydi:

=rand.old()

va Enter tugmasini bosing.

Rand.old() funksiyasi 2003 yilgacha eski ofis bilan mos kelishi uchun qoldirildi. Qo'llash usuli avvalgi ikkitasi bilan bir xil, faqat matn bir xil iboralardan iborat bo'ladi "Bu yumshoq frantsuz rulolarini ko'proq iste'mol qiling va choy iching." Bu ibora ba'zan shriftlar bilan ishlashga majbur bo'lgan har bir kishiga ma'lum.

Birinchi ikkita usulda bo'lgani kabi argumentlarni topshirishingiz mumkin.

Hammasi shu, matnlar yaratildi, endi siz ushbu yumshoq frantsuz rulolarini ko'proq yeyishingiz va choy ichishingiz mumkin :)

Yuqoridagi funksiyalardan foydalanib matn kiritishingiz mumkinmi?