19 Ocak 2017 Perşembe
Twitter

Word'ü Raporlama Aracı Olarak Kullanmak

Word'ü raporlama aracı olarak kullanabilirsiniz. Nasıl mı? Yazıya bir göz atın.

Bu yazımızda Microsoft Word'ü kullanarak basit bir raporlama işlemi gerçekleştireceğiz.

(Siz, isterseniz bu işlemin adına, "Word'e Aktarma" da diyebilirsiniz. İkisi de aynı anlama geliyor.)

Bildiğiniz üzere Microsoft Office ailesi programlar (Word, Excel, PowerPoint, vd.) 2007 sürümünden itibaren XML tabanlı hale geldiler. Zaten dosya uzantılarının sonundaki "X" /(.docX, .xlsX, .pptX), XML formatını kastetmektedir.

(bkz. http://office.microsoft.com/en-us/starter-help/open-xml-formats-and-file-name-extensions-HA010354237.aspx)

Üstelik, XML tabanlı olmalarının yanında bir de otomatik ZIP teknolojisi ile sıkıştırılmış haldeler.

Henüz bu özelliği duymadıysanız, istediğiniz bir word dosyasının (uzantısı docx olmalıdır, 2007+ sürümü) uzantısını zip olarak değiştirip, dosyanın bildiğiniz zip dosyası olarak kullanılabileceğini görebilirsiniz.

Ben de Word'un bu özelliğini kullanarak, bir docx dosyasını raporlama aracı olarak neden kullanmamayım dedim ve işte bu yazı ile bunu sizlerle paylaşıyorum.

Amacımız, raporlama için bir şablon word dosyasını kullanarak, içindeki anahtar alanların değerlerini, bizim isediğimiz bilgilerle değiştirmek ve sonrasında kullanıcıya bu dosyayı sunmak olacak.

Unutmadan, ZIP dosyası açma ve kaydetme işlemleri için "DotNetZip Library" kütüphanesini kullanacağım. Siz, istediğiniz diğer kütüphanelerden birini de kullanabilirsiniz.

Şimdi yavaş yavaş kodlama tarafına geçelim.

Şablon olarak ben aşağıda önizlemesini gördüğünüz word dosyasını kullanacağım.

(Siz tabii ki istediğiniz gibi üzerinde düzenleme yapabilirsiniz.)

3 tane anahtar alan (ADSOYAD, TARIH, BORC) yerleştirdim.  Bunları da { } ler arasına aldım ki diğer metinlerden farklı bir özelliği olsun. Siz yine nasıl isterseniz öyle yapabilirsiniz. İsterseniz köşeli parantezler içerisine alın mesela.

Web sitesi projeme öncelikle DotNetZip Library dll lini, ardından şablon olarak kullanacağım docx dosyasını ve son olarak da bir tane ASPX sayfası ekledim.

ASPX tarafına 3 tane TextBox ve bir tane de Button yerleştirdim. Kullanıcılardan bilgi almak amaçlı kullanacağım. Siz başka yöntemler de kullanabilirsiniz.

Bu işlemleri yaptıktan sonra Solution Explorer görüntüsü şu şekildedir:

Şimdi ASPX tarafındaki buttona tıklayınca sırasıyla;

  1. Şablon docx dosyasını geçici bir klasöre açacağım. (extract işlemi)
  2. Metin bilgilerini bulunduran ilgili xml dosyasının (word/document.xml) içeriğini istediğim bilgilerle değiştireceğim.
  3. Geçici klasörü zipleyip kullancıya sunacağım. (download işlemi)
  4. Son olarak da geçici klasörü sileceğim. (işi bitti artık nasılsa)

Buyrun kodlarımız:

protected void btnRapor_Click(object sender, EventArgs e)
{
    // Şablon dosyasının yeri
    string zipDosya = Server.MapPath("Sablon/Sablon1.docx");
    // geçici klasör
    string geciciKlasor = string.Format(Server.MapPath("Sablon/{0}"), Guid.NewGuid().ToString("N"));
    // şablonu geçici klasöre aç
    using (ZipFile zip = ZipFile.Read(zipDosya))
    {
        zip.ExtractAll(geciciKlasor);
    }
    // içerik word/document.xml altında
    string documentDosya = geciciKlasor + @"\word\document.xml";
    // tüm içeriği oku
    string icerik = File.ReadAllText(documentDosya);
    // anahtar alanları güncelle
    icerik = icerik.Replace("{ADSOYAD}", txtAdSoyad.Text);
    icerik = icerik.Replace("{TARIH}", txtTarih.Text);
    icerik = icerik.Replace("{BORC}", txtBorc.Text);
    // document.xml i kaydet
    StreamWriter writer = new StreamWriter(documentDosya, false);
    writer.Write(icerik);
    writer.Close();

    // geçici klasörü ziple ve kullanıcıya Rapor.docx adıyla indir
    using (ZipFile zip = new ZipFile())
    {
        string zipAdi = "Rapor.docx";
        Response.Clear();
        Response.BufferOutput = false; // uzun dosyalar için
        Response.ContentType = "application/zip";
        Response.AddHeader("content-disposition", "filename=" + zipAdi);

        zip.AddDirectory(geciciKlasor);

        zip.Save(Response.OutputStream);
    }
    // işi bitince geçici klasörü sil
    Directory.Delete(geciciKlasor, true);
    Response.Close();
}

Formdaki bilgileri doldurup butona tıklayınca oluşan word dosyası:

 

Umarım, bu yazıyı okuduktan sonra aklınıza, bu yöntemi kullanarak daha ilginç fikirler gelir :)

