C# Uygulamalarında Word'den Yararlanmak

Bu uzun makaleyi yakında zamanda yazımını tamamladığım C# 3.0 kitabımdan aldım. Kitaptan aldığım bu metne bazı eklemeler yapıp küçük değişiklikler yaptım. Son yıllarda yayınlanan programcılık kitaplarının bir bölümü okurlar kitap hakkında fikir sahibi olsunlar diye yayınlanmaktadır.

Bu uzun makaleyi yakında zamanda yazımını tamamladığım C# 3.0 kitabımdan aldım. Kitaptan aldığım bu metne bazı eklemeler yapıp küçük değişiklikler yaptım. Son yıllarda yayınlanan programcılık kitaplarının bir bölümü okurlar kitap hakkında fikir sahibi olsunlar diye yayınlanmaktadır. Ne ki C# 3.0 kitabımın bu bölümünü burada sizinle paylaşıyor olmamın nedeni başka. Çünkü sözünü ettiğim kitabın hata yakalamakla ilgili uzunca bölümünü daha önce sizlerle zaten paylaşmıştım. Başka bir deyişle bu bölümü yayınlama nedenim kitabın içeriği ve anlatım şekli konusunda sizleri bilgilendirmek değildir.

Kısaca açıklayayım: 2004 yayınlanan C# kitabımda toplam 8 sayfada C# uygulamalarında Word ve Excel'den nasıl yaralanıldığını ayrıntıya girmeden kendimce anlatmıştım. Tabii C# uygulamalarında Word belgeleri ve Excel tabloları üzerinde nasıl işlem yapılabildiğini annemim karnında iken öğrenmemiştim. MSDN'e ve birkaç programcılık sitesine bakmıştım. Doğal olarak Word belgeleri üzerinde işlem yapılırken kullanmam gereken sınıfların hangileri olduklarını öğrenmiştim. Ötesi bu sınıfların hangi referans ve namespace'lerde olduğunu öğrenip ona göre nasıl bir hazırlamak yapmam gerektiğini araştırmıştım.

C# 1.0 kitabımı kaleme aldığım günlerde birkaç yerli web sitesinde yukarıda sözünü ettiğim soruların cevapları zaten vardı. Buna rağmen birileri çıkıp Word ve Excel'le ilgili olarak yazdıklarını 'bizim kitapları okumadan öğrenmiş olamazsın' dediler. Sanki söz konusu olan bir pop müzik sanatçısı ile yapılmış özel bir söyleşiymiş, sanki ikinci bir kaynağın olabilme ihtimalinin sıfır olduğu özel bir araştırmaymış söz konusu olan. Hal bu ki Microsoft gibi derleyici üreten firmalar derleyicileri hakkında en küçük ayrıntıları bile derleyiciyi piyasaya vermeden çok önce açıklıyorlar. Yoksa insanlar nasıl program yazarlardı, yazarlar nasıl programcılık kitapları yazarlardı? Yayınlanıp piyasada satılan bir programcılık kitabını edinip bir konuyu öğrenmek doğal olmasına rağmen C# kitabımın Word ve Excel'le ilgili bölümünü yazarken yerli web sitelerindeki 2 yazıyı ve MSDN'de birkaç metodun orijinal yapısına bakmakla yetinmiştim.

C# uygulamaları dahilinde Word belgeleri ve Excel tabloları üzerinde işlem yaparken tanımlamam gereken değişkenlere ad verebildiğimi ve kullanılması gereken metotların yapısını ve parametrelerini yerli kaynaklara bakmadan öğrenebildiğimi kanıtlamak için C# 3.0 kitabımda Word ve Excel uygulamaları üzerinde nasıl işlem yapıldığı bölümdeki sayfa sayısını biraz arttırıp bugüne kadar bu konuda kaleme alınmış en uzun ve ayrıntılı metni hazırladım. Belki bu sayede Memik Yanık çeviri yapıyor diyenler, Memik Yanık değişken çalıyor diyenler ellerini vicdanlarına götürme gereğini duyarlar. Kısa bir süre sonra bu metni nasıl kaleme aldığımı adım adım açıkladığım bir makale hazırlayıp 'Programcılar İçin Yazarlık Dersleri 4' adıyla yayınlayacağım.

C# projelerinde Word ve Excel'in kaynakla¬rından kolaylıkla yararlanabilirsiniz. Bu sayede kullanıcı¬nın bilgi girmesi gerektiği zaman karşısına Word penceresini veya tablo hazırlaması gerektiği zaman Excel penceresini getirebilirsiniz. Bu bölümde C# uygulamaları dahilinde Word ve Excel ile yapılabilineceklerin ancak bir özetine yer verebildim. Bu bölümü ilk kaleme aldığımda uzunluğu 10 sayfaydı. Ne ki özel nedenlerden dolayı bu bölüme biraz torpil geçip sayfa sayısını arttırdım. Bu sayede bu konuda en ayrıntılı Türkçe metni kaleme almış oldum. Madem şimdiye kadar hiçbir Türkçe kaynakta bu konu bu kadar ayrıntılı anlatılmadı o halde yerli kaynaklardan izinsiz alıntı yapmış olma ve değişken adı çalma ihtimalim azalmış oluyor(!). Her ne kadar bu bölümde yalnızca Word ve Excel'den söz edilmiş olunsa bile C# uygulamaları dahilinde diğer Office programlarından da yararlanmak mümkündür.

C# projesi dahilinde Word'den yararlanmak istiyorsanız ilk olarak Solution Explorer pen¬cere¬sinde References seçeneğine ait kısayol menüsünden komut verip Add Reference diyalog kutusunu ekrana getirip COM sekmesindeki Microsoft Office 11 Object Library adlı bileşeni seçip uygulamaya dahil etmelisiniz. Daha doğrusu C# uygulamasını bu referanstan haberdar etmelisiniz.



Bu ekran görüntüsünü aldığım sırada kullandığım bilgisayarda Word 2003 yüklüydü. Kulla¬nılan bilgisayara Word'ün XP sürümü yüklüyse bu bileşenin adı Microsoft Office 10 Object Library olur.

2003 içinde ilk C# kitabımı kaleme alırken Add Reference diyalog kutusunda araştırmaya çıkıp acaba Word belgeleri üzerinde işlem yaparken hangi referansı kullanmak gerekiyordur sorusuna kendimce cevap arasaydım bulmak zor olmazdı. Ancak çok daha önce yerli web sitelerinde bu konu üzerine yazılmış makaleler ilk yayınlandıklarında okuduğum için Word belgeleri üzerinde işlem yaparken gerek duyulacak sınıfların hangi namespace'lerde, bu namespace'lerin ise hangi referanslarda yer aldığını biliyordum.

Visual Studio 2005 ile hazırlanan projelerde bu bileşen seçilip OK düğmesi tıklandı¬ğında projeye 3 referans eklenirdi. Visual Studio 2008'de yukarıda yapılan işlem projeye yalnızca Microsoft.Office.Core referansının eklenmesine neden olmaktadır. Bu nedenle Add Reference diyalog kutusunu tekrar ekrana getirip .NET sekmesinde ayrıca Microsoft.Office.Interop.Word referansını projeye eklemek gerekmektedir.



Projeye bu 2 referansı dahil ettikten sonra kodun en üstüne aşağıda verdiğim 2 satırı yazarak ilgili namespace'lerdeki Class'lardan yararlanmak istediğinizi işaret etmelisiniz. Başlangıçta Microsoft.Office.Core'deki sınıflardan yararlanmayacağımız için using bloğunda bu namespace'in adını işaret etmeyebi¬lirsiniz.


using Microsoft.Office.Core;

using Microsoft.Office.Interop.Word; /



