سیروان شریعت پناه
سیروان شریعت پناه
خواندن ۴ دقیقه·۲ سال پیش

ارسال پارامتر از سی شارپ به مایکروسافت Word

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

سناریو رو اول بررسی میکنیم:

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

برای اینکار چندین روش وجود داره ما توی این مقاله از روش MailMergeField و Bookmark استفاده میکنیم، خب بریم سراغ آموزش:

ابتدا ما میخوایم یک الگو یا Template درست کنیم و بعد ها از روی اون نامه جدیدی رو ایجاد کنیم و فیلد هارو براش پر کنیم، برای اینکار یک سند جدید در Word ایجاد میکنیم و به سربرگ Mailings مراجعه میکنیم، دکمه Select Recipients رو بزنین از منوی باز شده Type a NewList رو بزنین با اینکار پنجره ای باز میشه دکمه Customize Columns رو بزنین این پنجره شامل فیلدهایی میشه که میتونین ازش استفاده کنین و روی سند قرار بدین و داخل برنامه با پیدا کردن این فیلد میتونین به جاش مقدار مورد نظرتون رو بهش پاس بدین، حالا شما نیاز دارین که از طرق دکمه Add تمامی فیلد هایی که یک نامه شامل میشه و به نظرتون میاد که باید لحاظ کنین رو بسازین، پس از این کار در هر دو پنجره دکمه OK رو بزنین بدین صورت یک پنجره ذخیره براتون باز میشه این فیلدهایی که ایجاد کردین به عنوان یک دیتابیس کوچیک ذخیره میشه، که تمامی فیلد هارو دارا میباشه و هرموقع خواستین دوباره میتونین از همین فیلد ها استفاده کنین،

حالا میرسیم به قرار دادن این فیلد ها داخل سند، با ذخیره کردن فیلدها، تمامی گزینه های سربرگ Mailings فعال میشن، شما برای اینکه فیلدی رو بذارین رو سند، روی Insert Merge Field کلیک و متناسب با نیازتون فیلد هارو قرار بدین و الگو رو طراحی کنین من یک نمونه میذارم:

نمونه الگوی طراحی شده
نمونه الگوی طراحی شده

حالا فایل رو با پسوند .DOT ذخیره کنین، حالا این فایل رو در دیتابیس ذخیره کنین، به این روش ذخیره کنین:

String FilePath = &quotTemplate Path&quot // Converting File to ByteArray byte[] FileBuffer = System.IO.File.ReadAllBytes(FilePath); // Now you can insert this file buffer to DB

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

ابتدا Assembly مربوط به MicroSoft.Office.Interop.Word رو به رفرنس هامون اضافه میکنیم و سربرگش رو هم Using میکنیم، حالا میرسیم به کد نویسی:

کدای زیر رو به صورت سراسری داخل فرم تعریف میکنیم

//LOCATION OF THE TEMPLATE FILE ON THE MACHINE; Object oTemplatePath = string.Format(&quot{0}\\NewDocument.dot&quot, Application.StartupPath); //OBJECT OF MISSING &quotNULL VALUE&quot Object oMissing = System.Reflection.Missing.Value; //OBJECTS OF FALSE AND TRUE Object oTrue = true; Object oFalse = false; //CREATING OBJECTS OF WORD AND DOCUMENT Microsoft.Office.Interop.Word.Application oWord = null; Microsoft.Office.Interop.Word.Document oWordDoc = null;


کدای زیر رو داخل ایونت کلیک دکمه مثلا "پیشنمایش" مینویسیم:

// Fetching Template ByteArray From Database => Byte[] YourTemplateByteArray = Fetch Template; System.IO.File.WriteAllBytes(oTemplatePath.ToString(), YourByteArray); oWord = new Microsoft.Office.Interop.Word.Application(); oWordDoc = new Microsoft.Office.Interop.Word.Document(); //Adding A New Document From A Template oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing); int iTotalFields = 0; // Finding Mailmerge Fields foreach (Microsoft.Office.Interop.Word.Field myMergeField in oWordDoc.Fields) { iTotalFields++; Microsoft.Office.Interop.Word.Range rngFieldCode = myMergeField.Code; String fieldText = rngFieldCode.Text; // Only Get The Mailmerge Fields if (fieldText.StartsWith(&quot MERGEFIELD&quot)) { // Gives The Fieldnames as Entered in .DOT File string fieldName = fieldText.Substring(12, fieldText.IndexOf(&quot &quot, 12) - 12); switch (fieldName) { case &quotLetter_No&quot : myMergeField.Select(); oWord.Selection.TypeText(txtLetterNo.Text); break; case &quotLetter_Date&quot : myMergeField.Select(); oWord.Selection.TypeText(DateTime.Now); break; case &quotLetter_Has_Attachment&quot : myMergeField.Select(); oWord.Selection.TypeText(&quotدارد یا ندارد&quot); break; // And So On default: break; } } } //Showing The Document To The User oWord.Visible = true;

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

با کدنویسی، برنامه Word رو خودمون میبندیم، نیازی به دخالت کاربر نیست.

oWordDoc.Save(); //Closing the file oWordDoc.Close(ref oFalse, ref oMissing, ref oMissing); //Quitting the application oWord.Quit(ref oMissing, ref oMissing, ref oMissing); byte[] FileBuffer = System.IO.File.ReadAllBytes(oTemplatePath.ToString ()); // Now Insert The FileBuffer Into Database as A Letter

خب کار تمومه، حالا فیلد FileBuffer رو دیگه بسته به کدنویسی خودتون باید داخل دیتابیس ذخیره کنید که برای بعدها بتونید واکشیش کنید و به کاربر نمایشش بدین.

اینم نمونه جایگذاری فیلدها:

نمونه جایگذاری فیلدها
نمونه جایگذاری فیلدها


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


سی شارپwordنامه‌ نگاریدبیرخانه
برنامه نویس سی شارپ هستم، از سال 94 بصورت حرفه ای کار برنامه نویسی رو شروع کردم، الانم بصورت فریلنسری کار میکنم، پذیرای پروژه های شما هستم
شاید از این پست‌ها خوشتان بیاید