Makale Özeti

Küçük bir program yazarak, C#.NET’de Threading, XML-XSL ve basit olarak bazı IO sınıflarına değineceğiz. Bilgisayarımızdaki Microsoft Word dökümanlarını bulan, özet bilgilerini ve döküman özelliklerini alıp, bir XML dosyasında depolayan ve bize sonuçları listeyerek görüntüleyen bir program yazalım.

Makale

Merhaba;

 

Makelemizin 1.bölümünde, klasörler arasında Microsoft Word dökümanlarını aratmıştık, şimdi 2.bölümde bulunan dökümanların, özet bilgilerini ve döküman bilgilerini alacağız ve sonuçları XML dosyasına kaydettikten sonra kullanıcıya vereceğiz.

 

İkinci butonumuzun Click eventine;

 

 

        private void bilgial_btn_Click(object sender, EventArgs e)

        {

            Microsoft.Office.Interop.Word.ApplicationClass word = new Microsoft.Office.Interop.Word.ApplicationClass(); // Microsoft Word nesnesi tanımlanıyor.

           

            object yok = System.Reflection.Missing.Value; // Microsoft.Office.Interop.Word.Documents.Open metodunun belirtmeyeceğimiz parametleri için

            object salt_okunur = true; // Microsoft.Office.Interop.Word.Documents.Open metodunda açacağımız dökümanı 'Salt Okunur' olarak açmak için

           

            for (int i = 0; i < bulunan_dokumanlar.Count; i++) // Bulunan tüm dökümanlar incelenmek üzere döngüde

            {

                try

                {

                    object dosya = @bulunan_dokumanlar[i]; // Dosyanın adresini, dökümanı açmak için object türünde tanımlıyoruz

                    string[] isimal = bulunan_dokumanlar[i].ToString().Split('\\'); // Dosyanın adresini, ismini XML'e yazmak için parçalıyoruz

 

 

                    string xmleyaz = "\n  <dokuman isim=\"" + isimal[isimal.Length - 1] + "\" adres=\"" + @bulunan_dokumanlar[i] + "\" >\n";

 

 

                    Microsoft.Office.Interop.Word.Document word_dokumani; // Word Dökümanını tanımladık

 

 

                    word_dokumani = word.Documents.Open(ref dosya, ref yok, ref salt_okunur, ref yok, ref yok, ref yok, ref yok, ref yok, ref yok, ref yok, ref yok, ref yok, ref yok, ref yok, ref yok, ref yok);

 

 

                    // Döküman özelliklerini alıyoruz

                    object word_dokuman_ozet_ozellikleri = word_dokumani.BuiltInDocumentProperties;

 

                    if (word_dokuman_ozet_ozellikleri == null)

                    {

                        return;

                    }

 

                    Type word_dokuman_ozet_ozellikleri_type = word_dokuman_ozet_ozellikleri.GetType();

 

                    // Almak istediğimiz özellikleri belirliyoruz

                    string[,] ozet_ozellikler =

                    {

                        { "Title", "Başlık" },

                        { "Subject", "Konu" },

                        { "Comments", "Açıklamalar" },

                        { "Author", "Yazan" },

                        { "Last Author", "En son düzenleyen" },

                        { "Category", "Kategori" },

                        { "Keywords", "Anahtar Sözcükler" },

                        { "Template", "Şablon" },

                        { "Creation date", "Oluşturulma Tarihi" },

                        { "Revision number", "Düzenleme Sayısı" },

                        { "Last save time", "Son kaydetme zamanı" },

                        { "Total editing time", "Toplam çalışma zamanı" },

                        { "Number of pages", "Toplam sayfa sayısı" },

                        { "Number of paragraphs", "Toplam paragraf sayısı" },

                        { "Number of lines", "Toplam satır sayısı" },

                        { "Number of words", "Toplam sözcük sayısı" },

                        { "Number of characters", "Toplam karakter sayısı" },

                        { "Number of bytes", "Toplam byte sayısı" }

                   

                    };

 

                    for (int j = 0; j < ozet_ozellikler.Length / ozet_ozellikler.Rank; j++)

                    {

 

                        string propValue = "";

 

                        object ozellik_item = word_dokuman_ozet_ozellikleri_type.InvokeMember("Item", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.GetProperty, null, word_dokuman_ozet_ozellikleri, new object[] { ozet_ozellikler[j, 0] });

                        Type dokumanozellik_kontrol = ozellik_item.GetType();

 

                        if (dokumanozellik_kontrol.InvokeMember("Value", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.GetProperty, null, ozellik_item, new object[] { }) != null)

                        {

                            string deger = "";

                            deger    = dokumanozellik_kontrol.InvokeMember("Value", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.GetProperty, null, ozellik_item, new object[] { }).ToString();

                            xmleyaz += "        <ozellik tur=\"0\" isim=\"" + ozet_ozellikler[j, 1] + "\" deger=\"" + deger + "\" />\n";

                        }

 

 

                    }

 

 

                    // Özel tanımlanmış özet bilgileri

                    object word_dokuman_ozel_ozellikleri = word_dokumani.CustomDocumentProperties;

 

                    if (word_dokuman_ozel_ozellikleri == null)

                    {

                        return;

                    }

 

                    Type word_dokuman_ozel_ozellikleri_type = word_dokuman_ozel_ozellikleri.GetType();

 

                    object ozellik_sayisi = word_dokuman_ozel_ozellikleri_type.InvokeMember("Count", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.GetProperty, null, word_dokuman_ozel_ozellikleri, new object[] { });

 

                    for (int j = 0; j < (int)ozellik_sayisi; j++)

                    {

                        string deger = "", anahtar = "";

 

                        object ozellik_item = word_dokuman_ozel_ozellikleri_type.InvokeMember("Item", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.GetProperty, null, word_dokuman_ozel_ozellikleri, new object[] { j + 1 }); // Değerlerin indisi 1'den başladığı için, döngünün argümanına 1 ekleyerek veriyi istiyoruz.

                        Type dokumanozellik_kontrol = ozellik_item.GetType();

 

                        if (dokumanozellik_kontrol.InvokeMember("Value", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.GetProperty, null, ozellik_item, new object[] { }) != null)

                        {

                            deger   = dokumanozellik_kontrol.InvokeMember("Value", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.GetProperty, null, ozellik_item, new object[] { }).ToString();

                            anahtar = dokumanozellik_kontrol.InvokeMember("Name", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.GetProperty, null, ozellik_item, new object[] { }).ToString();

 

                            xmleyaz += "        <ozellik tur=\"1\" isim=\"" + anahtar + "\" deger=\"" + deger + "\" />\n";

                        }

 

 

                    }

 

                    xmleyaz += "  </dokuman>\n";

 

                    xmlolusturulan += xmleyaz;

 

                    word_dokumani.Close(ref yok, ref yok, ref yok);  // Dökümanı kapattık

                    word_dokumani = null;

                }

                catch (Exception hata)

                {

                }

 

            }

 

            word.Quit(ref yok, ref yok, ref yok); // Word'ü kapattık

            word = null;

 

            kaydetgoruntule_btn.Visible = true;

 

        }

 

 

 

 