Gerekli referansları projeye dahil edip(başka bir deyişle bu referanslardan derleyiciyi haberdar ettikten') bu namespace'lerdeki class'lardan yararlanacağımı Using deyimiyle işaret ettikten sonra forma yerleştirdiğim düğme¬nin Click olayını temsil eden metodu aşağı¬daki gibi düzenledim.


private void Word_penceresi_Click(object sender, EventArgs e)

 {

  Microsoft.Office.Interop.Word.ApplicationClass Word_uygulamasi;

  Word_uygulamasi= new Microsoft.Office.Interop.Word.ApplicationClass();

 }



Şimdi burada biraz duralım. Bu 2 satırlık kodda örneğini aldığım sınıfın adı Word.ApplicationClass. Bu sınıftan yola çıkıp hazırlanacak nesneye 'Word_uygulamasi' gibi Türkçe bir ad verilirsek(yani bu sınıfa Türkçe bir karşılık ararsak) başka Türkçe kaynaklarla benzer değişken adını kullanma tehlikesi ile karşı karşıya gelebiliriz. Başka bir deyişle başka yazarların kıymetli değişkenlerinin adını çalmakla suçlanabiliriz. Bunun önüne geçmek için, başka bir deyişle 2 satırlık bu kodda tanımlanan değişkene programcılar ad seçerken başka kaynaklardan değişken avına çıkmalarının mecburi olmadığını kanıtlamak için bu kodu aşağıdaki gibi düzenledim. Yani başlangıçta Word_uygulamasi adını verdiğim değişkenin adını 'Word_nesnesi' olarak değiştirdim. Tabii programcıların yazacakları kodların başkaları tarafından görülmesi düşük ihtimal olduğu için değişkenlere ad seçerken kendilerini birden 'değişken hırsızı' olarak görmeleri zordur.


private void Word_penceresi_Click(object sender, EventArgs e)

 {

   Microsoft.Office.Interop.Word.ApplicationClass Word_nesnesi;

   Word_nesnesi = new Microsoft.Office.Interop.Word.ApplicationClass();

 }



Bu metotta Word.ApplicationClass nesnesini hazırlama işlemini 2 satırda gerçekleştir¬dim ve söz konusu Class'ın yer aldığı namespace'i işaret ettim. Daha önceden bu namespace'deki sınıflardan yararlanmak istediğimi using deyimi ile belirttiğim için bu kodun satırlarını kısaltmak mümkündür. Bu metoda yazılan ilk 2 satır sayesinde bir Word programı başlatılır ama ekranda görün¬mez. Word penceresinin ekranda görünmesi için Word.ApplicationClass'tan yararlana¬rak hazırladığınız nesnesinin Visible özelliğini true yapmalısınız. Bu nedenle yukarıda verdiğim metoda 3. bir satır ekledim.


private void Word_penceresi_Click(object sender, EventArgs e)

 {

   ApplicationClass Word_nesnesi;

   Word_nesnesi = new ApplicationClass();

   Word_nesnesi.Visible = true; 

 }



Projeyi çalıştırıp bu metodu işletince aşağıdaki gibi bir sonuç elde ettim. Bu şekilde açılan Word pencere¬sinde herhangi bir belge olmaz. Bu sırada komut verip Word penceresinde yeni belge hazırlayabilir veya mevcut belgeleri açabilirsiniz. Daha açık bir anlatımla yukarıda hazırladığımız ApplicationClass nesnesi Başlat menüsünden komut vererek ekrana getirdi¬ğimiz Word penceresini temsil ediyor.



Şimdi yukarıda verdiğim kodda değişiklik yapıp Word penceresi ekrana getirildiği zaman boş bir belgenin hazırlanmasını sağlayacağım. Yukarıda hazırladığımız ApplicationClass nesne¬sinin Documents adında bir koleksiyonu bulunmakta ve açılan(ya da hazırlanan) Word belgeleri bu koleksiyonda saklanmaktadır. Başka bir deyişle hazırlanacak belgenin veya Document nesnesinin bu koleksiyona eklenmesi gerekiyor.

Yukarıda verdiğim ekran görüntüsünü aldığım sırada Word penceresi içinde görüntülenen herhangi bir belge olmadığı için Documents koleksiyonu herhangi bir elemana sahip değildir. Document nesneleri DocumentClass sınıfının Add() metodundan yararlanılarak hazırlanmaktadır. Bu amaçla Document nesnesi hazırlayıp bu nesneyi Add() metodu ile ApplicationClass nesnesine ekleyeceğim. Başka bir deyişle Document nesnesi klasik yöntemle new anahtar kelimesiyle sınıftan yola çıkılarak hazırlanıp sonra da ilgili koleksiyona eklenmiyor. Add() metodu, hem nesne hazırlama hem de koleksiyona ekleme işlemini bir seferde yapmaktadır.

Lütfen uzatmama izin verin: Öncelikle Microsoft'un sitesine yani MSDN'de burada sözünü ettiğim Add() metodu ile ilgili olarak verilen örneği size sunacağım. Aşağıda verdiğim kod eski sürüme göre hazırlanmış. Bu kitapta C# hakkında bilgi verirken Visual Studio 2008 ve C# 3.0'ı kullandığım için küçük farklılıklar olabilir.


object missing  = System.Reflection.Missing.Value;

object template = @"C:TestSampleTemplate.dot"; 

this.Application.Documents.Add(ref template, ref missing, ref missing, ref missing);



Burada dikkatinize sunmak istediğim asıl konu Add() metodunun 4 parametreye sahip olmasıdır. Parametrelerden ilkinde hazırlanmak istenen Word belgesine temel oluşturacak DOT uzantılı şablon dosyası verilmektedir. Zaten ilk parametrenin yararlanılmak istenen şablon olması gerektiği MSDN'den aldığım 2 satırlık kodda işaret ediliyor. Başka bir deyişle 1. parametrede sorun yok ve şablon olarak kullanmak istediğimiz DOT uzantılı dosyayı ve yolunu belirteceğiz. Word başlatılıp içeriği boş bir belge hazırlandığında 'normal.dot' adlı şablon dosyasının kullanıldığını biliyorsunuz. Yıllar önce Word konulu kitap yazmış birisi olduğum için umarım birileri çıkıp 'DOT uzantılı dosya hakkında yukarıda yazdığım cümleyi başka kaynaktan izin alıntı yaptığımı ileri sürmezler.

Add() metodunun 2., 3. ve 4. parametreleri ise:


System.Reflection.Missing.Value



tipindedir. Microsoft'un programcıları tarafından Add() metodunu örneklemek için yazılan bu 3 satırlık kodda 2., 3. ve 4. parametre için önceden 'missing' adında değişken tanımlamışlar. Her ne kadar bu örnek kodda Add() metodunun 2., 3. ve 4. parametreleri aynı tipte olsa bile farklı işlevleri vardır. Bu parametrelerin işlevlerini ileriki sayfalarda sırasıyla anlatacağım. Gerçekte Add() metodunun son 3 parametresiyle ilgilenmeyebilirsiniz.

Madem C# uygulaması dahilinde yeni bir Word belgesi hazırlayacağız Add() metodunu yukarıdaki gibi kullanmaktan başka çaremiz yoktur. Belki de vardır ama bu konuda bilgim ne yazık ki yoktur. Belki birileri çıkıp yukarıda yapısını verdiğim Add() metodunu kullanmadan nasıl Word belgesi hazırlandığını anlatırlar. Biz de o tekniği kullanırken mucitlerini anarız, kendilerine her seferinde teşekkür ederiz.

Şimdilik Add() metodunu kullanmak dışında başka teknik olmadığına göre ilk olarak kullandığım bilgisayarda arama yapıp 'Normal.dot' adlı dosyayı bulup 'C:' sürücüsünün kök klasörüne kopyaladım. dot uzantılı bu şablon dosyasının adını ise 'sablon' adını verdiğim bir değişkene aktardım. Sonra da Microsoft'un programcılarının yaptığı gibi System.Reflection.Missing.Value tipinde bir değişken tanımladım. Madem bu değişken Value tipindedir ben de aklı evvellik yapıp yani bütün imkanlarımı seferber edip bu değişkene orijinal bir ad bulamayınca bu değişkene Türkçesi olan 'deger' adını verdim. Bu 2 hazırlıktan sonra yukarıda verdiğim kod aşağıda verilen şekle dönüştü.


private void Word_penceresi_Click(object sender, EventArgs e)

  {

    object sablon = "C:Normal.dot";

    object deger = System.Reflection.Missing.Value;

    ApplicationClass Word_nesnesi;

    Word_nesnesi = new ApplicationClass();

    Word_nesnesi.Visible = true;

  }



Her ne kadar Value tipindeki değişkene ad verirken Türkçe karşılığını kullanmış olsam bile 'deger' birçok programcı ve yazar tarafından kullanılan bir değişken adı olduğu için riske girmeye cesaret edemeyip bu değişkene ad verirken MSDN'den değişken adı çalma yolunu tercih ettim. Çünkü elin gavurları değişkenlerinin adları konusunda hak talep etmiyorlar. Sözünü ettiğim 2 değişkeni tanımladıktan sonra hazırlanacak belgenin aktarılacağı bir DocumentClass nesnesi hazırladım. DocumentClass nesnesine gönül rahatlığı ile Belge1 adını verdim. Çünkü Word belgelere Belge1, Belge2 gibi adlar veriyor. Microsoft firması beni değişken adı çalmakla suçlamayacağına göre tehlike yoktur.


private void Word_penceresi_Click(object sender, EventArgs e)

 {

   object sablon = "C:Normal.dot";

   object missing = System.Reflection.Missing.Value;

   ApplicationClass Word_nesnesi;

   Word_nesnesi = new ApplicationClass();

   Word_nesnesi.Visible = true;

   Microsoft.Office.Interop.Word.Document Belge1 = new DocumentClass();

 }



Bu hazırlıklardan sonra şimdi sırada Add() metodunu kullanıp Word belgesini hazırlamak var. Bu amaçla bu koda ekleme yaptım. Aşağıda verilen kod işletildiğinde tıpkı Word başlatılıp başlangıçta 'Belge1' gibi ada sahip bir belge hazırlandığı gibi C# uygulaması dahi¬linde Word başlatılıp 'Belge1' adında bir belge hazırlanmış olunur. Bu belgeye istenildiği gibi bilgi girilip kaydedilebilir.


private void Word_penceresi_Click(object sender, EventArgs e)

 {

   object sablon = "C:Normal.dot";

   object missing = System.Reflection.Missing.Value;

   ApplicationClass Word_nesnesi;

   Word_nesnesi = new ApplicationClass();

   Word_nesnesi.Visible = true; 

   Microsoft.Office.Interop.Word.Document Belge1 = new DocumentClass();

   Belge1 = Word_nesnesi.Documents.Add(ref sablon, ref missing, ref missing, ref missing);

  }



Bundan 4 yıl önce yayınlanan ilk C# kitabımda konuyu uzatmak istemediğim için bu kodu bir seferde vermiştim. Bu kez ayrıntılara girmek istediğim için adım adım anlatmaya çalışıyo¬rum. Bu kodu dikkatle incelerseniz 2., 3. ve 4. parametrelerin aynı olduklarını fark ederseniz. Çünkü bu 3 parametrenin System.Reflection.Missing.Value tipinde olması sağlanırsa varsayılan değerler kullanılır. Bunu bir de şöyle açıklamak gerek: Her ne kadar Add() metodu 4 parametreye sahip olsa bile bunlardan ilki hariç diğer üçünü belirtme gereğini duymuyorum. Buradaki karmaşanın geri planında Word kaynaklı sınıfların yöneti¬len(Unmanaged) kod olmamalarında yatıyor. Tabi System.Reflection.Missing.Value tipindeki değişken Türkçe bir ad verilseydi kod belki biraz daha okunur olurda ama değişken adı çalmış olma ihtimali artardı.

İlk C# kitabım için Add() metodu hakkında günlerce araştırma yapmama rağmen Add() metodunun son 3 parametresi hakkında net bilgilere ulaşamamıştım. İleriki sayfalarda hakkında bilgi verilecek Open() metodunun 3. parametresinin işlevi açılacak belgeye ReadOnly özelliğini veriyor olması beni yanıltmıştı. C# 1.0 kitabımı yazarken Add() meto¬dunun 2. parametresinden ise hiç söz etmemiştim.

Şimdi gelelim 2. parametrenin asıl işlevine. C# uygulaması dahilinde Word belgesi hazırlama amacınız yeni bir şablon hazırlamak ise 2. parametreden yararlanabilirsiniz. Bu parametrenin işlevini göstermek için object tipinde bir değişken tanımlayıp true yaptım.


ApplicationClass Word_nesnesi = new ApplicationClass();

Document Belge1 = new DocumentClass();

private void Word_penceresi_Click(object sender, EventArgs e)

 {

   object sablon = "C:Normal.dot";

   object missing = System.Reflection.Missing.Value;

   object yeni_sablon = true;

   Word_nesnesi.Visible = true; 

   Belge1 = Word_nesnesi.Documents.Add(ref sablon, ref yeni_sablon, ref missing, ref missing);

 }



Bu şekilde düzenlenen kod ile C# uygulaması dahilinde hazırlanan Word belgesi hazırlanıp sonra da kaydedilmek istendiğinde varsayılan kayıt tipi DOT uzantılı şablon olur. Tabii Farklı Kaydet diyalog kutusundaki Kayıt Türü liste kutusunda kayıt türü olarak Word Belgesi veya başka bir format seçilebilir. C# uygulaması dahilinde DOT uzantılı şablon dosyası hazırlamak istemiyorsanız Add() metodunun 2. parametresi ile ilgilenmeyip bu parametrenin System.Reflection.Missing.Value tipinde bir değişken olmasını sağlayabilirsiniz.

Word uygulamasını temsil eden ApplicationClass nesnesi için yeni belge hazırlanırken kullanılan Add() metodunun 3. parametresinin adı DocumentType. Toplam 5 farklı değer alabilen bu parametre kullanılmadığında, başka bir deyişle bu parametrenin yerine System.Reflection.Missing.Value tipinde bir değişken kullanıldığında boş bir belge hazırlan¬mak istendiği varsayılır. 3. parametrenin nasıl kullanıldığını aşağıda görebilirsiniz.


ApplicationClass Word_nesnesi = new ApplicationClass();

Document Belge1 = new DocumentClass();

private void Word_penceresi_Click(object sender, EventArgs e)

 {

   object sablon = "C:Normal.dot";

   object missing = System.Reflection.Missing.Value;

   object yeni_sablon = false;

   object belge_tipi = WdNewDocumentType.wdNewBlankDocument; 

   Word_nesnesi.Visible = true;

   Belge1 = Word_nesnesi.Documents.Add(ref sablon, 

ref yeni_sablon, ref belge_tipi, ref missing);

 }



Bu koda dikkat ederseniz WdNewDocumentType adında bir Enum'un olduğunu fark ederseniz. C# uygulaması dahilinde hazırlamak istediğim Word belgesini web sayfası olarak değerlendirmek gibi bir amacım olsaydı Add() metodunun 3. parametresini aşağıdaki gibi düzenlerdim


object belge_tipi = WdNewDocumentType.wdNewWebPage;



Microsoft.Office.Interop.Word'de yer alan WdNewDocumentType adlı enum tipinin üyelerinin işlevlerini aşağıda tablo halinde verdim. Ek açıklama yapmak gerekirse Word'ün güncel sürümleri ile istenen tipte ve içerikte belgeler hazırlamak mümkündür.

Üye adı İşlevi
wdNewBlankDocument Bol belge
wdNewEmailMessage E-mail
wdNewFrameset Frameset
wdNewWebPage Web sayfası
wdNewXMLDocument XML belgesi

Şimdi gelelim hazırlanan belgenin Word penceresinde görünmesini sağlayan veya engelleyen 4. parametresine. 4. parametre yerine System.Reflection.Missing.Value tipinde bilgi içeren Object tipinde bir değişken kullanıldığında hazırlanan belge ekranda görünmektedir. Yukarıda anlatılan şekilde hazırladığınız belgenin görünmesini istemiyorsanız bu parametre için object tipinde bir değişken tanımlayıp false aktarmalısınız. Bu işlemin nasıl yapıldığını aşağıda görebilirsiniz.


ApplicationClass Word_nesnesi = new ApplicationClass();

Document Belge1 = new DocumentClass();

private void Word_penceresi_Click(object sender, EventArgs e)

 {

   object sablon = "C:Normal.dot";

   object missing = System.Reflection.Missing.Value;

   object yeni_sablon = false;

   object gorunme = true;

   object belge_tipi = WdNewDocumentType.wdNewBlankDocument; 

   Word_nesnesi.Visible = true;

   Belge1 = Word_nesnesi.Documents.Add(ref sablon, ref yeni_sablon, ref belge_tipi, ref gorunme);

 }



Bu şekilde düzenlenen kod işletilirse Word başlatılıp içeriği boş(tabii Normal.dot'ın orijinal olduğunu varsayıyorum. Yani Microsoft'tan geldiği şekli ile..) bir Word belgesi hazırlanıp ekrana getirilir. Gerçekte başka yazarlar veya programcılar tarafından daha önce kullanılma ihtimali yüksek olan 'gorunme' adlı değişken yerine Microsoft'un verdiği kısa örneklerde kullandığı visible'ı değişken adı olarak kullanmanız önerilir. Hazırlayıp Word penceresine getirdiğiniz belgenin görüntülenmesini istemiyorsanız 4. parametreyi false yapmalısınız. Aşağıda verilen kod işletildiğinde Word penceresi ekrana gelir ama Add() metodu ile hazır¬lanan belge görüntülenmez.

ApplicationClass Word_nesnesi = new ApplicationClass();
Document Belge1 = new DocumentClass();


private void Word_penceresi_Click(object sender, EventArgs e)

  {

    object sablon = "C:Normal.dot";

    object missing = System.Reflection.Missing.Value;

    object yeni_sablon = false;

    object visible = false;

    object belge_tipi = WdNewDocumentType.wdNewBlankDocument; 

    Word_nesnesi.Visible = true;

    Belge1 = Word_nesnesi.Documents.Add(ref sablon, 

ref yeni_sablon, ref belge_tipi, ref visible);

 }



Hazırlayıp geri planda kod yazarak bilgi aktarıp sonra kaydetmek istediğiniz Word belgesinin ekranda görünmesini istemeyebilirsiniz. Tabii ApplicationClass nesnesinin Visible özelliğini false yapıp Word penceresini görünmesini engellediyseniz Add() metodunun 4. parametresi¬nin false ya da true olmasının bir önemi olmuyor.

Bildiğiniz Word belge hazırlarken DOT uzantılı şablon dosyalarından yararlanmaktadır ve Normal.dot şablonu varsayılan şablondur. Konu kolay anlaşılsın diye bu şablonu 'C:' sürücü¬sünün kök klasörüne kopyaladım. Yukarıda anlatılan şekilde düzenlenen Add() metodu işletilirse ekrana aşağıdaki gibi bir Word penceresi gelir. Bu sırada Word belgesine istediğiniz gibi bilgi girebilir ve yeni belgeler hazırlayabilirsiniz.



Yine Word ile çalışırken arka arkaya birden fazla belgeyi hazırlayıp birden fazla belge üzerinde çalışmak mümkündür. Şimdi yukarıda verdiğim koda ekleme yapıp arka arkaya 2 Word belgesi hazırlayacağım.


ApplicationClass Word_nesnesi = new ApplicationClass();

Document Belge1 = new DocumentClass();

Document Belge2 = new DocumentClass();

private void Word_penceresi_Click(object sender, EventArgs e)

 {

   object sablon = "C:Normal.dot";

   object missing = System.Reflection.Missing.Value;

   object yeni_sablon = false;

   object visible = true;

   object belge_tipi = WdNewDocumentType.wdNewBlankDocument; 

   Word_nesnesi.Visible = true;

   Belge1 = Word_nesnesi.Documents.Add(ref sablon, 

ref yeni_sablon, ref belge_tipi, ref visible);

   Belge2 = Word_nesnesi.Documents.Add(ref sablon, 

ref yeni_sablon, ref belge_tipi, ref visible);

   Belge1.Activate();  

 }



Tahmin edeceğiniz C# uygulaması dahilinde hazırlanan belgelerin birisi aktif belgedir. Aktif belge normal şartlarda son hazırlanan veya açılan belgedir. Hangi belgeyi aktif belge yapmak istiyorsanız Active() metodunu o belgeyi temsil eden nesneye uygulamanız yeterlidir. Bu metodun nasıl kullanıldığını yukarıda görebilirsiniz. Mevcut belgelerin nasıl açıldığı anlatıl¬dıktan sonra açık belgelerin arasında nasıl dolaşıldığı konularında bilgi verilecektir.

Word Belgelerine Bilgi Girmek

Yukarıda anlatılan şekilde hazırlanan Word belgesine doğrudan bilgi girebileceğiniz gibi kod yazarak bilgi aktarabilirisiniz. Doğrudan bilgi girdiğiniz Word belgesini C# uygula¬ması dahilinde kaydedebilir, kapatabilir veya içeriğini yazdırabilirsiniz. Başka bir deyişle Word programı ile normal şartlarda yapılan her işlemi C# uygulaması dahilinde kod yazarak yapabilirsiniz.

İlk olarak yukarıda anlatılan şekilde hazırladığım Word belgesine kod yazarak bilgi girmeyi deneyeceğim. Belgelere bilgi girilirken Range nesnesinin InsertAfter() veya InsertBefore() metotlarından yararlanabilirsiniz. InsertAfter() metodu¬nun nasıl kullanıldığını anlatmak için Document tipindeki değişken tanımlandığım satırı metodun dışına alıp 'Form1' sınıfının bütün metotlarında yaşayabilmesine imkan sağladım. Ardından forma bir düğme yerleştirip aşağıda verdiğim kodu yazdım. Forma yerleştirdiğim bu düğmeye 'ekle' adını vermek yerine Osmanlıca karşılık aradım uygun düğme adı aklıma gelmedi. Çünkü 'ekle' tehlikeli bir düğme veya değişken adıdır, bakarsınız ekle'yi birileri register etmiştir, kullanım hakkını 50 yıllığına satın almıştır.


private void ekle_Click(object sender, EventArgs e)

 {

   object missing = System.Reflection.Missing.Value;

   Belge1.Range(ref missing, ref missing).InsertAfter("Fenerbahçe");

 }



Word penceresini açıp ekrana getirmek amacıyla hazırladığım metoda eklediğim bu satır saye¬sinde ekleme noktasının bulunduğu yere InsertAfter() metoduna parametre olarak verilen bilgi yazılır. Proje çalıştırılıp bu kod işletildiğinde aşağıdaki gibi bir sonuç alınır.



Bildiğiniz gibi yeni bir Word belgesi hazırlandığı zaman belge içeriği boş bir paragrafa sahip olmakta ve Enter tuşuna her basılışta yeni bir paragraf hazırlanmaktadır. Bu şartlarda yani C# uygulaması dahilinde içeriği boş bir belge hazırlanıp imleç belgenin başlangıç noktasında iken InsertAfter() yerine InsertBefore() metodu kullanılmış olunsaydı aynı sonuç alınırdı.

Şimdi bu Word belge¬sine kod yazarak bir paragraf ekleyip tekrar bilgi gireceğim. Belgeye paragraf ekleme işlemi, yani Paragraphs koleksiyonuna eleman ekleme işlemi Add() metodu ile yapılmaktadır. Bu metodun nasıl kullanıldığını aşağıda görebilirsiniz. Document nesnesinin Paragraphs koleksiyonundan yararlanıp her türlü paragraf işlemlerini yapmak mümkündür.


private void ekle_Click(object sender, EventArgs e)

 {

   object missing = System.Reflection.Missing.Value;

   Belge1.Range(ref missing, ref missing).InsertAfter("Fenerbahçe");

   Belge1.Paragraphs.Add(ref missing);

   Belge1.Range(ref missing, ref missing).InsertAfter("Beşiktaş");

 }



Bu şekilde düzenlenen kod işletilirse aşağıdaki gibi bir sonuç alınır. Bu sırada Word belgesi 2 paragrafa sahiptir. Aynı şekilde Word belgesine istediğiniz gibi bilgi girebilirsi¬niz.



Şimdi örnek olması için Word belgesine mevcut bir ListBox'ın elemanlarını aktaracağım. Bu işlemi yapmak üzere hazırladığım kodu aşağıda verdim. Benzer mantıkla veritabanından okunan kayıtların her birisi Word belgesine ayrı bir satır olarak aktarılabilinir.


private void naklet_Click(object sender, EventArgs e)

 {

   object missing = System.Reflection.Missing.Value;

   int sayi = listBox1.Items.Count;   

   for (int i = 0; i < sayi; i++)

    {

      string satir = listBox1.Items.ToString() ;  

      Belge1.Range(ref missing, ref missing).InsertAfter(satir);

      Belge1.Paragraphs.Add(ref missing);

    }

  }



Yukarıda anlatılan şekilde C# uygulaması dahilinde hazırlanan Word belgesine bilgi aktarma işlemi asıl Selection nesnesinin TypeText() metodu ile yapılmaktadır. Bu metodun nasıl kullanıldığını aşağıda görebilirsiniz.


private void ekle_Click(object sender, EventArgs e)

 {

   Word_nesnesi.Selection.TypeText("Fenerbahçe");   

 }



Bu metot aktif Word belgesinde imleç nerede bulunuyorsa imlecin sonuna kendisine parametre olarak verilen bilgiyi yazar. Başka bir deyişle söz konusu belgede seçili bir kısmı yoksa bunun imlecin bulunduğu yer olduğu varsayılır.

Şimdi yukarıda verdiğim örneği değiştirip ListBox'ın içeriğini Word belgesine aktarırken Selection nesnesinin TypeText() metodundan yararlanacağım. Değişken adı benzerliğinden suçlanmamak için bu işlemi yapacak düğmeye 'Aktar' yerine 'naklet' adını verdim.


private void naklet_Click(object sender, EventArgs e)

 {

   object missing = System.Reflection.Missing.Value;

   int sayi = listBox1.Items.Count;   

   for (int i = 0; i < sayi; i++)

    {

      string satir = listBox1.Items.ToString() ;

      Word_nesnesi.Selection.TypeText(satir);

      Word_nesnesi.Selection.TypeText("n");

    }

  }



C# uygulamasının formundaki bir TextBox'a yazdığınız her karakterin anında Word belgesine aktarılmasını istiyorsanız söz konusu TextBox'ın KeyPress olayını temsil eden metodu aşağıdaki gibi düzenleyebilirsiniz. TextBox aracılığı ile Word belgesine aktarmak istediğiniz metin birden fazla satırdan meydana gelecekse MultiLine özelliğini True yapma¬nız gerekir.


private void textBox1_KeyPress(object sender,KeyPressEventArgs e)

 {

   char kar = e.KeyChar; 

   Word_nesnesi.Selection.TypeText(kar.ToString());   

 }



Bu 2 satırlık kod ile Word belgesine TextBox aracılığı ile bilgi aktarırken TextBox'ın MutliLine özelliği True iken Enter tuşuna basılıp bir alt satıra inildiğinde Word belgesinde yeni bir paragrafa geçilmiş olunur. Aktif Word belgesine paragraf eklerken Selection sınıfının TypeParagraph() metodunu kullanabilirsiniz.


private void Parag_ekle_Click(object sender, EventArgs e)

 {

   Word_nesnesi.Selection.TypeParagraph();   

 }



Nasıl ki ListBox'ların Items koleksiyonları varsa C# uygulamaları dahilinden hazırlanan Word belgelerinin yani Document nesnelerinin Characters, Words, Sentences, Paragraphs ve Sections koleksiyonları vardır. Bu koleksiyonlardan yararlanarak belge hakkında bilgi edinebilir veya belge üzerinde bazı işlemleri yapabilirsiniz.

Şimdi C# projesi dahilinde hazırladığım Word belgesinin içeriğini forma yerleştirdiğim RichTextBox'a aktaracağım. Bu işlem için Range nesnesini aşağıdaki gibi kullandım.


private void naklet_Click(object sender, EventArgs e)

{

 object missing = System.Reflection.Missing.Value;

 richTextBox1.Text=Belge1.Range(ref missing, ref missing ).Text;

}



Yukarıda Word penceresine yazılanları RichTextBox'a aktarırken Range() nesnesine para¬met¬re olarak System.Reflection.Missing.Value sabitini içeren object tipindeki 'missing ' adını verdiğim değişkeni kullan¬dım. Word penceresine yazılanların hepsini değil de belli sayıdaki karakterini aktar¬mak istiyorsanız alınacak ilk ve son karakterin sıra numarasını Range() nesnesine aşağıdaki gibi parametre olarak vermelisiniz.


private void Aktar_Click(object sender, EventArgs e)

 {

  object Baslama = 0;

  object Bitis = 500;

  richTextBox1.Text =Belge1.Range(ref Baslama, ref Bitis).Text;

 }



Şimdi ise C# uygulaması dahilinde açtığım Word belgesinin içeriğini okumaya çalışacağım. Word belgesindeki ilk kelimeyi okumak istemiş olsaydım aşağıdaki gibi bir satır yazardım. Bu kodda kullandığım 'Word_nesnesi' C# uygulaması dahilinde hazırladığım Word pencere¬sini, ActiveDocument ise o sırada aktif olan belgeyi temsil etmektedir. Açık olan her hangi bir belge yokken bu satır işletilirse hata meydana gelir.


textBox1.Text = Word_nesnesi.ActiveDocument.Words[1].Text;



Tekrar uyarmak gerekirse, konu C# uygulaması dahilinde açılan Word belgesi olduğunda Words gibi koleksiyonların ilk elemanın sıra numarası 0 olmayıp 1'dir. Belgedeki bütün kelimeleri yani bütün içeriğini okumak istemiş olsaydım aşağıdaki gibi kod yazardım.


int sayi = Word_nesnesi.ActiveDocument.Words.Count;

for (int i = 1; i <= sayi; i++)

 {

   richTextBox1.Text = richTextBox1.Text + 

Word_nesnesi.ActiveDocument.Words.Text;     

 }



Yukarıda belirtildiği gibi ActiveDocument nesnesinin Words'den başka Characters koleksi¬yonu bulunmaktadır. Bu koleksiyondan yararlanıp Word belgesinden istenen karakterler okunabilir. Şimdi Word belgesinin 2. cümlesini okuyup RichTextBox'a aktaracağım. Word programı cümleleri birbirinden ayırırken nokta ve ardından gelen boşluktan yararlanmakta¬dır. Başka bir deyişle cümle sonunu işaret etmek üzere yazılan noktadan sonra boşluğa yer verilmezse Word cümlenin devam ettiğini sanıyor.


richTextBox1.Text = Word_nesnesi.ActiveDocument.Sentences[2].Text;



C# uygulaması dahilinde açtığım veya hazırlayıp bilgi aktardığım Word belgesinden paragraf bazında okuma yapmak isteseydim aşağıdaki gibi kod yazardım. Aşağıda verilen satır sayesinde belginin ilk paragrafı RichTextBox'a aktarılır.


richTextBox1.Text= Word_nesnesi.ActiveDocument.Paragraphs[1].Range.Text;



Aktif belgenin bütün içeriğini okumak istemiş olsaydım aşağıdaki gibi kod yazardım.


object missing = System.Reflection.Missing.Value;

int sayi = Word_nesnesi.ActiveDocument.Paragraphs.Count; 

for (int i = 1; i <= sayi; i++)

{

  richTextBox1.Text = richTextBox1.Text + 

Word_nesnesi.ActiveDocument.Paragraphs.Range.Text;

}



Word Belgesi İçeriğini Biçimlemek/

Bildiğiniz gibi Word ile çalışırken imlecin bulunduğu noktanın biçim özellikleri nasılsa yeni girilen karakterler de aynı biçim özelliklerine sahip olmaktadır. Bu nedenle kullanıcılar çoğunlukla metnin genellinde kullanacakları biçim özelliklerini ayarlayıp öyle bilgi girerler. Benzer şekilde C# uygulaması dahilinde hazırladığınız Word belgesine kod yazarak aktarmak istediğiniz metin için önceden biçim özelliklerini ayarlayabilirsiniz. Bu işlemin nasıl yapıldığını aşağıda görebilirsiniz.


ApplicationClass Word_nesnesi = new ApplicationClass();

Document Belge1 = new DocumentClass();

private void Word_penceresi_Click(object sender, EventArgs e)

  {

    object sablon = "C:Normal.dot";

    object missing = System.Reflection.Missing.Value;

    object visible = true;

    object belge_tipi = WdNewDocumentType.wdNewBlankDocument; 

    Word_nesnesi.Visible = true;

    Belge1 = Word_nesnesi.Documents.Add(ref sablon, 

ref missing, ref belge_tipi, ref visible);

    Word_nesnesi.Selection.Font.Name = "Tahoma";

    Word_nesnesi.Selection.Font.Size = 11;

    Word_nesnesi.Selection.Font.Bold = 1;

 }



Selection.Font.Bold özelliği Integer tipinde olduğu için 0 veya 1 değerini aktarmak gerek¬mektedir. O normali temsil ederken 1 veya daha büyük değerler Bold'u temsil etmektedir. Şimdi ise C# uygulaması dahilinde hazırlanan Word belgesinin mevcut içeriğinin seçili durumda olan kısmının altı çizili olmasını sağlayacağım. Bu amaçla forma bir düğme yerleştirip aşağıda verdiğim kodu yazdım.


private void alti_cizili_Click(object sender, EventArgs e)

 {

   Word_nesnesi.Selection.Font.Underline=WdUnderline.wdUnderlineSingle;

 }



Word belgesinin seçili durumda olan kısmını altı çizili yapacak kodu button nesnesinin Click olayını temsil eden metoda yazmak yerine CheckBox nesnesinin CheckedChanged olayını temsil eden metoda aşağıdaki gibi yazabilirsiniz.


private void alt_ciz_CheckedChanged(object sender, EventArgs e)

 {

   if (alt_ciz.Checked == true)

      Word_nesnesi.Selection.Font.Underline=WdUnderline.wdUnderlineSingle;

   else

     Word_nesnesi.Selection.Font.Underline =WdUnderline.wdUnderlineNone;

 }



Word ile normal şartlarda yapılabilinen bütün biçimleme işlemleri C# uygulaması dahilinde hazırlanan Word belgesine kolaylıkla uygulanabilmektedir. Bu kitap bir Word kitabı olma¬dığı için ancak birkaç biçimleme işleminden söz edeceğim. Şimdi ise C# uygulaması dahilinde hazırlanan Word belgesindeki geçerli veya seçili durumdaki paragrafın hizalama özelliklerini ayarlamak üzere forma bir CheckBox yerleştirip aşağıda verilen kodu yazdım. Bu kod sayesinde üzerinde bulunulan paragraf veya seçili durumdaki paragraflar sağa doğru hizalanır.


private void saga_hizali_CheckedChanged(object sender, EventArgs e)

 {

   Word_nesnesi.Selection.Paragraphs.Alignment = 

WdParagraphAlignment.wdAlignParagraphRight;   

 }



Belge Üzerinde Hareket Etmek

C# uygulaması dahilinde hazırladığınız Word belgesinde imlecin yerini kod yazarak kolayca değiştirebilirsiniz. Bu konuda bilgi vermek için forma bir düğme yerleştirdim ve aşağıda verdiğim kodu yazdım.


private void Basa_git_Click(object sender, EventArgs e)

 {

   object missing = System.Reflection.Missing.Value;

   object unit = Microsoft.Office.Interop.Word.WdUnits.wdStory ; 

   Word_nesnesi.Selection.HomeKey(ref unit, ref missing); 

 }



Bu kodda ilk olarak object tipinde 2 değişken tanımladım. Bu değişkenlere Microsoft'un programcılarının alışkanlığına uyarak 'missing' ve 'unit' adlarını verdim. Sizler bu değişÂ¬kenlere istediğiniz adı verebilirsiniz. 'unit' adını verdiğim değişkene Microsoft.Office.Interop.Word'de yer alan WdUnits adlı enum'un wsStory elemanını aktardım. Devamında Word uygulamasının Selection nesnesine HomeKey() metodunu uyguladım. Bu kod işletildiğinde imleç aktif belgenin başına gider. Eğer belgenin sonuna gitmek istemiş olsaydım bu kodu aşağıdaki gibi düzenlerdim. Bu 2 kod arasında tek fark HomeKey() yerine EndKey() metodunun kullanılmış olmasıdır.


private void sona_git_Click(object sender, EventArgs e)

 {

   object missing = System.Reflection.Missing.Value;

   object unit = Microsoft.Office.Interop.Word.WdUnits.wdStory;

   Word_nesnesi.Selection.EndKey(ref unit, ref missing); 

 }



Üzerinde bulunulan satırın sonuna gidilmek istendiğinde ise aşağıdaki gibi kod yazılmalıdır. Bu kodun belgenin başına veya sonuna gidilirken kullanılan koddan farkı 'unit' adını verdiğim değişkene aktarılan sabit bilgidedir. Belgenin başına giderken yararlandığım 'unit' adlı değişkene WdUnits.wdStory sabitini aktarırken satır üzerinde hareket etmek üzere tanımladığım bu değişkene WdUnits.wdLine aktardım.

Selection nesnesine uygulanan EndKey() yerine HomeKey() metodunu yazsaydım bu kod üzerinde bulunulan satırın başına gidilmesine neden olurdu. Burada 'unit' adını verdiğim object tipindeki değişkene 'WdUnits.wdLine' aktardığım için işlemler satır bazında yapılır.


object missing = System.Reflection.Missing.Value;

object unit = Microsoft.Office.Interop.Word.WdUnits.wdLine;

Word_nesnesi.Selection.EndKey(ref unit, ref missing);



Şimdi ise belgenin içeriği üzerinde hareket etmeyi paragraf bazında yapacağım. Aşağıda verdiğim kod işletildiğin imlecin yatay konumu değişmeden bir sonraki paragrafın üzerine gedilir.


object missing = System.Reflection.Missing.Value;

object unit = Microsoft.Office.Interop.Word.WdUnits.wdParagraph;

Word_nesnesi.Selection.MoveDown(ref unit, ref missing,ref missing);



Sanki aşağı ok tuşuna basılmış gibi bir imlecin yatay konumu değişmeden bir sonraki satırın üzerine gitmek istiyorsanız aşağıdaki gibi kod yazabilirsiniz.


object missing = System.Reflection.Missing.Value;

object unit = Microsoft.Office.Interop.Word.WdUnits.wdLine;

Word_nesnesi.Selection.MoveDown(ref unit,ref missing, ref missing);



İmlecin üzerinde bulunulan satırdaki bir sonraki kelimenin başına veya bir önceki kelimenin sonuna gitmesini istiyorsanız bu kodda 'unit' adını verdiğimiz object tipindeki değişkene WdUnits.wdWord sabitini aktardıktan sonra Word uygulamasını temsil eden nesneye MoveLeft() veya MoveRight() metodunu uygulamanız gerekir. Bu metotların nasıl kullanıl¬dığını aşağıda görebilirsiniz.


object missing = System.Reflection.Missing.Value;

object unit = Microsoft.Office.Interop.Word.WdUnits.wdWord;

Word_nesnesi.Selection.MoveLeft(ref unit,ref missing, ref missing);



Seçim İşlemleri ve Range Nesnesi

Word belgesinin bütün içeriğini seçmek istiyorsanız Select() meto¬dundan yararlanabilirsiniz. Bu metodun nasıl kullanıldığını anlatmak için forma 'Tümünü Seç' başlıklı bir düğme yerleştirip bu düğmenin Click olayı ile ilişkilendirdiğim metodunu aşağıdaki gibi düzenledim.


private void Tumunu_sec_Click(object sender, EventArgs e)

 {

   Belge1.Select(); 

 }



Select() metodunu burada yapıldığı gibi Document nesnesine uygulamak yerine ApplicationClass nesnesinin ActiveDocument nesnesine aşağıdaki gibi uygulayabilirsiniz.


Word_nesnesi.ActiveDocument.Select();



Word belgesinin bütün içeriğini seçerken Range nesnesinden yararlanabilirsiniz. Aşağıda verdiğim kodda önce söz konusu belgedeki karakter sayısını öğrendim. Çünkü DocumentClass nesnelerinin Characters adında bir koleksiyonu bulunmaktadır.


private void Tumunu_sec_Click(object sender, EventArgs e)

 {

   object baslangic = 0;

   object bitis = Belge1.Characters.Count;

   Belge1.Range(ref baslangic, ref bitis).Select();

 }



Yukarıdaki sayfalarda yapılan bazı işlemlerin Range nesnelerine uygulandığını fark etmiş olmalısınız. Biçimleme ve diğer işlemler için önceden Range nesnesi hazırlayıp işlemleri Range nesnesine uygulayabilirsiniz. Range nesnesini nasıl hazırladığımı aşağıda görebilirsiniz. Tahmin edeceğiniz gibi bu satırlar bir metoda yazılıp işletilirse 'Belge1' adlı Document nesnesinin bütün içeriği Bold yapılır.


object ilk = 0;

object son = Belge1.Characters.Count;   

Range erim = Belge1.Range(ref ilk, ref son);

erim.Bold = 1;



Bu kodda 'Belge1' adlı Document nesnesinin bütün içeriğini Range nesnesi olarak değer¬lendirdim. Range nesnesini hazırlarken ApplicationClass sınıfının ActiveDocument özelliğinden yararlanabilirsiniz. Bu nedenle aşağıda verilen kod işletildiğinde aktif belgenin bütün içeriği aynı şekilde bold yapılır.


object ilk = 0;

object son = Word_nesnesi.ActiveDocument.Characters.Count;   

Range erim =Word_nesnesi.ActiveDocument.Range(ref ilk, ref son);

erim.Bold = 1;



Şimdi ise aktif belgenin ilk paragrafını Range nesnesi olarak değerlendireceğim. Başka bir deyişle aktif belgenin ilk paragrafının bir Range nesnesi tarafından temsil edilmesini sağlaya¬cağım. Tahmin edeceğiniz gibi aşağıda verilen kod işletildiğinde C# uygulaması dahilinde açılan Word uygulamasının aktif belgesinin ilk paragrafı panoya kopyalanır.


private void Kopyala_Click(object sender, EventArgs e)

 {

   Range erim = Word_nesnesi.ActiveDocument.Paragraphs[1].Range;

   erim.Copy();  

 }



Şimdi ise 'Word_nesnesi' adını verdiğim Word uygulamasının aktif belgesinin seçili durum¬daki kısmını Range nesnesi olarak değerlendireceğim. Aktif belgenin seçili durumda olan herhangi bir kısmı yoksa bu kodun bir işlevi olmaz.


private void alti_cizili_Click(object sender, EventArgs e)

 {

   Range erim = Word_nesnesi.Selection.Range;

   erim.Underline = WdUnderline.wdUnderlineSingle;  

 }



Word belgesinin seçilen kısmı Word uygulamasının Selection nesnesine aktarılmaktadır. Copy() veya Cut() metodu ile Selection nesnesinin içeriğini panoya veya başka bir nesneye aktarabilirsiniz. C# projesi dahilinde Word belgesi açıp kullanıcıya Word aracılığı ile işlem yapması pek istenmez. Aşağıda verilen kod işletildiğinde aktif belgenin seçili durumdaki kısmı kesilip panoya alınır.


Range erim = Word_nesnesi.Selection.Range;

erim.Cut();



Şimdi ise aktif belgede imlecin mevcut konumunun sağındaki ilk 10 karakteri seçeceğim. Tabi seçme işlemine başlamadan yukarıdaki sayfalarda anlatılan şekilde istenen yere konumlandırılması gerekir.


private void Sec_Click(object sender, EventArgs e)

 {

   object son = 10;

   object unit = Microsoft.Office.Interop.Word.WdUnits.wdCharacter;

   Word_nesnesi.Selection.MoveEnd(ref unit, ref son);

 }



Bu koda dikkat ederseniz MoveEnd() metoduna 1. parametre olarak verilen 'unit' adlı değişkene WdUnits.wdCharacter aktarıldığı için imleç 2. parametre kadar sağa gider. Başka bir anlatımla imlecin ilk bulunduğu yerden başlamak üzere 10 karakter seçilir. MoveEnd() metodu aşağıdaki gibi kullanılırsa imlecin sağındaki 2 kelime seçilmiş olur. Bu belgenin seçili durumda olan kısmı varsa seçili kısım 2 kelime artmış olur.


private void Sec_Click(object sender, EventArgs e)

 {

   object son = 2;

   object unit = Microsoft.Office.Interop.Word.WdUnits.wdWord;

   Word_nesnesi.Selection.MoveEnd(ref unit, ref son);

}



Benzer şekilde bu kodda 'unit' adını verdiğim değişkenin içeriğinde değişiklik yapıp seçme işleminin satır, paragraf veya sayfa bazında yapılmasını sağlayabilirsiniz. Seçim işlemi bütün satırı veya paragrafı seçmek şeklinde olmayıp o sırada imlecin bulunduğu noktadan sonrası üzerinde etkili olur. Örneğin imleç belgenin bir satırın orta kısmında iken aşağıda verilen kod işletilirse 1.5 satır kadar seçimi yapılmış olunur.


private void Sec_Click(object sender, EventArgs e)

  {

    object son = 2;

    object unit = Microsoft.Office.Interop.Word.WdUnits.wdLine;

    Word_nesnesi.Selection.MoveEnd(ref unit, ref son);

  }



Word Belgesinde Arama İşlemleri

C# uygulaması dahilinde hazırladığınız Word belgelerinde arama yapacaksanız belgenin aramaya konu etmek istediğiniz kısmını Range ya da Selection nesnesi ile belirtebilirsiniz. Range nesnesi ile yapılan arama tekniğine öncelik verdiğim için forma bir düğme ve TextBox yerleştirip aşağıda verdiğim kodu hazırladım.


private void Ara_Click(object sender, EventArgs e)

{

 object aranan_str = textBox1.Text;

 object ilk = 0;

 object kar_sayi = Word_nesnesi.ActiveDocument.Characters.Count;

 Range erim = Word_nesnesi.ActiveDocument.Range(ref ilk,ref kar_sayi);

}



Bu kod sayesinde kullanıcı Word belgesinde aramak istediği metni TextBox'a girip bu düğmeyi tıkladığında belgenin tümünü kapsayacak Range nesnesi hazırlamış olur. Sizler aramayı belgenin tümü yerine istediğiniz kısmı ile sınırlayabilirsiniz.

Belgenin aramaya konu edilecek kısmı bu şekilde tespit edildikten sonra sıra arama yapılır¬ken kullanılan ve Microsoft.Office.Interop.Word'de yer alan Find arayüzünün örneğini almaya gelir. Find nesnesini nasıl hazırladığımı aşağıda görebilirsiniz.


private void Ara_Click(object sender, EventArgs e)

 {

   object aranan_str = textBox1.Text;

   object ilk = 0;

   object kar_sayi = Word_nesnesi.ActiveDocument.Characters.Count;

   Range erim=Word_nesnesi.ActiveDocument.Range(ref ilk, ref kar_sayi);

   Microsoft.Office.Interop.Word.Find arama_nesnesi;

   arama_nesnesi = erim.Find;

 }



Arama yapmak üzere hazırladığım bu kodda Range nesnesinin Find özelliğini Find tipindeki değişkene aktararak Find nesnesi hazırlamış oldum. Sıra geldi Execute() metodu ile arama yapmaya. Word'de normalde arama yapılırken ekrana getirilen diyalog kutusunda nasıl çok sayıda seçenek bulunuyorsa Execute() metodu da çok sayıda parametreye sahiptir. Biz aranacak metni 1. parametre olarak vermekle yetineceğiz ve diğer bütün parametrelerin yerine System.Reflection.Missing.Value içeriğine sahip Object tipinde bir değişkeni kullana¬cağız. Object tipindeki bu değişkene 'deger' gibi Türkçe bir ad verip kendimi tehlikeye atmadım.


private void Ara_Click(object sender, EventArgs e)

{

 object aranan_str = textBox1.Text;

 object ilk = 0;

 object kar_sayi = Word_nesnesi.ActiveDocument.Characters.Count;

 Range erim=Word_nesnesi.ActiveDocument.Range(ref ilk,ref kar_sayi);

 Microsoft.Office.Interop.Word.Find arama_nesnesi;

 arama_nesnesi = erim.Find;

 object missing = System.Reflection.Missing.Value;

 arama_nesnesi.Execute(ref aranan_str, 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);

 if (arama_nesnesi.Found == true)

    MessageBox.Show("Aranan Bilgi Bulundu");  

}



Gördüğünüz gibi Execute() metodu toplam 15 parametreye sahiptir. Kendisine 1. parametre olarak verilen bilgi söz konusu belgenin Range nesnesi ile işaret edilen kısmında varsa Find nesnesinin Found özelliği true olmaktadır. Arama işleminin seyri hakkında bilgi edinirken Find nesnesinin Found özelliğine bakmak yerine Execute() metodunun geriye gönderdiği bool bilgiye bakabilirsiniz. Aranan bilgi bulunduğunda Execute() metodu geriye true göndermektedir.

Yukarıda söylendiği gibi arama işlemi belgenin Range nesnesi ile işaret edilen kısmında yapılabildiği gibi Selection nesnesinden yararlanılabilir. Selection nesnesinden yararlanılarak nasıl arama yapıldığını aşağıda görebilirsiniz. Bu kitabı Word kitabına çevirmemek için Execute() metodunun parametreleri hakkında bilgi vermedim.


private void Ara_Click(object sender, EventArgs e)

 {

   object aranan_str = textBox1.Text;

   object missing = System.Reflection.Missing.Value;

   object unit = Microsoft.Office.Interop.Word.WdUnits.wdStory; 

   Word_nesnesi.Selection.HomeKey(ref unit, ref missing);

   Microsoft.Office.Interop.Word.Find arama_nesnesi;

   arama_nesnesi = Word_nesnesi.Selection.Find;   

   bool sonuc = arama_nesnesi.Execute(ref aranan_str, 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);

  if (sonuc)

     MessageBox.Show("Aranan Bilgi Bulundu");  

}



Word Belgesini Kaydetmek

Yukarıdaki sayfalarda C# uygulaması dahilinde yeni Word belgesi hazırlayıp bilgi girmiştik. Şimdi sırada kod yazarak hazırlayıp bilgi girdiğimiz belgeyi kaydetme var. İşin meraklılarını düşünerek bu işlem için kullanılan SaveAs() metodunun orijinal yapısını vereceğin. Bu metodun yapısı incelendiğinde tam tamına 16 parametreye sahip olduğu görülür. Ancak ürkmenize gerek yok bu 16 parametreden ilki hariç diğerlerini kullanmak isteğe bağlıdır.


public virtual void SaveAs(

    [In, Optional] ref object FileName, 

    [In, Optional] ref object FileFormat, 

    [In, Optional] ref object LockComments, 

    [In, Optional] ref object Password, 

    [In, Optional] ref object AddToRecentFiles, 

    [In, Optional] ref object WritePassword, 

    [In, Optional] ref object ReadOnlyRecommended, 

    [In, Optional] ref object EmbedTrueTypeFonts, 

    [In, Optional] ref object SaveNativePictureFormat, 

    [In, Optional] ref object SaveFormsData, 

    [In, Optional] ref object SaveAsAOCELetter, 

    [In, Optional] ref object Encoding, 

    [In, Optional] ref object InsertLineBreaks, 

    [In, Optional] ref object AllowSubstitutions, 

    [In, Optional] ref object LineEnding, 

    [In, Optional] ref object AddBiDiMarks

);



Bu bölüme ayrılan sayfa sayısını fazla arttırmamak için bütün parametrelerden söz etmeyece¬ğim. Yukarıda Add() metodu hakkında bilgi verilen sayfalardan bildiğiniz Word belgelerini, açarken, hazırlarken ve kaydederken varsayılan değerlere bağlı kalınmak istenen paramet¬relerin yerine System.Reflection.Missing.Value sabiti aktarılmış Object tipindeki bir değişkeni kullanmak mümkündür.

C# projesi dahilinde hazırlanan Word belgesinin nasıl kaydedildiğini anlatmak için forma bir SaveFileDialog nesnesi ve 'Kaydet' adında bir düğme yerleştirip aşağıda verdiğim kodu hazırladım. Kaydetmek istediğim belge yukarıda hazırlayıp ve 'Belge1' adını verdiğim DocumentClass nesnesidir.

Karışıklık olmasın diye DocumentClass ve ApplicationClass nesnelerini hazırladığım satırları 'Kaydet' düğmesi için hazırladığım metodun yakınına taşıdım. Ayrıca kaydetme işlemi sırasında hazırlanacak DOC uzantılı dosyanın adını kullanıcıdan istemek için forma bir SaveFileDialog nesnesi yerleştirdim.


ApplicationClass Word_nesnesi = new ApplicationClass();

Document Belge1 = new DocumentClass();

private void Kaydet_Click(object sender, EventArgs e)

 {

   object missing = System.Reflection.Missing.Value;

   saveFileDialog1.ShowDialog();  

   object Dosya = saveFileDialog1.FileName;

   Belge1.SaveAs(ref Dosya, 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, ref missing);

 }



O sırada C# uygulaması dahilinde hazırlanan Word belgesini kaydetmek üzere bu kod işle¬tildiğinde kullanıcıdan önce dosya adı istenir. Adını girdiğiniz dosyaya DOC uzantısını vermeniz önerilir. Çünkü bu sırada kaydedilmek istenen DocumentClass nesnesi hazırlanırken belge tipinin DOC uzantısı verilen normal belge olduğunu varsayıyoruz. Ayrıca kayıt sırasında kayıt türü konusunda bir ayarlama yapmadık. Bu kod işletilip kullanıcının girdiği belge adı o sırada açık Word penceresinin başlığına yazılır.

Word'ü az çok kullanmış olanların bildiği gibi Word belgeleri kaydedilirken Farklı Kaydet diyalog kutusunda istenen kayıt türü seçilebilmektedir. Benzer seçimi C# uygulaması dahilinde hazırladığınız belgeleri kaydederken yapabilirsiniz. Şimdi yukarıda hazırladığım Word belgesini bu kez RTF formatında kaydedeceğim. Bunu yaparken kayıt türünü SaveAs() metodunun 2. parametresinde belirteceğim.


ApplicationClass Word_nesnesi = new ApplicationClass();

Document Belge1 = new DocumentClass();

private void Kaydet_Click(object sender, EventArgs e)

  {

    object missing = System.Reflection.Missing.Value;

    saveFileDialog1.ShowDialog();  

    object Dosya = saveFileDialog1.FileName;

    object kayit_turu = WdSaveFormat.wdFormatRTF;  

    Belge1.SaveAs(ref Dosya, ref kayit_turu, 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);

 }



Bu kodda yukarıdakinden farklı olarak object tipinde bir değişken tanımlayıp Microsoft.Office.Interop.Word de yer alan WdSaveFormat adlı enum'un wdFormatRTF üyesini bu değişkene aktardım. Devamında 'kayit_turu' adını verdiğim değişkeni SaveAs() metoduna 2. parametre olarak verdim. Bu yazıda SaveAs() metodunun 2 parametresinden söz etmekle yetindim. Konuya ilgi duyanlar diğer parametrelerin işlevleriyle ilgilenebilirler.

Word Belgelerini Kapatmak

Şimdi ise C# uygulaması dahilinde hazırlayıp sonra da SaveAs() metodu ile kaydettiğim Word belgesini kapatacağım. Bu amaçla forma Kapat adında(Close mı deseydim, belki Kapat'ı birileri register etmiştir) bir düğme yerleştirip aşağıda verdiğim kodu hazırladım.


private void Kapat_Click(object sender, EventArgs e)

 {

   object missing = System.Reflection.Missing.Value;

   Belge1.Close(ref missing, ref missing, ref missing); 

 }



İşaret edilen belgeyi kapatmak amacıyla kullanılan Close() metodu 3 parametreye sahiptir. Bu metodu varsayılan değerlere göre işletmek istiyorsanız yine object tipinde bir değişken tanımlayıp bu değişkene System.Reflection.Missing.Value aktarıp her 3 parametrenin yerine kullanmalısınız. Bu durumda son hali kaydedilmemiş bir belge Close() metodu ile kapatıl¬mak istenirse otomatik olarak ekrana Farklı Kaydet diyalog kutusu gelir. Kapatılmak istenen belgede yapılan değişikliklerin kaydedilmesi konusunda size uyarı bulunulmasını istemiyor¬sanız Close() metodunun 1. parametresini aşağıdaki gibi düzenleyebilirsiniz.


private void Kapat_Click(object sender, EventArgs e)

 {

   object missing = System.Reflection.Missing.Value;

   object degisikleri_kaydet = WdSaveOptions.wdDoNotSaveChanges;

   Belge1.Close(ref degisikleri_kaydet, ref missing, ref missing); 

 }



Word belgesi yerine C# uygulaması dahilinde açtığınız Word penceresini kapatmak veya Word'ün çalışmasını sona erdirmek istiyorsanız ApplicationClass sınıfının Quit() metodunu kullanabilirsiniz. Bu metodun nasıl kullanıldığını aşağıda görebilirsiniz.


private void Cikis_Click(object sender, EventArgs e)

 {

  object missing = System.Reflection.Missing.Value;

  Word_nesnesi.Quit(ref missing, ref missing, ref missing);

 }



C# uygulaması dahilinde açtığınız Word penceresini kapatırken açık olan belgelerle ilgili olarak ekrana Fark
  • Etiketler;
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

çok teşekkürler, çok işime yaradı kitabınızı da bi yerden bulup okuycam, kolay gelsin başarılar
HOCAM MERHABA, EÐER YARDIM EDERSİNİZ SİZDEN YARDIM İSTİYORUM. VERİ TABANIYLA BİRLİKTE MARKET SATIŞ TAKİBİ YAPAN BİR PROJE YAPMAM LAZIM, HOCAMIZIN ANLATTIÐINA GÖRE, BUGUN MARKETE NE GİRDİ, NE ÇIKTI, KASAYA KAÇ PARA GİRDİ, KAÇ LİRA ÇIKTI. BOYLE BİR ÖDEV VERDİ.YARDIMCI OLURMUSUNUZ? :( UMARIM OLURSUNUZ. İYİ ÇALIŞMALAR..

Yukarı Git