نحوه تولید اسناد در word Exwog - تولید کننده گزارش از اکسل به ورد توسط الگو

ما در دنیایی زندگی می کنیم که توسعه دهندگان PHP باید هر از چند گاهی با سیستم عامل ویندوز تعامل داشته باشند. WMI (رابط مدیریت ویندوز، رابط مدیریت ویندوز) - یکی از این نمونه ها تعامل با مایکروسافت آفیس است.

در این مقاله، ما به یک ادغام ساده بین Word و PHP نگاه خواهیم کرد: ایجاد یک سند Microsoft Word بر اساس فیلدهای ورودی در فرم HTML با استفاده از PHP (و پسوند Interop آن).

مراحل مقدماتی

اول از همه، بیایید مطمئن شویم که یک محیط اولیه WAMP را راه اندازی کرده ایم. از آنجایی که Interop فقط در ویندوز وجود دارد، ما نیاز داریم که سرور آپاچی و نصب پی اچ پی ما روی یک ماشین ویندوز مستقر شود. به این ترتیب، من از EasyPHP 14.1 استفاده می کنم که نصب و راه اندازی آن بسیار آسان است.

مرحله بعدی نصب مایکروسافت آفیس است. نسخه خیلی مهم نیست. من از Microsoft Office 2013 Pro استفاده می کنم، اما هر نسخه آفیس قدیمی تر از 2007 باید کار کند.

همچنین باید مطمئن شویم که کتابخانه هایی را برای توسعه برنامه Interop (PIA، Primary Interop Assemblies، Primary Interop Assemblies) نصب کرده ایم. با باز کردن ویندوز اکسپلورر و رفتن به دایرکتوری می توانید به این موضوع پی ببرید \assembly، و در آنجا باید مجموعه ای از اسمبلی های نصب شده را ببینیم:

در اینجا می توانید عنصر Microsoft.Office.Interop.Word را ببینید (که در تصویر زیر خط کشیده شده است). این ساختنی است که ما در نسخه ی نمایشی خود استفاده خواهیم کرد. لطفاً به فیلدهای «نام مجمع»، «نسخه» و «ژتون کلید عمومی» توجه ویژه داشته باشید. ما به زودی از آنها در اسکریپت PHP خود استفاده خواهیم کرد.