Herkese kolaylıklar diliyorum.

Örnek projeyi buradan indirebilirsiniz.


NOT:

ZIP işlemleri için http://www.daltinkurt.com/Icerik/186/Zip-ve-Unzip-Islemleri.aspx adresine göz atabilirsiniz.

Değerlendirme

Yazım dilinin sadeliği ve anlaşılabilirliği Puan: 3,38 (3 oy)
Yazıdaki kodların kalitesi Puan: 4,78 (2 oy)
İhtiyaca cevap verme Puan: 4,65 (2 oy)
Tavsiye edilebilirlik Puan: 4,68 (2 oy)
Genel değerlendirme Puan: 4,68 (2 oy)
Puanlamalar 5 üzerindendir.
  • Site Yorumları
  • Facebook Yorumları Facebook Yorumları
Yeni yorum yaz Toplam: 17, Onay bekleyen: 0.
  1. Eren karakaş

    Sayin hocam verdigiiz bilgiler icin cok tesekkurler. Benim soyle bir sorunum var? Ben string degerleri aktardim fakat benim bir aspxgridview tablom var buna verdigin sorguyu for ile okuyup stringe cevirip worde atiyorum ama tanlo olusturup icine alamadim. Kod bilgimde zayif oldugundan bir turlu beceremedim.

  2. Bilgi FEVZİOPLU

    Sizin projenizi açtığımda çalışıyor ancak benim projeme; 1-Add Referance dan `lonic.Zip.dll` ekledim 2-Sablon dosyasını içindekş dosyayla birlikte yedekledim 3-Kodları aynen aktardım 4- Using Ionic... ve Using System.IO ekledim ancak aldığım hata şöyle `An exception of type `System.IO.DirectoryNotFoundException` occurred in mscorlib.dll but was not handled in user code Additional information: `C:\Users\Perakende\Documents\Visual Studio 2013\WebSites\suderfnl\sut\Sablon\Sablon1.docx` yolunun bir parçası bulunamadı.`

    • Devrim Altınkurt

      vs de website a sağ tıkla properties den virtual path i sil. tekrar dene derim.

  3. ertugrul ozengi

    ii günler Sayın Hocam Peki Word Dosyasındaki Bilgileri NAsıl Web Formda Önizleme Olarak Gösterebilirim ?????

  4. mülayim

    Bir tablodaki tüm kayıtları tek word dosyasına aktarmak istiyorum.Ama bu kodla. 1-Bir döngü ile tablodaki tüm kayıtları okudum icerik değişkenine tek tek eşitledim ancak sadece tek kaydı word e yazdırabildim.

  5. Devrim Altınkurt

    bir word dosyasına tüm kayıtları mı aktaracaksın yoksa tüm kayıtlar için ayrı ayrı word dosyası mı oluşturacaksın?

    • mülayim

      Tüm kayıtları tek word dosyasına aktarmak istiyorum

      • Devrim Altınkurt

        Elindeki bilgileri tek bir string değişkeninde tutup word şablonundaki ilgili alana yazıda belirttiğim şekilde atayabilirsin.


        Örnek:


        <br />string bilgi="<table>"; <br />foreach(var kayit in kayitlar) <br /> bilgi+=string.Format("<tr><td>Başlık</td><td>{0}</td></tr>", kayit.Baslik); <br />bilgi+="</table>"; <br />

        • mülayim

          Hocam Selamlar kodda string değişkeni içerisine html kodu yazıldığında dosya bozuk oluyor

          • mülayim

            Hocam html tagları yazdırma konusunda başarılı olamadım CDATA vs birçok şey denedim

            • Devrim Altınkurt

              web.config te system.web tagları arasına şu satırları eklersen sorun çözülür: <pages validateRequest="false"/> <httpRuntime requestValidationMode="2.0"/> (ya da varsa bu şekilde güncellemelisin)

              • mülayim

                Maalesef olmadı

                • Devrim Altınkurt

                  olmayan nedir çözüm bu test ettim sıkıntısız çalışıyor

                  • mülayim

                    elimdeki bir tabloyu daha öncede söylediğiniz gibi string bir değişken yardımyla oluşturdum Bunu word dosyasına yazdırmaya çalışırken icerik icerik replace AD hmlStr komutu ile yapmaya çalışıyorum ancak dosya bozuk oluyor