PDA

View Full Version : ارسال پارامترها از سی شارپ به مایکروسافت ورد



amir_hacker333
چهارشنبه 10 شهریور 1395, 08:37 صبح
سلام
لطفا در مورد نحوه ارسال اطلاعات فرم سی شارپ به مایکروسافت ورد راهنمایی بفرمایید
در سیستمهای دبیرخانه این کار را چطور انجام می دهند
بسیار متشکرم

mr.sirwan
چهارشنبه 10 شهریور 1395, 13:07 عصر
سلام
لطفا در مورد نحوه ارسال اطلاعات فرم سی شارپ به مایکروسافت ورد راهنمایی بفرمایید
در سیستمهای دبیرخانه این کار را چطور انجام می دهند
بسیار متشکرم

سلام دوست عزیز، چه پارامتر هایی رو قصد دارین ارسال کنین؟ روال کلی رو در پست های آخر تاپیک زیر مشاهده کنین:

http://barnamenevis.org/showthread.php?528884-%D8%A8%D8%A7%D8%B2-%D8%B4%D8%AF%D9%86-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B1%D8%A7%D8%B1-word-%D8%AF%D8%A7%D8%AE%D9%84-%D9%81%D8%B1%D9%85

amir_hacker333
چهارشنبه 10 شهریور 1395, 17:01 عصر
سلام دوست عزیز، چه پارامتر هایی رو قصد دارین ارسال کنین؟ روال کلی رو در پست های آخر تاپیک زیر مشاهده کنین:

http://barnamenevis.org/showthread.php?528884-%D8%A8%D8%A7%D8%B2-%D8%B4%D8%AF%D9%86-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B1%D8%A7%D8%B1-word-%D8%AF%D8%A7%D8%AE%D9%84-%D9%81%D8%B1%D9%85


مثلا شماره و تاریخ که در ورد هم در داخل تکست باکس های از قبل تعبیه شده قرار داده بشن

mr.sirwan
چهارشنبه 10 شهریور 1395, 17:12 عصر
مثلا شماره و تاریخ که در ورد هم در داخل تکست باکس های از قبل تعبیه شده قرار داده بشن

سلام، بنده تا حالا با تکست باکس ها کار نکردم، ولی دو روش متفاوت دیگه رو کار کردم، یکی روش Bookmark و دیگری MailMergeField اگه یکی از این دو روش رو انتخاب کردین بفرمایین تا راهنماییتون کنیم

amir_hacker333
چهارشنبه 10 شهریور 1395, 21:31 عصر
سلام، بنده تا حالا با تکست باکس ها کار نکردم، ولی دو روش متفاوت دیگه رو کار کردم، یکی روش Bookmark و دیگری MailMergeField اگه یکی از این دو روش رو انتخاب کردین بفرمایین تا راهنماییتون کنیم



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

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

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

142293

حالا فایل رو با پسوند .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

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

142294

amir_hacker333
جمعه 12 شهریور 1395, 20:07 عصر
خسته نباشین تپملت رو در اکسس ذخیره کردم اما در کدی که ارسال کردین نوشته
System.IO.File.WriteAllBytes(oTemplatePath.ToStrin g(), YourByteArray);
منظور از yourbytearray چیه؟

amir_hacker333
جمعه 12 شهریور 1395, 20:23 عصر
اگر امکان داره سورس فایل رو هم قرار بدین ممنون میشم

mr.sirwan
جمعه 12 شهریور 1395, 20:31 عصر
خسته نباشین تپملت رو در اکسس ذخیره کردم اما در کدی که ارسال کردین نوشته
System.IO.File.WriteAllBytes(oTemplatePath.ToStrin g(), YourByteArray);
منظور از yourbytearray چیه؟

عرض کردم که فایل تمپلیت رو به آرایه بایتی تبدیل و اون آرایه رو داخل دیتابیس ذخیره کنین، حالا هر موقع که خواستین فایل رو از دیتابیس فراخوانی کنین، این آرایه بایتی رو توسط متد WriteAllBytes دوباره به فایل تبدیل میکنین، به کدی که نوشتم خوب دقت کنین

