زنگ

کسانی هستند که قبل از شما این خبر را می خوانند.
برای دریافت مقالات جدید مشترک شوید.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید زنگ را بخوانید؟
بدون هرزنامه

موضوع کار با فرم ها را در 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() (شرکت کنندگان = لیست جدید ()؛ تصمیمات = فهرست جدید ()؛ ) رشته عمومی موضوع ( دریافت؛ تنظیم؛ ) عمومی تاریخ زمان تاریخ ( دریافت؛ تنظیم؛ ) رشته عمومی منشی ( دریافت؛ تنظیم؛ ) فهرست عمومی شرکت کنندگان ( دریافت؛ تنظیم؛ ) فهرست عمومی تصمیمات ( get; set; ) ) کلاس عمومی تصمیم ( رشته عمومی مشکل ( دریافت ؛ مجموعه ؛ ) رشته عمومی راه حل ( دریافت ؛ تنظیم ؛ ) رشته عمومی مسئول ( دریافت؛ تنظیم؛ ) عمومی 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، اما به دلایلی من برای ارسال اشکالات آفیس دسترسی ندارم. و بحث در انجمن 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 == "urn:MeetingNotes"!}

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

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) ایجاد می شود.

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

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

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

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

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

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

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

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

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

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

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

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

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

فرم HTML

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

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

این فایل را به عنوان "index.html" در فهرست میزبان مجازی ذخیره کنید تا بتوان به آدرسی مانند 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 == "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 = "نام"؛ $mapping = "سن"؛ $mapping = "msg"؛ $mapping = "printdate"؛ بازگشت $mapping؛ )

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

$assembly = "Microsoft.Office.Interop.Word، نسخه=15.0.0.0، فرهنگ=خنثی، 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. اعمال سبک ها در محتوای سند (تراز، فونت ها، استایل ها و غیره) در یک اسکریپت تعداد خطوط کد را تا حد زیادی افزایش می دهد. تغییر سبک‌ها از نظر برنامه‌ریزی بسیار دشوار است.

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

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

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

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

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

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

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

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

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

$d->PrintOut();

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

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

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

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

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

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

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

این امر سرعت توسعه را تا حد زیادی کاهش می دهد. برای سرعت بخشیدن به توسعه، توصیه می کنم ابتدا توابع را در سی شارپ بنویسید و سپس کد را به PHP ترجمه کنید. من می توانم یک IDE رایگان برای توسعه سی شارپ به نام "#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; int len=flds.Count; foreach (Word.Field f در flds) (f.Select(); int i=f.Index; w.Selection.TypeText("...")؛ )

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

با تعیین نوع متغیر، می توانید از کد پاک تر و تکمیل خودکار لذت ببرید و سرعت توسعه به میزان قابل توجهی افزایش می یابد.

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

و مهمتر از همه، مستندات آفیس 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 و قابلیت های Microsoft Office را نشان دادیم.

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

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

همه ما به نوعی با متون سروکار داریم. گاهی اوقات نیاز به تولید یک متن بزرگ یا نه خیلی زیاد برای یک کار وجود دارد، مثلاً برای بازی با قالب بندی، اما هیچ متنی در دسترس نیست، شما خیلی تنبل هستید که خودتان آن را بنویسید. چه باید کرد؟ پاسخ ساده است: از مولد متن تصادفی ساخته شده در Word استفاده کنید!

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

روش 1: استفاده از rand()

تابع rand() یک متن نمونه بومی سازی شده، 3 پاراگراف در 3 جمله را وارد می کند. Word خود را باز کنید، مکان نما خود را در جایی قرار دهید که یک دسته از متن ظاهر شود و دستور را وارد کنید:

و Enter را فشار دهید. تابع rand خود ناپدید می شود و 3 پاراگراف متن به جای آن ظاهر می شود:

اما این همه ماجرا نیست. اگر به متن زیادی نیاز دارید، می توانید از تابع rand با آرگومان های اضافی مانند زیر استفاده کنید:

=rand(x,y)

جایی که " ایکس"به معنی تعداد پاراگراف ها، و " y"-تعداد جملات در هر پاراگراف. مثلا، = رند (20.5) 20 پاراگراف با پنج عبارت درج خواهد شد. آ = رند (7) 7 پاراگراف 3 جمله ای درج می کند.

روش 2: استفاده از lorem()

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

و ما این متن پان لاتین را دریافت می کنیم

تابع lorem() نیز به راحتی آرگومان های اضافی مانند rand() را در قالب تعداد پاراگراف ها و جملات می پذیرد. بدون آرگومان، تابع به طور پیش فرض 3 پاراگراف را با سه جمله درج می کند.

روش 3. تابع rand.old().

استفاده مشابه دستورات قبلی است:

=rand.old()

و Enter را فشار دهید.

تابع rand.old() برای سازگاری با دفتر قدیمی، تا سال 2003 باقی مانده است. روش استفاده مانند دو مورد قبلی است، فقط متن از همان عبارات تشکیل شده است: "از این رول های نرم فرانسوی بخورید و کمی چای بنوشید." هر کسی که گهگاه با فونت کار کرده است این عبارت را می داند.

شما می توانید آرگومان ها را مانند دو روش اول ارسال کنید.

این همه، متن ها تولید شده اند، حالا می توانید بیشتر از این رول های نرم فرانسوی بخورید و چای بنوشید :)

آیا با استفاده از توابع بالا توانستید متن را جایگذاری کنید؟

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

شرح مکانیسم

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

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

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

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

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

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

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

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

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

روش انتقال

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

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

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

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

  • یک قالب سند 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. به طور فعال از آن استفاده کنید!

زنگ

کسانی هستند که قبل از شما این خبر را می خوانند.
برای دریافت مقالات جدید مشترک شوید.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید زنگ را بخوانید؟
بدون هرزنامه