الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس : اجعل برنامجك يستخدم برامج ال Office

مغلق
بدأه معتز شمس في 13 مايو 2005 · 7 رد · 1,560 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته,

قد تحتاج في يوم من الأيام أن تقوم بجعل برنامجك يتصل باحدى برامج أوفيس لأداء مهمه ما يصعب القيام بها داخل برنامجك و تريد ان توفر على نفسك الجهد والوقت لأداء مهام أخرى.

من أمثال هذه المهام الصعبه هو تحويل بعض الملفات مثل DOC أو RTF الى HTML او TXT أوالعكس , فاذا فكرت ان تقوم بعمل هذا التحويل بنفسك تماما , فانه سيضيع من وقتك وعقلك الكثير.

عموما انا بحب المقدمات جدا , ولكن خلينا ندخل في الموضوع على طول ونعمل برنامج كدا صغير يحول الملفات RTF الى HTML وسنستخدم برنامج الوورد في ذلك ان شاء الله ...

في البداية قم بعمل Add Reference بالضغط بالزرار اليمين للماوس على كلمة References الموجوده في الـ Solution Explorer ثم الضغط على Add Reference.

ومن نافذة Add Reference بما انني استخدم Word 10 الموجود ضمن أوفيس اكس بي , سأقوم باختيار Microsoft Word 10.0 Object Library واضغط على Select وبعد ذلك اضغط OK.

ماعلينا الآن هو كتابة الكود :

اول شئ نقوم به هو عمل أوبجكت من Word.ApplicationClass عن طريق الكود التالي , وهذا مشابه كأننا نقوم بفتح برنامج الوورد نفسه , ان جاز التعبير ::

Word.ApplicationClass myApplication = new Word.ApplicationClass();

قم الآن بتعريف متغير من نوع object وضع به عنوان الملف الذي تود فتحه , بهذا الشكل ::

object myRTF = @"F:\Documents\myFile.rtf";

وبعد ذلك وبطريقه منطقيه يجب علينا ان نقوم بفتح الملف ( المستند ) اولا وذلك من خلال الداله Open , وهذا كأننا نقوم بفتح برنامج الوورد ونضغط على القائمه File ونقوم بعمل Open لاى ملف لدينا ....

الا اننا نكتشف الآن ان الداله Open تريد حوالي 15 براماتر :blink: !! فمن اين نأتي لها بكل هذه الـ براماترز , عموما لا تنزعج فانت غير مجبر على تمرير جميع البراماترز لهذه الداله ولا تنسى ان هذه الداله مخصصه اصلا لبرنامج الوورد ولم تصمم من اجل احتياجاتك انت فقط لذلك فهى مليئة بالبراماترز التي ربما يحتاجها برنامج الوورد شخصيا ولا نحتاجها نحن الآن في هذا البرنامج ولكن ربما سنحتاجها في برامج أخرى في يوم من الأيام ... , ولتحل هذه المشكله قم بعمل أوبجكت لـ Type.Missing فهو يستطيع حل هذا النوع من المشاكل ::

object _missing = Type.Missing;

بعد ذلك يمكننا ان نقوم بكتابة الداله Open بهذا الشكل وتمرير البارامترز بالـ Reference ::

myApplication.Documents.Open(ref myRTF,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing);

اعتقد ان مبرمجين فيجوال بيسيك دوت نت يمكنهم كتابة نفس الداله السابقه بشكل افضل من ذلك :rolleyes: .

المهم خلينا في السي شارب بتاعتنا ,

نحن لدينا بالفعل مستند مفتوح الآن , كل ماعلينا فعله هو استخدام الداله Save As لنحفظ الملف باى امتداد نريده , فقط قم بعمل متغير من نوع object لنسند له الامتداد الجديد الذي نريده للملف ( الامتداد الذي سنختاره هو HTML ويمكنك تغييره حسب متطلباتك ) , انظر الكود ::

object htmlFormat = Word.WdSaveFormat.wdFormatFilteredHTML;

قم بعمل ايضا أوبجكت لنضع فيه عنوان الملف الـ HTML بعد عملية التحويل , انظر الكود ::

object myHTML = @"F:\Documents\myFile.html";

بعد ذلك نقوم بكتابة الداله Save As بهذا الشكل ::

myApplication.ActiveDocument.SaveAs(ref myHTML,ref htmlFormat ,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing);

وفي النهاية يجب علينا طبعا اغلاق المستندات المفتوحه من خلال الداله Quit وتمرير اليها 3 متغيرات _missing انظر الكود ::

myApplication.Quit(ref _missing,ref _missing,ref _missing);

ومره اخرى نحن نمرر متغيرات _missing لاننا لا نريد الاستفاده من جميع المميزات الموجوده في الداله التي ربما يحتاجها برنامج الوورد نفسه في حالات معينه , ففي الداله Quit مثلا لانريد سؤال المستخدم في برنامجنا هذا ان كان يريد حفظ التغيرات ام لا ؟! ولكن ربما برنامج الوورد يحتاج ان يسئله عن ذلك .. ممكن تسألني دلوقتي لماذا لم نمرر جميع البراماترز بقيمها الصحيحه كما تحتاجها الدوال ؟ أرد عليك وأقول ان هذا امر يرجع لك انت , ولكن ان اردت تمرير كل البراماترز بطريقه صحيحه فهذا سيحتاج منك أكواد أكثر ونحن في غنى عنها في برنامجنا البسيط هذا ولكن ممكن نحتاجها في برامج أخرى.

ملحوظه : يوجد دوال مصممه لتأخذ 30 براماتر !!

عموما بهذا يصبح الكود كاملا بهذا الشكل ::