amir_hacker333
جمعه 12 شهریور 1395, 20:55 عصر
منظور از myMergeField.Code; چیه سی شارپ ایراد می گیره

mr.sirwan
جمعه 12 شهریور 1395, 21:26 عصر
هر فیلدی که روی سند قرار بدیم، یک کد خواهد داشت، توسط این کد به مقدار Text اون فیلد دسترسی خواهیم داشت

متن ارور چی هستش؟

amir_hacker333
شنبه 13 شهریور 1395, 06:06 صبح
هر فیلدی که روی سند قرار بدیم، یک کد خواهد داشت، توسط این کد به مقدار Text اون فیلد دسترسی خواهیم داشت

متن ارور چی هستش؟


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

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

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

142293

حالا فایل رو با پسوند .DOT ذخیره کنین، حالا این فایل رو در دیتابیس ذخیره کنین، به این روش ذخیره کنین:
String FilePath = "آدرس این الگو";
// تبدیل فایل به آرایه بایتی
byte[] FileBuffer = System.IO.File.ReadAllBytes(FilePath);
// حالا این آرایه رو داخل دیتابیس درج کن

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

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


////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// اینارو به صورت سراسری داخل فرمت تعریف کن
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//THE 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 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 "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 The 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

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

142294

سلام امکان داره یک نمونه بزارید برای درک بهتر

mr.sirwan
شنبه 13 شهریور 1395, 11:04 صبح
سلام امکان داره یک نمونه بزارید برای درک بهتر

سلام دوست عزیز، چه نمونه ی دیگه ای میخواین؟ همین نمونه کافی نیست؟

mr.sirwan
شنبه 13 شهریور 1395, 11:09 صبح
سلام ممنون مشکل حل شد فقط باید همه نامه ها آرشیو بشن
پایگاه داده ای که من استفاده کردم اکسس هست و به نظر برای این موسسه کافیه
فقط چطور می شه نامه ی نوشته شده رو در اکسس ذخیره کرد بدون اینکه نیاز باشه کاربر خودش این کار رو انجام بده

سوالتون نامفهومه، بلاخره کاربر باید متن نامه رو بنویسه و نامه رو تنظیم کنه یا خیر؟ اگر اینطوره پس باید کاربر بعد از اعمال تغییرات دلخواهش نامه رو توسط یک دکمه ذخیره کنه، اگر نه داخل ایونت کلیک دکمه "پیشنمایش" دستورات مربوط به ایونت دکمه ذخیره سازی رو هم بنویسین فقط خط oWord.Visible رو حذف کنین، یعنی عملا کد های مربوط به این دو دکمه رو ترکیب کنین، در اینصورت برنامه ورد به کاربر نمایش داده نخواهد شد و تمامی عملیات جاگذاری و ذخیره سازی در دیتابیس، بصورت مخفیانه و پشت پرده انجام میشه

Helpco
شنبه 13 شهریور 1395, 18:48 عصر
سلام دوست عزیز، چه نمونه ی دیگه ای میخواین؟ همین نمونه کافی نیست؟
به صورت فایل اجرای مخوام

mr.sirwan
شنبه 13 شهریور 1395, 20:37 عصر
به صورت فایل اجرای مخوام

اگه بخوام فایل اجراییش رو تهیه کنم باید دیتابیس ایجاد کنم، Entity framework رو نصب کنم، فایل تپلیت رو بذارم و.... متاسفانه فعلا وقتش رو ندارم ولی اگر فرصت شد سعی میکنم بعدا این آیتم رو کار کنم، یک پروژه ایجاد کنم و بذارم اینجا

amir_hacker333
شنبه 13 شهریور 1395, 23:08 عصر
اگه بخوام فایل اجراییش رو تهیه کنم باید دیتابیس ایجاد کنم، Entity framework رو نصب کنم، فایل تپلیت رو بذارم و.... متاسفانه فعلا وقتش رو ندارم ولی اگر فرصت شد سعی میکنم بعدا این آیتم رو کار کنم، یک پروژه ایجاد کنم و بذارم اینجا





اطلاعات رو از سی شارپ به ورد منتقل کردم اما تاریخ رو از راست به چپ قرار می ده 13/06/1395

