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.