object myRTF  = @"F:\Documents\myFile.rtf";
object myHTML = @"F:\Documents\myFile.html";
 	 
object _missing   = Type.Missing;
object htmlFormat = Word.WdSaveFormat.wdFormatFilteredHTML;

Word.ApplicationClass myApplication = new Word.ApplicationClass();
    
myApplication.Documents.Open(ref myRTF,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing); 
 	 
myApplication.ActiveDocument.SaveAs(ref myHTML,ref htmlFormat ,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing,ref _missing);
    
myApplication.Quit(ref _missing,ref _missing,ref _missing);

انتهينا الآن , وبمثل هذه الطريقه يمكنك الاتصال بباقي برامج الأوفيس.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#2

الله يعطيك العافية أخ معتز

معلومات قيمة فعلا

3424.gif
#3

بالفعل أخي معتز معلومة رااااااائعة, جزاك الله خيراً, وبصراحة كنت أبحث عن تحويل rtf --> html ...

#4

رائع فعلا يا معتز

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#5

السلام عليكم و رحمة الله و بركاته....

أولا: جزاك الله خيرا

ثانيا: عندى بعض الاسئلة؟؟؟

1-ال Reference إلى موجودة فى ال Com ومنها ملف ال word الى أنت قلت عليه فى الدرس

هل دى نزلت مع الFrameWork و لا ال FrameWork مجرد إن بيستخدمها و لو لحظت هتلاقى الملف إمتداده OLB وده معناه ايه.

2-هل ال Libiraries و ال components فى أغلبها ممكن يعاد استخدمها و خصوصا لو unmanaged code انا عارف انى فى حجات ممكن نستخدمها لكن انا بتكلم على معظم الى موجود فى البرامج الى بين ايدينا و اذا كان فى حجات مغلقه فكيف يتم هذا فى ال visual studio

3-ما هو مصدرك فى هذا المثال و ده علشان اعرف بتجيب الحجات الحلوه منين!!!!

و شكرا لك اخ معتذ.

#6

وعليكم السلام ورحمة الله وبركاته ,

شكرا يا ابن السعوديه وشكرا يا bashmohandes وشكرا يا اسماعيل واعتقد ان سبب بحثك عن عملية تحويل الـ RTF الى HTML , هو كان سبب بحثي انا ايضا :D

بالنسبه لتساؤلاتك يا ( الباحث التقني ) , فيجب ان يكون مثبت لديك على الجهاز Microsoft Office لكى تستطيع استخدام الـ ( Object Library ) , وهى لاتكون موجوده بمجرد تنزيل الـ Framework.

وبالطبع يمكننا استخدام جميع المكتبات الموجوده لدينا اذا كانت الشركه المصنعه لها تسمح بذلك , ولكن المشكله لا تكمن في اذا كانت الشركات المصنعه تسمح بذلك ام لا , ولكن المشكله في اذا كانت هذه الشركات توفر معلومات و Documentation جيده عن مكتباتها كما تفعل ميكروسوفت ام لا.

واذا كانت هذه الشركات لا توفر معلومات كافيه عن منتجاتها , فبالرغم من ذلك يمكننا استخدامها طبعا ولكن بصعوبه لأننا في هذه الحاله يجب علينا دراسة ومعرفة طبيعة عمل هذه المكتبات.

لنفرض ان ميكروسوفت لم توفر هذه المعلومات الموجوده في هذا الدرس عن استخدام الـ Word Object Library ... فسيضطرنا ذلك الى استخدام احدى الطرق لمحاولة معرفة استخدامها.

على سبيل المثال يمكننا تحويل الـ Word Object Library الى مكتبه DLL باستخدام الـ TlbImp , هكذا ::

TlbImp MSWORD.OLB

بعد ذلك يمكننا استكشاف الـ DLL التي خرجت من الأمر السابق في الـ ILDasm , هكذا ::

ILDasm Word.dll

اقتباس
ما هو مصدرك فى هذا المثال

مصادر عديده يا أخي , فبعد ان قامت ميكروسوفت بتوفير دروس عن الـ Programming with Office , وقامت بتوفير امثله كافيه كمثال Programming Outlook ... أصبحت المسأله أكثر من سهله وبعدها قامت المواقع الشهيره مثل CodeProject.com و c-sharpcorner.com بالبدء ايضا في تقديم بعض الأمثله الجيده والمفيده عن ذلك.

أو قم بالبحث على جوجل وستجد كثيرا من المصادر والأمثله الجيده.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#7

شكرأ أخ معتذ .........

و لكن معنى ذالك أن word xp به هذه المكتبات التى صنعت بال Dot NEt .

و ما هو الفرق الجوهرى بين ال OLB و ال DLL ؟

#8
اقتباس
word xp به هذه المكتبات التى صنعت بال Dot NEt
لأ مش شرط يا أخي.
اقتباس
الفرق الجوهرى بين ال OLB و ال DLL

انا لا أعرف الفرق الجوهري بينهم , وما اعرفه هو ان الـ OLB يمكن ان تحتوي على أكثر من مكتبه , ومن الممكن ايضا ان تحتوي على دوال غير معرفه ( اقصد دوال ليس لها Body ) اعني ان الـ OLB من الممكن ان تكون شبيهه للـ Interface ان جاز التعبير مع وجود مثلا DLL تقوم بعمل Implementation لتلك الدوال.

اقتباس
شكرأ أخ معتذ
اقتباس
و شكرا لك اخ معتذ

العفو يا سيدي لكن انا اسمي أخره حرف الـ 'ز' مش الـ 'ذ' , فكرتني بواحد صاحبي لما كان ييجي ينادي عليا كان بيقلي يا بعتز :D .

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…