mr.sirwan
یک شنبه 14 شهریور 1395, 00:54 صبح
اطلاعات رو از سی شارپ به ورد منتقل کردم اما تاریخ رو از راست به چپ قرار می ده 13/06/1395

یه راه حل خیلی خیلی خیلی خیلی خیلی زشت اینه که بیای سمت برنامه جای سال و روز رو باهم عوض کنی :لبخند::لبخند: اما اگه راه حل بهتری پیدا کردی ممنون میشم با ماهم درمیون بذاری:تشویق::چشمک:

amir_hacker333
یک شنبه 14 شهریور 1395, 09:00 صبح
یه راه حل خیلی خیلی خیلی خیلی خیلی زشت اینه که بیای سمت برنامه جای سال و روز رو باهم عوض کنی :لبخند:

:لبخند: اما اگه راه حل بهتری پیدا کردی ممنون میشم با ماهم درمیون بذاری:تشویق::چشمک:




چطور در مثالی که قرار دادین درست نوشته یعنی جای سال و ماه و روز رو باهم عوض کردین

mr.sirwan
یک شنبه 14 شهریور 1395, 11:00 صبح
چطور در مثالی که قرار دادین درست نوشته یعنی جای سال و ماه و روز رو باهم عوض کردین

بله یه همچین چیزی

alia.n
دوشنبه 20 دی 1395, 15:59 عصر
با سلام من این کد را به صورت سراسری نوشتم


//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 همه خاموش و عیر فعال میشه
درصورتی که فایل رو که بصورت دستی باز میکنم همه چی درسته
لطفا راهنمایی بفرمائید.

mr.sirwan
سه شنبه 21 دی 1395, 11:48 صبح
با سلام
لطفا ابتدا این خط رو بررسی کنین، به جای اسلش (/) باید از بک اسلش (\) استفاده کنین:
String FilePath = "F:/1.dot";

درصورتی که میخواین از فایل موجود در سیستم استفاده کنین، پس دیگه لزومی نداره از ReadAllBytes و پس از اون از WriteAllBytes استفاده کنین، فقط آدرس فایل رو بدین کافیه، اون اعمال واسه زمانیه که فایل تمپلیتتون داخل دیتابیس ذخیره شده باشه (لطفا پست های مربوطه رو کامل بخونین).
درمورد مشکلتون:
احتمالا قسمت نام فیلد به درستی انتخاب نمیشه، شما با trace کردن میتونین به این مشکل پی ببرین، این خط هارو بررسی کنین و درصورت لزوم تغییرشون بدین:


if (fieldText.StartsWith(" MERGEFIELD"))
{
// Gives The Fieldnames as Entered in .DOT File
string fieldName = fieldText.Substring(12, fieldText.IndexOf(" ", 12) - 12);


درصورتی که نام mailmergefield درست انتخاب نشه، Switch-case هم هیچ مشابهتی پیدا نکرده و فیلدارو جایگذاری نمیکنه، دوباره تاکید میکنم که روند اجرای این دستورات رو Trace کنین و ببینین که مشکل کجاست

alia.n
سه شنبه 21 دی 1395, 23:46 عصر
تشکر دوست عزیز اما مشکل برطرف نشداین برنامه فایل رو کجای دیتا بیس ذخیره میکنهاگر یه نمونه کوچیک زحمت میکشیدی بصورت عملی میزاشتی مشکل من و افرادی که مثل من هستن حل میشدبازم تشکر از توجه شما

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

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

142293

حالا فایل رو با پسوند .DOT ذخیره کنین، حالا این فایل رو در دیتابیس ذخیره کنین، به این روش ذخیره کنین:
String FilePath = "آدرس این الگو";
// تبدیل فایل به آرایه بایتی
byte[] FileBuffer = System.IO.File.ReadAllBytes(FilePath);
// حالا این آرایه رو داخل دیتابیس درج کن

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

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


////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// اینارو به صورت سراسری داخل فرمت تعریف کن
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//THE 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 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 "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 The 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

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

142294


این برنامه فایل رو کجای دیتا بیس ذخیره میکنه
لطفا این متن رو با دقت بخونین، چون همه چیو توضیح دادم اینجا.

این کدا کاملا درست عمل میکنن، شما یا trace رو انجام بدین یا اگر براتون مقدوره پروژه تون رو اپلود کنین تا نگاه بندازم

alia.n
چهارشنبه 22 دی 1395, 10:15 صبح
درصورتی که میخواین از فایل موجود در سیستم استفاده کنین، پس دیگه لزومی نداره از ReadAllBytes و پس از اون از WriteAllBytes استفاده کنین، فقط آدرس فایل رو بدین کافیه، اون اعمال واسه زمانیه که فایل تمپلیتتون داخل دیتابیس ذخیره شده باشه

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

mr.sirwan
چهارشنبه 22 دی 1395, 10:40 صبح
ببینین شما لازمه که یک فایل template به همون روش ذکر شده درست کنین و اون رو داخل یک جدول مثلا با اسم templates که فیلدی از نوع varbinary داره ذخیره کنین (میتونین فیلدای دیگه ای هم واسش تعریف کنین، مثل تاریخ ثبت فایل داخل دیتابیس، کاربر ثبت کننده فایل و....) حالا داخل برنامه هرکسی خواستکه نامه ای تنظیم کنه ما یک نمونه از این فایل تمپلیت روی سیستم کاربر میسازیم و پارامترهای موردنظر رو به اون فایل ساخته شده روی سیستم کاربر ارسال میکنیم(توسط متود writeallbytes اون آرایه بایتی ذخیره شده تو جدول Templates رو میتونیم به یک فایل تبدیل کنیم) حالا بعد از تکمیل و تایپ نامه توسط کاربر، یک دکمه با اسم ذخیره روی فرممون قرار میدیم توسط این دکمه فایلی که در حال حاضر داخل ورد باز هست رو ذخیره میکنیم، توسط متد ReadAllBytes معادل آرایه بایتی اون فایل رو بدست آورده و اون آرایه رو داخل یه جدول با اسم مثلا letterdocs و با یک فیلد از نوع varbinary ذخیره میکنیم، تمام

عذرخواهی میکنم، الان با گوشی آنلاین هستم فعلا نمیتونم پروژه تون رو دانلود کنم

پ.ن: در این پست شرح مختصری از این دستورات رو ارائه دادم، خوندنشون میتونه براتون مفید باشه:
http://barnamenevis.org/showthread.php?528884-%D8%A8%D8%A7%D8%B2-%D8%B4%D8%AF%D9%86-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B1%D8%A7%D8%B1-word-%D8%AF%D8%A7%D8%AE%D9%84-%D9%81%D8%B1%D9%85&p=2338131&viewfull=1#post2338131

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

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

142293

حالا فایل رو با پسوند .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

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

142294



سلام خدمت دوستان عزیز

من از این روش برای ارسال دیتا به ورد استفاده میکنم و جواب هم میگیرم
منتها میخوام وقتی یه رشته با فرمت html رو ارسال میکنم اون رو با css که برای تگ ها نوشتم در ورد نمایش بده
بخوام دقیق تر بگم همنطور که در صفحات html متن رو نشون میده در ورد هم همون طور باشه

من یه کد میخوام که رشته htmlی من رو به یه رشته با همون خواص تبدیل کنه و نمایش بده

ممنون از همه اساتید محترم

meysam_online2012
سه شنبه 22 اسفند 1396, 10:36 صبح
سلام خدمت دوستان عزیز

من از این روش برای ارسال دیتا به ورد استفاده میکنم و جواب هم میگیرم
منتها میخوام وقتی یه رشته با فرمت html رو ارسال میکنم اون رو با css که برای تگ ها نوشتم در ورد نمایش بده
بخوام دقیق تر بگم همنطور که در صفحات html متن رو نشون میده در ورد هم همون طور باشه

من یه کد میخوام که رشته htmlی من رو به یه رشته با همون خواص تبدیل کنه و نمایش بده

ممنون از همه اساتید محترم


دوستان کسی نظری نداره در این مورد؟

saeedkatani
یک شنبه 07 مرداد 1397, 10:25 صبح
سلام دوستان من از کد هایی که هست استفاده کردم فقط تاریخ تو shape هست مقادیر ارسال نمیشه لطفا اگر ممکن هست راهنمایی کنید