Dökümanı açtıktan sonra, ilk önce oluşturmakta olduğumuz XML’e dökümanın adını, adresini tanımlıyoruz.

Daha sonra döküman özelliklerini (‘BuiltInDocumentProperties’) alıyoruz, istediğimiz özellikleri dizimize tanımlıyoruz, özelliklerin Türkçe’lerini de belirterek XML’e özelliklerin adını Türkçe olarak yazıyoruz.

Ardından dökümanın özel tanımlanmış özetlerini (‘CustomDocumentProperties’) alıyoruz. Bu özelliklerin belli bir adı olmadığı için ‘BuiltInDocumentProperties’ deki gibi tek tek isimleri ile alamayız, ancak indisleri ile alabiliriz. Özellikleri alırken, indis 1’den başlıyor, bu yüzden döngünün argümanına 1 ekleyerek belirtiyoruz ve tüm özel tanımlanmış özet bilgilerini alıyoruz.

Ancak bu şekilde indisleri ile değerleri almak ‘BuiltInDocumentProperties’ de işe yaramıyor, bazı indislerde gayet düzgün bir şekilde değer gelirken birden tam ortasında hata veriyor, değerler karışabiliyor. Nedenini araştırmak için herhangi bir anlamlı hata mesajıda göremediğimiz için daha fazla uğraşmak yerine, birkaç satır yukarıda belirttiğim gibi tek tek bir dizide özellikleri tanımlayıp isimlerine göre aldık, aynı zamanda İngilizce olan özellik isimlerinide Türkçe’ye çevirip XML’e yazmak açısında da daha pratik oldu. Tüm bu bilgileri alma işlemleri bittikten sonra, ‘word’ nesnesini kapatıyoruz, ve ‘Kaydet / Görüntüle’ butonunu görünür hale getiriyoruz.

 

Artık üçüncü ve son işlemimiz olan Kaydetme ve Görüntüleme işlemimize geçebiliriz.

 

‘Kaydet / Görüntüle’ butonuna tıklandığında StreamWriter nesnesi ile XML dosyamızı kaydedeceğiz. Ve sonuçları görüntüleyeceğiz. İlk başta XML’i kaydettikten sonra tekrar okuyup bir panel nesnesi içerisinde paneller halinde sonuçları dizen bir kontrol yazma fikrini benimsemiştim ancak daha sonra aklıma daha pratik bir filir geldi. Nasıl olsa sonuçları XML’e kaydettik, o zaman XSL ile XML’e görünüm kazandırıp webbrowserda sonuçları görüntüleyebiliriz.

 

Sonuç XML;


 

<?xml version="1.0" ?>

<?xml-stylesheet type="text/xsl" href="xml.xsl"?>

 