این دایرکتوری همچنین حاوی مجموعه های دیگری (از جمله کل خانواده آفیس) است که برای استفاده در برنامه های آنها (نه تنها برای PHP، بلکه برای VB.net، C# و غیره) در دسترس هستند.

اگر لیست اسمبلی ها شامل کل بسته Microsoft.Office.Interop نیست، باید آفیس را با افزودن PIA مجدداً نصب کنیم یا به صورت دستی بسته را از وب سایت مایکروسافت دانلود و نصب کنیم. برای دستورالعمل های دقیق تر به این صفحه MSDN مراجعه کنید.

اظهار نظرتوجه: فقط توزیع PIA مایکروسافت آفیس 2010 برای دانلود و نصب در دسترس است، نسخه اسمبلی این بسته 14.0.0 است و نسخه 15 فقط با آفیس 2013 ارائه می شود.

در نهایت باید پسوند php_com_dotnet.dll را در php.ini فعال کنید و سرور را ریستارت کنید.

حالا می توانیم به سراغ برنامه نویسی برویم.

فرم HTML

از آنجایی که بخش اصلی این مثال در سمت سرور قرار دارد، یک صفحه ساده با فرمی ایجاد خواهیم کرد که به شکل زیر است:

ما یک فیلد متنی برای نام، یک گروه از دکمه‌های رادیویی برای جنسیت، یک نوار لغزنده برای سن، و یک قسمت ورودی متن برای وارد کردن یک پیام، و همچنین دکمه بدنام «ارسال» داریم.

این فایل را به عنوان "index.html" در فهرست میزبان مجازی ذخیره کنید تا در URL مانند http://test/test/interop قابل دسترسی باشد.

بخش سرور

فایل کنترل کننده در سمت سرور هدف اصلی مکالمه ما است. ابتدا کد کامل این فایل را می دهم و سپس مرحله به مرحله توضیح می دهم.

قابل مشاهده = واقعی $fn = __DIR__ . "\\template.docx"؛ $d = $w->Documents->Open($fn); echo "سند باز است.


"; $flds = $d->Fields; $count = $flds->Count; echo "سند دارای فیلدهای $count است.
"؛ پژواک"
    "; $mapping = setupfields(); foreach ($flds as $index => $f) ($f->Select(؛ $key = $mapping[$index]; $value = $inputs[$key]; if ($key == "جنسیت") ( if ($value == "(!LANG:m") $value = "آقای."; else $value = "اماس."; } if($key=="printdate") $value= date ("Y-m-d H:i:s"); $w->Selection->TypeText($value); echo "!}
  • اختصاص $index: $key به $value
  • ";) اکو"
"; echo "پردازش کامل شد!

"؛ echo "چاپ، لطفا صبر کنید...
"; $d->PrintOut(); sleep(3); echo "Done!"; $w->Quit(false); $w=null; function setupfields() ($mapping = array(); $mapping = "جنسیت"؛ $mapping = "name"؛ $mapping = "سن"؛ $mapping = "msg"؛ $mapping = "printdate"؛ بازگشت $mapping؛ )

پس از اینکه مقادیر دریافت شده از فرم را در متغیر $inputs نوشتیم و همچنین یک عنصر خالی با کلید printdate ایجاد کردیم (چرا این کار را انجام دادیم - بعداً در مورد آن صحبت خواهیم کرد)، به چهار خط بسیار مهم می رویم:

$assembly = "Microsoft.Office.Interop.Word، Version=15.0.0.0، Culture=Neutral، PublicKeyToken=71e9bce111e9429c"; $class = "Microsoft.Office.Interop.Word.ApplicationClass"; $w = DOTNET جدید ($assembly، $class); $w->visible = true;

دستکاری کننده COM PHP نیاز به نمونه سازی کلاس در " اسمبلی " دارد. در مورد ما، ما با Word کار می کنیم. اگر به اسکرین شات اول نگاه کنید، می توانید امضای اسمبلی کامل را برای Word یادداشت کنید:

  • «Name»، «Version»، «Public Key Token» همگی از اطلاعاتی گرفته شده‌اند که می‌توانند در «c:\Windows\assembly» مشاهده شوند.
  • "فرهنگ" همیشه خنثی است

کلاسی که می خواهیم به آن اشاره کنیم همیشه اسم اسمبلی + .ApplicationClass نام دارد.

با تنظیم این دو پارامتر می توانیم یک شی را برای کار با Word بدست آوریم.

این شی می‌تواند در پس‌زمینه باقی بماند، یا می‌توانیم آن را با تنظیم مشخصه قابل مشاهده روی true وارد کنیم.

گام بعدی باز کردن سندی است که باید پردازش شود و نمونه‌ای از "سند" را در متغیر $d بنویسید.

راه های مختلفی برای ایجاد محتوای مبتنی بر فرم در یک سند وجود دارد.

بدترین کاری که باید انجام دهید این است که محتوای سند را در PHP کدنویسی کنید و سپس آن را در یک سند Word خارج کنید. اکیداً توصیه می کنم به دلایل زیر این کار را انجام ندهید:

  1. انعطاف پذیری خود را از دست می دهید. هر گونه تغییر در فایل خروجی نیاز به تغییر در کد PHP دارد.
  2. این جدایی کنترل و دید را می شکند
  3. اعمال سبک ها در محتوای سند (تراز، فونت ها، سبک ها و غیره) در یک اسکریپت تعداد خطوط کد را تا حد زیادی افزایش می دهد. تغییر سبک‌ها از نظر برنامه‌ریزی بسیار دشوار است.

یکی دیگر از گزینه ها استفاده از Find and جایگزین است. PHP ابزارهای داخلی خوبی برای این کار دارد. ما می‌توانیم یک سند Word ایجاد کنیم که در آن برچسب‌هایی با جداکننده‌های مخصوص قرار می‌دهیم که بعداً جایگزین می‌شوند. به عنوان مثال، می توانیم سندی ایجاد کنیم که حاوی قطعه زیر باشد:

و به کمک PHP می توانیم به راحتی آن را با محتویات فیلد “Name” دریافتی از فرم جایگزین کنیم.

این ساده است و ما را از تمام عواقب ناخوشایندی که در روش اول با آن مواجه می شویم نجات می دهد. ما فقط باید در مورد جداکننده صحیح تصمیم بگیریم، در این صورت در نهایت از یک الگو استفاده می کنیم.

من روش سوم را توصیه می کنم و مبتنی بر دانش عمیق ورد است. از فیلدها به عنوان مکان‌نما استفاده می‌کنیم و با استفاده از کد PHP مستقیماً مقادیر موجود در فیلدها را با مقادیر مربوطه به‌روزرسانی می‌کنیم.

این رویکرد منعطف، سریع و سازگار با بهترین شیوه های Word است. با استفاده از آن، می توانید از جستجوی تمام متن در سند نیز اجتناب کنید که تأثیر خوبی بر عملکرد دارد. توجه داشته باشید که این راه حل دارای معایبی نیز می باشد.

Word از همان ابتدا از فهرست های نامگذاری شده برای فیلدها پشتیبانی نمی کرد. حتی اگر نام هایی برای فیلدهای ایجاد شده مشخص کرده باشیم، باز هم باید از شناسه های عددی این فیلدها استفاده کنیم. این همچنین توضیح می دهد که چرا باید از یک تابع جداگانه (setupfields) برای مطابقت با فهرست فیلد و نام فیلد از فرم استفاده کنیم.

در این دمو از سندی با 5 فیلد MERGEFIELD استفاده خواهیم کرد. ما سند الگو را در همان مکان کنترل کننده اسکریپت خود قرار می دهیم.

لطفاً توجه داشته باشید که فیلد تاریخ چاپ فیلد مربوطه در فرم ندارد. به همین دلیل است که ما یک عنصر خالی چاپی به آرایه $inputs اضافه کردیم. بدون این، اسکریپت همچنان اجرا و اجرا می شود، اما PHP هشداری مبنی بر عدم وجود فهرست تاریخ چاپ در آرایه $inputs صادر می کند.

پس از جایگزینی فیلدها با مقادیر جدید، سند را با آن چاپ می کنیم

$d->PrintOut();

روش PrintOut چند پارامتر اختیاری دارد و ما از ساده ترین شکل آن استفاده می کنیم. با این کار یک کپی از سند روی چاپگر پیش‌فرض متصل به دستگاه ویندوز چاپ می‌شود.

همچنین می توانید با PrintPreview تماس بگیرید تا نتیجه را قبل از چاپ ببینید. در یک محیط کاملا اتوماتیک، ما البته از روش PrintOut استفاده خواهیم کرد.

قبل از خروج از برنامه Word باید مدتی صبر کنید، زیرا طول می کشد تا کار چاپ در صف قرار گیرد. بدون تاخیر(3)، متد $w->Quit بلافاصله اجرا می‌شود و کار در صف قرار نمی‌گیرد.

در نهایت، $w->Quit(false) را فراخوانی می کنیم، که برنامه Word را که توسط اسکریپت ما فراخوانی شده بود، می بندد. تنها پارامتری که به متد داده می شود ذخیره فایل قبل از خروج است. ما ویرایش‌هایی را در سند انجام داده‌ایم، اما نمی‌خواهیم آنها را ذخیره کنیم، زیرا برای کارهای بعدی به یک الگوی تمیز نیاز داریم.

پس از اتمام کد، می‌توانیم صفحه فرم خود را بارگذاری کنیم، مقادیری را پر کرده و آن را ارسال کنیم. تصاویر زیر خروجی اسکریپت و همچنین سند به روز شده Word را نشان می دهد:

سرعت پردازش بهبود یافته و کمی بیشتر در مورد PIA

پی اچ پی زبانی است که تایپ شده است. یک شی COM از نوع Object. در حین نوشتن اسکریپت، هیچ راهی برای دریافت توضیحات شیء نداریم، خواه یک برنامه Word، یک سند یا یک فیلد. ما نمی دانیم این شی چه ویژگی هایی دارد یا از چه روش هایی پشتیبانی می کند.

این امر سرعت توسعه را تا حد زیادی کاهش می دهد. برای سرعت بخشیدن به توسعه، توصیه می کنم ابتدا توابع را در سی شارپ بنویسید و سپس کد را به PHP ترجمه کنید. من می توانم یک IDE رایگان برای توسعه C# به نام "#develop" توصیه کنم. می توانید او را پیدا کنید. من آن را به ویژوال استودیو ترجیح می دهم زیرا #develop کوچکتر، آسان تر و سریعتر است.

انتقال کد سی شارپ به PHP آنقدرها هم که به نظر می رسد ترسناک نیست. بگذارید چند خط را در سی شارپ به شما نشان دهم:

Word.Application w=new Word.Application(); w.Visible=true; String path=Application.StartupPath+"\\template.docx"; Word.Document d=w.Documents.Open(path) as Word.Document; Word.Fields flds=d.Fields; intlen=flds.Count; foreach (Word.Field f در flds) (f.Select(); int i=f.Index; w.Selection.TypeText("...")؛ )

می بینید که کد سی شارپ بسیار شبیه به کد PHP است که قبلا نشان دادم. سی شارپ یک زبان قوی تایپ شده است، بنابراین در این مثال می توانید چندین عملگر Cast را مشاهده کنید و همچنین باید یک نوع برای متغیرها مشخص کنید.

با تعیین نوع متغیر می توانید از کدهای واضح تر و تکمیل خودکار لذت ببرید و سرعت توسعه بسیار افزایش می یابد.

راه دیگر برای سرعت بخشیدن به توسعه PHP فراخوانی یک ماکرو در Word است. ما همان توالی اقدامات را انجام می دهیم و سپس آن را به عنوان یک ماکرو ذخیره می کنیم. ماکرو با ویژوال بیسیک نوشته شده است که ترجمه آن به PHP نیز آسان است.

و مهمتر از همه، مستندات Office PIA مایکروسافت، به ویژه اسناد فضای نام هر برنامه آفیس، دقیق ترین مرجع است. سه برنامه پرکاربرد عبارتند از:

  • 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
  • پاورپوینت 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint(v=office.15).aspx

نتیجه

در این مقاله به شما نشان دادیم که چگونه یک سند Word را با داده ها با استفاده از کتابخانه های PHP COM و قابلیت همکاری مایکروسافت آفیس پر کنید.

ویندوز و آفیس به طور گسترده در زندگی روزمره استفاده می شوند. دانستن قدرت Office/Window و PHP برای هر توسعه دهنده PHP و ویندوز مفید خواهد بود.

پسوند PHP COM در را به روی شما باز می کند تا از این ترکیب استفاده کنید.

موضوع کار با فرم ها را در Word که قبلا شروع کرده بودیم ادامه می دهیم. در مقالات قبلی، ما فقط از منظر "کاربر قدرتمند" به فرم ها نگاه کردیم، یعنی. ما اسنادی را ایجاد کردیم که برای پر کردن دستی مناسب است. امروز، می‌خواهم گسترش این وظیفه و تلاش برای استفاده از مکانیسم کنترل محتوا برای تولید اسناد را پیشنهاد کنم.

قبل از اینکه به کار فوری خود بپردازیم، می خواهم چند کلمه در مورد نحوه ذخیره داده های مربوط به کنترل های محتوا در اسناد Word بگویم (در حال حاضر عمداً نحوه پیوند آنها با محتوای سند را حذف می کنم، اما امیدوارم بازگردم. به این در مقالات بعدی).

سوال مشروع این است که چیست itemProps1.xmlو اجزای مشابه؟ این مؤلفه ها توضیحات منابع داده را ذخیره می کنند. به احتمال زیاد، همانطور که توسط توسعه دهندگان تصور می شد، علاوه بر فایل های xml تعبیه شده در سند، قرار بود از موارد دیگری نیز استفاده شود، اما تاکنون فقط این روش پیاده سازی شده است.

آنچه برای ما مفید است itemPropsX.xml? این واقعیت که آنها طرحواره های xml را فهرست می کنند (آنها فضای نام target) که در والد استفاده می شوند itemX.xml. این بدان معناست که اگر بیش از یک xml سفارشی را در سند گنجانده باشیم، برای یافتن مورد مناسب، باید آن را اجرا کنیم. itemPropsX.xmlاجزاء و پیدا کردن مدار مورد نظر، و در نتیجه مورد نظر itemX.xml.

حالا یک لحظه دیگر ما به صورت دستی روابط بین مؤلفه ها را تجزیه و تحلیل نمی کنیم و فقط با استفاده از Packaging API اولیه به دنبال موارد مناسب می گردیم! در عوض، از Open XML SDK استفاده می کنیم (بیلدهای آن از طریق NuGet در دسترس هستند). البته، ما قبلاً یک کلمه در مورد این API نگفتیم، اما برای کار ما به حداقل نیاز دارد و همه کدها کاملاً شفاف خواهند بود.

خب، مقدمه اصلی انجام شد، می توانید به سراغ مثال بروید.

طبق سنت ثابت شده، ما همان "گزارش جلسه" را که در مقاله ترسیم کردیم، خواهیم گرفت. اجازه دهید یادآوری کنم که الگوی سند به این صورت است:

و بنابراین، XML که فیلدهای سند به آن مقید شده بودند

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

مرحله 1. یک مدل داده ایجاد کنید

در واقع، وظیفه ما فقط تولید یک سند نیست، بلکه ایجاد (حداقل در نسخه پیش نویس) ابزاری مناسب برای استفاده توسط توسعه دهنده و کاربر است.

بنابراین، مدل را به عنوان ساختاری از کلاس های C# اعلام می کنیم:

کلاس عمومی MeetingNotes ( عمومی MeetingNotes () (شرکت کنندگان = لیست جدید () تصمیمات = فهرست جدید () ) رشته عمومی موضوع ( دریافت؛ تنظیم؛ ) عمومی تاریخ زمان تاریخ ( دریافت؛ تنظیم؛ ) رشته عمومی منشی ( دریافت؛ تنظیم؛ ) فهرست عمومی شرکت کنندگان ( دریافت؛ تنظیم؛ ) فهرست عمومی تصمیمات (به دست آوردن؛ تنظیم؛)) کلاس عمومی تصمیم (رشته عمومی مشکل (به دست آوردن؛ تنظیم؛) رشته عمومی راه حل (به دست آوردن؛ تنظیم؛) رشته عمومی مسئول (به دست آوردن؛ تنظیم؛) عمومی DateTime ControlDate ( دریافت؛ تنظیم؛ ) عمومی شرکت کننده کلاس (نام رشته عمومی (به دست آوردن؛ مجموعه؛))

به طور کلی، چیز خاصی نیست، به جز اینکه ویژگی هایی برای کنترل سریال سازی XML اضافه شده است (زیرا نام های مدل و XML مورد نیاز کمی متفاوت است).

مرحله 2: مدل بالا را به XML سریال کنید

این وظیفه، در اصل، پیش پا افتاده است. چیزی که "XmlSerializer مورد علاقه ما را بردارید و بروید" نامیده می شود، اگر نه برای یکی ولی

متأسفانه در نسخه فعلی آفیس ظاهراً یک باگ وجود دارد که به شرح زیر است: اگر در xml سفارشی باشد جلوبا اعلام فضای نام اصلی (مجموعه ای که Word باید عناصر را برای نمایش از آن بگیرد)، تعداد بیشتری را اعلام کنید، سپس کنترل های محتوای مکرر شروع به نمایش نادرست می کنند (فقط به تعداد عناصری که در خود الگو وجود دارد نشان داده می شود - یعنی بخش تکراری نشان داده نمی شود. کار).

آن ها این xml است که کار می کند:

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

و این یکی هم:

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

و این یکی از بین رفت:

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

من سعی کردم یک اشکال را به پشتیبانی مایکروسافت در Connect ارسال کنم، اما به دلایلی از دسترسی به ارسال اشکالات از طریق Office محروم شدم. بحث در انجمن MSDN نیز کمکی نکرد.

به طور کلی مانور انحرافی لازم. اگر XML را با دست تشکیل می دادیم، هیچ مشکلی وجود نداشت - همه کارها را خودمان انجام می دادیم. با این حال، در این مورد، من واقعاً می خواهم از XmlSerializer استاندارد استفاده کنم که به طور پیش فرض چندین فضای نام خود را به XML خروجی اضافه می کند، حتی اگر از این فضاهای نام استفاده نشود.

ما یک سرکوب کامل خروجی فضای نام خود را در XmlSerializer انجام خواهیم داد. درست است، این رویکرد فقط در صورتی کار خواهد کرد که او واقعاً به آنها نیاز نداشته باشد (در غیر این صورت آنها هنوز هم اضافه خواهند شد و فقط قبل از ما).

در واقع، کل کد (به شرطی که متغیر یادداشت های جلسهحاوی یک شی از نوع MeetingNotes است که قبلاً پر شده است:

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

var namespaces = new XmlSerializerNamespaces();
namespaces.Add("" , "" );

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

مرحله 3. XML حاصل را در یک سند Word وارد می کنیم.

در اینجا ما موارد زیر را انجام می دهیم:

  • قالب را کپی کنید و کپی را باز کنید
  • xml دلخواه دلخواه را در آن بیابید (با فضای نام جستجو کنید "urn:MeetingNotes")
  • ما محتویات کامپوننت را با XML خود جایگزین می کنیم

File.Copy(TemplateName, resultDocumentName, true); با استفاده از (var document = WordprocessingDocument.Open(resultDocumentName, true)) ( var xmlpart = document.MainDocumentPart.CustomXmlParts .Single(xmlPart => xmlPart.CustomXmlPropertiesPart.DataStoreItem.SchemaReferences.Of () .Any(sr => sr.Uri.Value == "(!LANG:urn:MeetingNotes"!}

در مقاله‌های قبلی در مجموعه «پر کردن خودکار اسناد»، در مورد نحوه ایجاد رابط کاربری برنامه، سازماندهی اعتبارسنجی ورودی و دریافت عدد به صورت کلمات بدون استفاده از کد VBA صحبت کردم. در این مقاله نهایی، ما در مورد جادو صحبت خواهیم کرد - انتقال تمام مقادیر لازم از یک کتاب کار اکسل به یک سند Word. بگذارید نتیجه نهایی را به شما نشان دهم:

شرح مکانیسم

برای شروع، من دقیقاً نحوه انتقال داده ها به یک سند Word را به طور کلی توضیح می دهم. اول از همه، ما به یک الگوی سند Word نیاز داریم که شامل تمام نشانه گذاری ها، جداول و آن قسمت از متن است که بدون تغییر باقی می ماند. در این الگو، باید مکان هایی را که مقادیر از کتاب کار اکسل جایگزین می شوند، تعریف کنید - راحت ترین راه برای انجام این کار با کمک نشانک ها است. پس از آن، باید داده های اکسل را به گونه ای مرتب کنید که با قالب Word مطابقت داشته باشد، و در آخر، خود رویه انتقال را در VBA بنویسید.

بنابراین، اول چیزها.

یک الگوی سند Word ایجاد کنید

همه چیز در اینجا بسیار ساده است - ما یک سند معمولی ایجاد می کنیم، متن را تایپ کرده و قالب بندی می کنیم، به طور کلی، برای به دست آوردن فرم لازم به دست می آوریم. در مکان هایی که لازم است مقادیر را از اکسل جایگزین کنید، باید نشانک ایجاد کنید. این کار به روش زیر انجام می شود:

بنابراین، شما باید همه نشانک‌ها را ایجاد کنید، یعنی تمام مکان‌هایی را که داده‌های اکسل در آن درج می‌شوند، علامت‌گذاری کنید. فایل به دست آمده باید با استفاده از آیتم منوی "File" -> "Save As..." به عنوان "MS Word Template" ذخیره شود.

آماده سازی داده های اکسل

برای راحتی، تصمیم گرفتم تمام داده هایی را که باید به سند Word منتقل شوند در یک کاربرگ جداگانه به نام نشانک ها - نشانک ها قرار دهم. این برگه دارای دو ستون است: ستون اول شامل نام نشانک ها (دقیقاً همانطور که در سند Word نامگذاری شده اند) و دومی حاوی مقادیر مربوطه است که باید منتقل شوند.

برخی از این مقادیر مستقیماً از برگه ورودی داده و برخی از جداول کمکی واقع در برگه پشتیبانی به دست می آیند. در این مقاله، فرمول هایی را که مقادیر مورد نظر را محاسبه می کنند، تجزیه و تحلیل نمی کنم، اگر چیزی واضح نیست، در نظرات سؤالات خود را بپرسید.

در این مرحله، مهم است که همه نام های نشانک ها را به درستی مشخص کنید - صحت انتقال داده ها به این بستگی دارد.

روش انتقال

اما این جالب ترین است. دو گزینه برای اجرای کد انتقال داده وجود دارد:

  • کد در یک کتاب کار اکسل اجرا می شود، داده ها هر بار یک مقدار به Word منتقل می شوند و بلافاصله در سند قرار می گیرند.
  • کد در یک سند Word جداگانه اجرا می شود، تمام داده ها از اکسل در یک دسته منتقل می شوند.

از نقطه نظر سرعت اجرا، به خصوص با تعداد زیادی بوکمارک، گزینه دوم بسیار جذاب تر به نظر می رسد، اما به اقدامات پیچیده تری نیاز دارد. همونی که استفاده کردم

در اینجا چیزی است که باید انجام شود:

  • یک الگوی سند Word با قابلیت ماکرو ایجاد کنید.این الگو حاوی کد VBA قابل اجرا خواهد بود.
  • در قالب ایجاد شده باید یک برنامه نوشته شده با VBA قرار دهید.برای انجام این کار، هنگام ویرایش یک قالب، کلید ترکیبی Alt + F11 را فشار دهید و کد برنامه را در پنجره ویرایشگر ویژوال بیسیک باز شده وارد کنید.
  • در یک کتاب کار اکسل، کدی را بنویسید که رویه پر را از قالب Word تازه ایجاد شده فراخوانی کند.

من متن رویه را در مقاله ارائه نمی کنم - می توان آن را به راحتی در فایل FillDocument.dotm واقع در پوشه Template در آرشیو مثال مشاهده کرد.

چگونه می توانید از همه اینها برای حل مشکل خاص خود استفاده کنید؟

من می دانم که در کلمات همه چیز بسیار ساده به نظر می رسد، اما در عمل چه اتفاقی می افتد؟ پیشنهاد می کنم فقط از گزینه آماده استفاده کنید. بایگانی را با مثال دانلود کنید، در یک کتاب کار اکسل، کلید ترکیبی Alt + F11 را فشار دهید تا ویرایشگر ویژوال بیسیک باز شود و تمام نظرات من در مورد برنامه را بخوانید. برای اینکه برنامه را مطابق با نیاز خود تغییر دهید، فقط باید مقدار چند ثابت را تغییر دهید، آنها در همان ابتدای برنامه قرار می گیرند. شما می توانید آزادانه کل متن برنامه را در پروژه خود کپی کنید.

ساختار آرشیو

آرشیو ضمیمه این مقاله حاوی چندین فایل است.

فایل اصلی یک کتاب کار اکسل به نام «تأیید تأییدیه» است. 4 کاربرگ در این کتاب کار وجود دارد که تنها دو کاربرگ نمایش داده می شود: "ورودی" - یک برگه ورود اطلاعات و "پایگاه داده" - آرشیو تمام اسناد وارد شده.

پوشه Templates شامل الگوهای اسناد Word است. یکی از آنها یک الگوی حاوی یک برنامه پر کردن نشانک است و دومی فرمی برای پر کردن است. شما می توانید بدون تغییر از قالب با برنامه استفاده کنید، اما فرم برای پر کردن، البته، باید مطابق با نیاز شما تغییر یابد.

چگونه مثال "برای خودتان" را دوباره کار کنید؟

  1. یک الگوی سند Word را برای تکمیل آماده کنید. تمام نشانک های لازم را در آن ایجاد کنید و آن را به عنوان "قالب MS Word" ذخیره کنید.
  2. فایل FillDocument.dotm را از آرشیو ضمیمه این مقاله در پوشه با قالب آماده شده کپی کنید. این فایل وظیفه پر کردن بوک مارک های قالب را بر عهده دارد و نیازی به تغییر چیزی در آن نیست.
  3. یک کتاب کار اکسل برای ورود اطلاعات آماده کنید. این شما هستید که تصمیم می گیرید که آیا رابط کاربری "پیشرفته" داشته باشد و محاسبات مختلف را انجام دهد. نکته اصلی این است که شامل یک کاربرگ با جدول تناظر بین نام نشانک در قالب Word و مقداری است که باید جایگزین شود.
  4. کد برنامه VBA را از فایل نمونه در کتاب کار آماده شده وارد کنید. همه ثابت ها را با توجه به پروژه خود جایگزین کنید.
  5. تست عملکرد صحیح
  6. فعالانه لذت ببرید!

آ، نام خانوادگی در ستون بو حرفه ها در ستون سی.

2. یک سند word (doc. یا .docx) ایجاد کنید


(آ), (ب)و (ج).

(آ), (ب)و (ج) (آ)- نام، (ب)- نام خانوادگی، (ج)- حرفه

تنظیماتبرنامه ها.

3. مسیرهایی را برای فایل ها و پوشه ها انتخاب کنید


انتخاب کنید

4. برگه ها و ردیف های داده های مورد نظر را تنظیم کنید


برگه های داده فایل اکسل

ردیف های داده فایل اکسل برگه های داده فایل اکسل

1 .

اگر می‌خواهید همه شیت‌ها و/یا ردیف‌های فایل اکسل خود با داده‌ها در تشکیل سند مشارکت داشته باشند، روی دکمه مربوطه در سمت راست با عنوان کلیک کنید. شماره(کتیبه آن به تغییر خواهد کرد همه).

5. قالب نام را برای فایل های word جدید تنظیم کنید


قالب نام را برای فایل های word جدید تنظیم کنید:

قالب نام فایل های word جدیدقالبی برای نام اسناد جدید (فایل های word) تولید شده توسط برنامه است. در اینجا، قالب نام شامل نام ستون‌های فایل اکسل است که توسط پرانتزهای فرفری قاب شده‌اند: (آ)و (ب). هنگام ایجاد یک سند جدید، برنامه جایگزین همه خواهد شد (آ)و (ب)مقادیر سلول مربوطه از فایل اکسل - این نام سند جدید (فایل word) خواهد بود.

می توانید کاراکترهای حاشیه خود را در برگه تنظیم کنید تنظیماتبرنامه ها.

6. روی "ایجاد" کلیک کنید


روی دکمه کلیک کنید تولید می کنندو پیشرفت روی صفحه ظاهر می شود. اسناد (فایل های word) دقیقاً به همان میزانی ایجاد می شوند که بسیاری از خطوط فایل اکسل در تشکیل آن نقش دارند.

7. همه چیز


تمام اسناد (فایل های word) ایجاد شده اند و در پوشه مشخص شده در آن قرار دارند پوشه ای برای ذخیره فایل های word جدید. همه چیز:)

Exwog- تولید کننده گزارش الگو از اکسل به ورد

تولید کننده فایل Word رایگان توسط قالب (فایل Word) بر اساس داده های فایل اکسل

روی سیستم عامل مک، ویندوز و لینوکس کار می کند

به شما امکان می دهد نام فایل های word تولید شده جدید را تنظیم کنید

به شما امکان می دهد برگه ها و ردیف هایی از داده های مورد نیاز را تنظیم کنید

به شما امکان می دهد تا کاراکترهای حاشیه را برای نام ستون های اکسل تنظیم کنید

آسان برای استفاده

داده های خود را در قالب اکسل (xls. و xlsx.) ذخیره کنید و فایل های Word (doc. و .docx) را با چند کلیک ایجاد کنید :)


چگونه کار می کند؟

به فایل اکسل خود نگاهی بیندازید


در این مثال، فایل اکسل حاوی اطلاعاتی در مورد مشتریان است. هر خط مربوط به یک مشتری خاص است. نام ها در یک ستون هستند آ، نام خانوادگی در ستون بو حرفه ها در ستون سی.

برای مشاهده کلیک کنید

یک سند word (doc. یا .docx) ایجاد کنید


برای مشاهده کلیک کنید

یک "الگو" (فایل word) برای تولید اسناد جدید (فایل های word) ایجاد کنید. در اینجا متن "الگو" حاوی نام ستون های فایل اکسل است که توسط پرانتزهای فرفری قاب شده اند: (آ), (ب)و (ج).

این برنامه اسناد جدیدی را با توجه به "الگو" جایگزین همه ایجاد می کند (آ), (ب)و (ج)مقادیر سلول مربوطه از فایل اکسل: (آ)- نام، (ب)- نام خانوادگی، (ج)- حرفه

شما همچنین می توانید کاراکترهای حاشیه خود را در برگه تنظیم کنید تنظیماتبرنامه ها.

مسیرهایی را برای فایل ها و پوشه ها انتخاب کنید


مسیرها را برای فایل‌ها و پوشه‌ها انتخاب کنید (دکمه‌های دارای برچسب انتخاب کنید). در برنامه مسیرهای زیر را مشخص می کنید:

فایل اکسل با داده (*.xls، *.xlsx)- این مسیر فایل اکسل شما با داده ها (اطلاعات مشتری) است.

فایل قالب ورد (*.doc، *.docx)مسیر "قالب" شما (فایل word ایجاد شده در مرحله قبل) است.

پوشه ای برای ذخیره فایل های word جدید- این مسیر به پوشه ای است که برنامه اسناد جدید تولید شده را در آن ذخیره می کند.

برای مشاهده کلیک کنید

برگه ها و ردیف های داده های مورد نظر را تنظیم کنید


برای مشاهده کلیک کنید

تعداد برگه ها و خطوط فایل اکسل خود را با داده ها (اطلاعات مربوط به مشتریان) که می خواهید اسناد را روی آنها ایجاد کنید، تنظیم کنید:

برگه های داده فایل اکسل- تعداد برگه های فایل اکسل شما که در تشکیل اسناد جدید نقش دارند.

ردیف های داده فایل اکسل- شماره خطوط برگه ها (برگ های مشخص شده در برگه های داده فایل اکسل) فایل اکسل شما که در تشکیل اسناد جدید نقش دارد. بر اساس داده های هر خط مشخص شده، یک سند (word-file) جداگانه ایجاد می شود.

شماره گذاری برگه ها و خطوط در برنامه با شروع می شود 1 .