سلام
لطفا در مورد نحوه ارسال اطلاعات فرم سی شارپ به مایکروسافت ورد راهنمایی بفرمایید
در سیستمهای دبیرخانه این کار را چطور انجام می دهند
بسیار متشکرم
سلام
لطفا در مورد نحوه ارسال اطلاعات فرم سی شارپ به مایکروسافت ورد راهنمایی بفرمایید
در سیستمهای دبیرخانه این کار را چطور انجام می دهند
بسیار متشکرم
سلام دوست عزیز، چه پارامتر هایی رو قصد دارین ارسال کنین؟ روال کلی رو در پست های آخر تاپیک زیر مشاهده کنین:
https://barnamenevis.org/showthread.p...81%D8%B1%D9%85
خب ابتدا ما میخوایم یک الگو یا Template درست کنیم و بعد ها از روی اون نامه جدیدی رو ایجاد کنیم و فیلد هارو براش پر کنیم، برای اینکار یک سند جدید در Word ایجاد کنین و به سربرگ Mailings مراجعه کنین، دکمه Select Recipients رو بزنین از منوی باز شده Type a NewList رو بزنین با اینکار پنجره ای باز میشه دکمه Customize Columns رو بزنین این پنجره شامل فیلد هایی میشه که میتونین ازش استفاده کنین و روی سند قرار بدین و داخل برنامه با پیدا کردن این فیلد میتونین به جاش مقدار مورد نظرتون رو بهش پاس بدین، حالا شما نیاز دارین که از طرق دکمه Add تمامی فیلد هایی که یک نامه شامل میشه و به نظرتون میاد که باید لحاظ کنین رو بسازین، پس از این کار در هر دو پنجره دکمه OK رو بزنین بدین صورت یک پنجره ذخیره براتون باز میشه این فیلد هایی که ایجاد کردین به عنوان یک دیتابیس کوچیک ذخیره میشه، که تمامی فیلد هارو دارا میباشه و هرموقع خواستین دوباره میتونین از همین فیلد ها استفاده کنین،
حالا میرسیم به قرار دادن این فیلد ها داخل سند، با ذخیره کردن فیلدها، تمامی گزینه های سربرگ Mailings فعال میشن، شما برای اینکه فیلدی رو بذارین رو سند، روی Insert Merge Field کلیک و متناسب با نیازتون فیلد هارو قرار بدین و الگو رو طراحی کنین من یک نمونه میذارم:
LetterTemplate.jpg
حالا فایل رو با پسوند .DOT ذخیره کنین، حالا این فایل رو در دیتابیس ذخیره کنین، به این روش ذخیره کنین:الان ما الگومون آماده ست و میتونیم از طریق برنامه به این الگو دسترسی داشته باشیم و بهش پارامتر هاشو ارسال کنیمString FilePath = "Template Path";
// 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("{0}\\NewDocument.dot", Application.StartupPath);
//OBJECT OF MISSING "NULL VALUE"
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.ToStrin g(), 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(" MERGEFIELD"))
{
// Gives The Fieldnames as Entered in .DOT File
string fieldName = fieldText.Substring(12, fieldText.IndexOf(" ", 12) - 12);
switch (fieldName)
{
case "Letter_No":
myMergeField.Select();
oWord.Selection.TypeText(txtLetterNo.Text);
break;
case "Letter_Date":
myMergeField.Select();
oWord.Selection.TypeText(DateTime.Now);
break;
case "Letter_Has_Attachment":
myMergeField.Select();
oWord.Selection.TypeText("دارد یا ندارد");
break;
// And So On
default:
break;
}
}
}
//Showing The Document To User
oWord.Visible = true;
///////////////////////////////////////////////////////////////////////////////////////////////////////
// یک دکمه بذار برای ذخیره فایل ورد، زمانی که کاربر تایپ کردنش تموم شد و هنوز برنامه ورد در حال اجراس این دکمه رو اجرا میکنه
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
CalledSimple.jpg
آخرین ویرایش به وسیله mr.sirwan : چهارشنبه 19 مهر 1396 در 12:41 عصر
خسته نباشین تپملت رو در اکسس ذخیره کردم اما در کدی که ارسال کردین نوشته
System.IO.File.WriteAllBytes(oTemplatePath.ToStrin g(), YourByteArray);
منظور از yourbytearray چیه؟
اگر امکان داره سورس فایل رو هم قرار بدین ممنون میشم
منظور از myMergeField.Code; چیه سی شارپ ایراد می گیره
هر فیلدی که روی سند قرار بدیم، یک کد خواهد داشت، توسط این کد به مقدار Text اون فیلد دسترسی خواهیم داشت
متن ارور چی هستش؟
سوالتون نامفهومه، بلاخره کاربر باید متن نامه رو بنویسه و نامه رو تنظیم کنه یا خیر؟ اگر اینطوره پس باید کاربر بعد از اعمال تغییرات دلخواهش نامه رو توسط یک دکمه ذخیره کنه، اگر نه داخل ایونت کلیک دکمه "پیشنمایش" دستورات مربوط به ایونت دکمه ذخیره سازی رو هم بنویسین فقط خط oWord.Visible رو حذف کنین، یعنی عملا کد های مربوط به این دو دکمه رو ترکیب کنین، در اینصورت برنامه ورد به کاربر نمایش داده نخواهد شد و تمامی عملیات جاگذاری و ذخیره سازی در دیتابیس، بصورت مخفیانه و پشت پرده انجام میشه
با سلام من این کد را به صورت سراسری نوشتم
//THE LOCATION OF THE TEMPLATE FILE ON THE MACHINE;
Object oTemplatePath = string.Format("{0}\\NewDocument.dot", System.Windows.Forms.Application.StartupPath);
//OBJECT OF MISSING "NULL VALUE"
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;
این کد را درون دکمه
String FilePath = "F:/1.dot";
byte[] FileBuffer = System.IO.File.ReadAllBytes(FilePath);
// Fetching Template ByteArray From Database => Byte[] YourTemplateByteArray = Fetch Template;
System.IO.File.WriteAllBytes(oTemplatePath.ToStrin g(), FileBuffer);
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 Milmerge Fields
if (fieldText.StartsWith(" MERGEFIELD"))
{
// Gives The Fieldnames as Entered in .DOT File
string fieldName = fieldText.Substring(12, fieldText.IndexOf(" ", 12) - 12);
switch (fieldName)
{
case "be":
myMergeField.Select();
oWord.Selection.TypeText(textBox9.Text);
break;
case "az":
myMergeField.Select();
oWord.Selection.TypeText(textBox10.Text);
break;
case "mozoo":
myMergeField.Select();
oWord.Selection.TypeText(textBox12.Text);
break;
// And So On
default:
break;
}
}
}
//Showing The Document To The User
oWord.Visible = true;
درون فایل ورد مرج فیلد انجام دادم اما وقتی روی دکمه میزنم فقط فایل ورد بازمیشه و پارامتر ها ارسال نمیشن در صورتی که تب mailing همه خاموش و عیر فعال میشه
درصورتی که فایل رو که بصورت دستی باز میکنم همه چی درسته
لطفا راهنمایی بفرمائید.
با سلام
لطفا ابتدا این خط رو بررسی کنین، به جای اسلش (/) باید از بک اسلش (\) استفاده کنین:درصورتی که میخواین از فایل موجود در سیستم استفاده کنین، پس دیگه لزومی نداره از ReadAllBytes و پس از اون از WriteAllBytes استفاده کنین، فقط آدرس فایل رو بدین کافیه، اون اعمال واسه زمانیه که فایل تمپلیتتون داخل دیتابیس ذخیره شده باشه (لطفا پست های مربوطه رو کامل بخونین).String FilePath = "F:/1.dot";
درمورد مشکلتون:
احتمالا قسمت نام فیلد به درستی انتخاب نمیشه، شما با trace کردن میتونین به این مشکل پی ببرین، این خط هارو بررسی کنین و درصورت لزوم تغییرشون بدین:
درصورتی که نام mailmergefield درست انتخاب نشه، Switch-case هم هیچ مشابهتی پیدا نکرده و فیلدارو جایگذاری نمیکنه، دوباره تاکید میکنم که روند اجرای این دستورات رو Trace کنین و ببینین که مشکل کجاست
if (fieldText.StartsWith(" MERGEFIELD"))
{
// Gives The Fieldnames as Entered in .DOT File
string fieldName = fieldText.Substring(12, fieldText.IndexOf(" ", 12) - 12);
تشکر دوست عزیز اما مشکل برطرف نشداین برنامه فایل رو کجای دیتا بیس ذخیره میکنهاگر یه نمونه کوچیک زحمت میکشیدی بصورت عملی میزاشتی مشکل من و افرادی که مثل من هستن حل میشدبازم تشکر از توجه شما
از پاسخگویی شما تشکر میکنمدرصورتی که میخواین از فایل موجود در سیستم استفاده کنین، پس دیگه لزومی نداره از ReadAllBytes و پس از اون از WriteAllBytes استفاده کنین، فقط آدرس فایل رو بدین کافیه، اون اعمال واسه زمانیه که فایل تمپلیتتون داخل دیتابیس ذخیره شده باشه
مشکل از ورد بود عوض کردم درست شد پارامتر ها ارسال شدند
برای آدرس دهی چکارکنم چطور آدرس بدم که روی هر کامپیوتری جواب بده
فایل برنامه رو براتون میفرستم ممنون میشم چک کنید
روال کلی برنامه من این طوره که اطلاعات یک فرد رو میگیره بعد با انتخاب اسم مشخص میکنیم نامه به کجا، از کجا، موضوعش و متن نامه چی باشه و در نهایت به ورد ارسال میشه بعد چاپش می کنیم حالا اطلاعاتی را که برای ورد فرستادیم را در دیتابیس ذخیره می کنیم جهت هرگونه فراخوانی یا تغییر و چاپ دوباره با کدی که شما نوشتین این کار شدنی هست؟؟
ببینین شما لازمه که یک فایل template به همون روش ذکر شده درست کنین و اون رو داخل یک جدول مثلا با اسم templates که فیلدی از نوع varbinary داره ذخیره کنین (میتونین فیلدای دیگه ای هم واسش تعریف کنین، مثل تاریخ ثبت فایل داخل دیتابیس، کاربر ثبت کننده فایل و....) حالا داخل برنامه هرکسی خواستکه نامه ای تنظیم کنه ما یک نمونه از این فایل تمپلیت روی سیستم کاربر میسازیم و پارامترهای موردنظر رو به اون فایل ساخته شده روی سیستم کاربر ارسال میکنیم(توسط متود writeallbytes اون آرایه بایتی ذخیره شده تو جدول Templates رو میتونیم به یک فایل تبدیل کنیم) حالا بعد از تکمیل و تایپ نامه توسط کاربر، یک دکمه با اسم ذخیره روی فرممون قرار میدیم توسط این دکمه فایلی که در حال حاضر داخل ورد باز هست رو ذخیره میکنیم، توسط متد ReadAllBytes معادل آرایه بایتی اون فایل رو بدست آورده و اون آرایه رو داخل یه جدول با اسم مثلا letterdocs و با یک فیلد از نوع varbinary ذخیره میکنیم، تمام
عذرخواهی میکنم، الان با گوشی آنلاین هستم فعلا نمیتونم پروژه تون رو دانلود کنم
پ.ن: در این پست شرح مختصری از این دستورات رو ارائه دادم، خوندنشون میتونه براتون مفید باشه:
https://barnamenevis.org/showthread.p...=1#post2338131
آخرین ویرایش به وسیله mr.sirwan : چهارشنبه 22 دی 1395 در 11:52 صبح
سلام خدمت دوستان عزیز
من از این روش برای ارسال دیتا به ورد استفاده میکنم و جواب هم میگیرم
منتها میخوام وقتی یه رشته با فرمت html رو ارسال میکنم اون رو با css که برای تگ ها نوشتم در ورد نمایش بده
بخوام دقیق تر بگم همنطور که در صفحات html متن رو نشون میده در ورد هم همون طور باشه
من یه کد میخوام که رشته htmlی من رو به یه رشته با همون خواص تبدیل کنه و نمایش بده
ممنون از همه اساتید محترم
سلام دوستان من از کد هایی که هست استفاده کردم فقط تاریخ تو shape هست مقادیر ارسال نمیشه لطفا اگر ممکن هست راهنمایی کنید