<word_dokumanlari>

 

  <dokuman isim="alpero.doc" adres="C:\Documents and Settings\Alper\Belgelerim\alpero.doc" >

        <ozellik tur="0" isim="Döküman Özelliği" deger="sadgadgfgdafg" />

        <ozellik tur="1" isim="Özet Bilgisi" deger="sadgadgfgdafg" />

  </dokuman>

 

</word_dokumanlari>

 

 

Programımız yukarıdaki gibi XML dosyası oluşturuyor.

 

XSL;


 

<?xml version="1.0" encoding="iso-8859-9"?><!DOCTYPE xsl:stylesheet  [

      <!ENTITY nbsp   "&#160;">

      <!ENTITY copy   "&#169;">

      <!ENTITY reg    "&#174;">

      <!ENTITY trade  "&#8482;">

      <!ENTITY mdash  "&#8212;">

      <!ENTITY ldquo  "&#8220;">

      <!ENTITY rdquo  "&#8221;">

      <!ENTITY pound  "&#163;">

      <!ENTITY yen    "&#165;">

      <!ENTITY euro   "&#8364;">

]>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" encoding="iso-8859-9" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

<xsl:template match="/">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9"/>

<title>Untitled Document</title>

<style type="text/css">

body { margin: 0; font-family: trebuchet ms; font-size: 11px; }

h1 {

      font-size: 16px;

      padding-left: 45px;

      padding-top: 2px;

      height: 18px;

      margin: 0; 

}

h2 {

      font-size: 11px;

      font-weight:normal;

      padding-left: 45px;

      margin: 0;

      color: #50a850;

}

h3 {

      font-size: 11px;

      margin: 0;

}

hr {

      height: 1px;

      color: #50a850;

}

</style>

</head>

 

<body>

 

<xsl:for-each select="word_dokumanlari/dokuman">

 

      <div style="width: 98%; padding-left: 5px;">

 

            <div style="background-image:url(word.gif); background-repeat:no-repeat;">

                  <h1><xsl:value-of select="@isim"/></h1>

                  <h2><xsl:value-of select="@adres"/></h2>

            </div>

 

            <div>

                  <h3>Özellikleri</h3>

                  <xsl:for-each select="ozellik">

                        <div>

                       

                             <xsl:choose>

                                   <xsl:when test="position() mod 2 = 1">

                                         <xsl:attribute name="style">background-color:#ffffff; height: 18px;</xsl:attribute>

                                   </xsl:when>

                                   <xsl:otherwise>

                                         <xsl:attribute name="style">background-color:#E9E9E9; height: 18px;</xsl:attribute>

                                   </xsl:otherwise>

                             </xsl:choose>

 

 

                             <div style="float:left; width: 30%; text-indent:5px;"><xsl:value-of select="@isim"/></div>

                             <div style="float:left; width: 1%;">:</div>

                             <div style="float:left; width: 68%;"><xsl:value-of select="@deger"/></div>

 

                        </div>

     

                  </xsl:for-each>

                 

            </div>

            <hr />

 

      </div>

     

</xsl:for-each>

 

</body>

</html>

 

</xsl:template>

</xsl:stylesheet>

 

 

 

Bu XSL dosyası sonuçların bulunduğu XML dosyasına görünüm kazandırarak, sonuçları listememizi sağlıyor.

 

Şimdi bir webbrowser ekleyelim, adı ‘sonuclar_wb’ olsun.

 

‘Kaydet / Görüntüle’ butonumuzun ‘Click’ olayına;

 

        private void kaydetgoruntule_btn_Click(object sender, EventArgs e)

        {

 

            StreamWriter yaz = new StreamWriter("xml.xml");

            yaz.Write("<?xml version=\"1.0\" ?>\n<?xml-stylesheet type=\"text/xsl\" href=\"xml.xsl\"?>\n\n<word_dokumanlari>\n" + xmlolusturulan + "\n</word_dokumanlari>");

            yaz.Close();

 

            sonuclar_wb.Navigate(Directory.GetCurrentDirectory() + @"\xml.xml");

            sonuclar_wb.Visible = true;

 

        }

 

 

Yukarıdaki kodu yazalım.

İlk ‘Araştır’ butonuna basıldığında herşey en baştan başlayacağı için, sonadan görünür hale gelen webbrowserımızın gizlenmesini de unutmadan ekleyelim.

 

 

Artık herşey tamam, son olarak programımıza biraz makyaj yapalım. Görüntü önemlidir.

 

 

Bir arkaplan resmi oluşturduk, icon çizdik, yazı karakterlerini değiştirdik, webbrowserın kenar çizgileri kötü görünüyordu, kaldırmak için bir özelliği yoktu, bu yüzden webbrowserı bir panel içerisine yerleştirip, üst, sol ve alttan 2 pixel daha geniş tutarak, kenar çizgilerini görünmez hale getirdik.

 

Ve artık programımız tamamlandı.

 

 

Umarım faydalı olabilmişimdir.

 

Görüşmek üzere.

 

Alper Özçetin
alperozcetin@gmail.com

alper@grupbf.com

 

Ornek Kodlar