GridViewde ki Kayıtları Excel Dosyasına Aktarmak

GridView’de ki Kayıtları Excel Dosyasına Aktarmak  Bu makalemizde de okunan verileri bir Excel dosyasına nasıl aktarabileceğimizi inceleyeceğiz. İlk bakışta aklımıza şu gelebilir: "GridView"in içeriği DataTable veya SqlDataSource gibi bir veri kaynağından geliyor. Zaten o nesneleri kullanarak veri aktarma işlemini yürütebiliriz". Evet, kesinlikle:) Fakat özellikle web sayfalarında GridView ile yapılan raporlama işlemlerinde sayfayı kullanan kişi yapmış olduğu sıralamaya veya sayfalamaya göre o an görünen kayıtları bir dökümana aktarmak ve kendi bilgisayarına saklamak isteyebilir. Örneğin kullanıcı gridview"da listelenen ürünleri fiyatına göre sıralatıp gelen ilk 50 tane kaydı bir Excel dökümanına aktarmak isteyebilir. İşte bu noktada veriyi sıralanmış, sayfalanmış şekilde zaten hali hazırda tutan gridviewden okuma ve aktarma işlemi yapmak programcı ve kullanıcı açısından oldukça önemli bir işlem olacaktır.Önceki makalemizde gridviewdeki satırları okuma işlemini detaylı şekilde ele aldığımız için bu konulara değinmeden griddeki verileri Excel dosyasına nasıl aktarabileceğimize geçiyorum. Öncelikli olarak burada yapılan işlemde veriler Excel gibi bir dökümana aktarılacaktır; yani içerisinde verileri çok daha farklı bir formatta tutan bir dosya tipi. İşin en güzel ve kolay tarafı şu ki; kullanacağımız gridview nesnesi içerisindeki kayıtları çok fazla işlem yapmamıza gerek kalmadan kolay bir şekilde Excel dosyasına aktarabileceğiz. Bu işlemi yaparken iki farklı yolu seçebiliriz:1. GridView kontrolündeki satırları direkt olarak Excel dosyasına aktarmak2. GridView kontrolündeki satırları okuyarak Table nesnesine aktarmak ve ardından Table nesnesinin içeriğini Excel dosyasına aktarmakBuradaki ilk yolu gördükten sonra "Neden Table nesnesi üzerinden bu işlemi yürütelim ki?" gibi bir soru işareti aklımıza gelebilir. Fakat gridview"daki kayıtları direkt olarak bir Excel dökümanına aktarma işleminde bazı sıkıntılarla ve hatalarla karşılaşılabilmektedir. Açıkcası internetten yapmış olduğum araştırmalarda bu işlemi gridviewdaki satırlar üzerinden direkt Excel"e aktarma yolunu seçersek hesapta olmayan hatalarla karşılaşabilme durumumuz olabiliyor. Bu nedenle 2. yolu kullanarak bu işlemi yürütmek daha sağlıklı olabilir. Yine Table nesnesi kullanıldığında elde edilen veriler üzerinde değişiklik yapma gibi bir avantajımızda olabildiği için bu yol biraz daha esnektir diyebiliriz. Dilerseniz ilk yolu kullanarak gridviewin satırlarını Excel dosyasına nasıl aktaracağımıza bakalım. Sayfamıza bir gridview kontrolü, bir radiobuttonlist kontrolü ve buton kontrolü ekleyerek sayfamızı tasarlayalım. Aşağıda sayfamızın görünümü bulunmaktadır.Şekil: Kullanacağımız sayfanın tasarımı ve kontrol isimleriRadioButtonList"ten yapılan seçim işlemine göre farklı şekilde verileri Excel"e aktarmamız gerekecek. Yine gridviewde Edit-Delete-Select gibi command butonları içeren bir kısım olursa bu kısmı dosyaya yazdırmak istemeyebiliriz. Bu işlem için GereksizKolonlariSil adında bir metot oluşturup, gridview kontrolünün dosyaya yazılmaya hazır hale getirilmesi işlemini aşağıdaki kodlarda görüldüğü gibi butonun click eventinde gerçekleştiriyoruz. Yapılan işlemlerle ilgili bilgiler yorum satırlarında bulunmaktadır. protected void Button1_Click(object sender, EventArgs e){   // GridView"in footer kısmının Excel dosyasında görüntülenmesini istemiyorsak PagerSettings"i saklamamız gerekli   gvUrunler.PagerSettings.Visible = false;   GereksizKolonlariSil();   if (rblSecim.SelectedIndex == 1) // İlk 50 kayıt   {      gvUrunler.PageIndex = 0;      gvUrunler.PageSize = 50;   }   else if (rblSecim.SelectedIndex == 2) // Tüm kayıtlar      gvUrunler.AllowPaging = false;   gvUrunler.DataBind(); // Yapılan değişikliklerin geçerli olması için verileri tekrar yüklüyoruz   GridiExceleKaydet(); // Gridviewdeki kayıtları direkt olarak Excel"e yazacak metot}private void GereksizKolonlariSil(){   // Eğer Select, Edit ve Delete gibi CommandFieldlar aktif ise bu butonların bulunduğu sütunu gridden çıkarıyoruz   for (int i = 0; i < gvUrunler.Columns.Count; i++)   {      if (gvUrunler.Columns[i] is CommandField)         gvUrunler.Columns.RemoveAt(i);   }}Böylece gridview kontrolünün içeriğini dosyaya yazdırılacak şekle getirildi. Butona tıklandığında postback işlemi gerçekleşeceği için gridview kontrolü yeniden düzenlenecek, ardından da GridiExceleKaydet metodunda okunan kayıtları dosyaya aktaracağız. Aşağıda bu metot ve yapılan işlemlerin açıklamaları bulunmaktadır. protected void GridiExceleKaydet(){   // Oluşacak dosyaya gridview aynen aktarılacağı için hücrelerin çevrelerinin çizilmesini sağlıyoruz   gvUrunler.GridLines = GridLines.Both;   // Gönderilecek cevaba gridin içeriğini yazdırmak için gvUrunler kontrolünü render etmek gerekli. Bu işlemleri    // StringWriter ve HtmlTextWriter nesnelerini ile yürütüyoruz. StringWriter, System.IO isim alanı altında yer alır   StringWriter stringYaz = new StringWriter();   HtmlTextWriter htw = new HtmlTextWriter(stringYaz);   gvUrunler.RenderControl(htw);   // İstemciye gönderilecek cevabı oluşturuyoruz. Öncelikli olarak cevapta(response"da) şu ana kadar oluşan   // bilgileri silip, cevabın başlık bilgisine gönderilecek dosya ile ilgili bilgileri ekliyoruz.  Dosya tipini belirttikten   // sonra yukarıda oluşturulan StringWriter nesnesini  ToString metodu ile cevaba yazdırıyoruz   Response.Clear();   Response.AddHeader("content-disposition", "attachment;filename=Urunler.xls");   Response.ContentType = "application/ms-excel";   Response.Write(stringYaz.ToString());   Response.End();} Bu işlemlerle birlikte gridview kontrolünün içeriğini Urunler.xls olarak bir Excel dosyasına yazdırabiliriz. Fakat sayfayı çalıştırıp dosyaya aktarma işlemini yaptığımız esnada bir hata almamız gerekecektir. Zira yukarıda gvUrunler isimli gridviewın RenderControl metodunu çalıştırmamız çalışma zamanı esnasında HttpException istisnasına sebep olacaktır.Şekil: gvUrunler"in RenderControl metodunu kullanarak yaptığımız işlem başarısız olacak ve çalışma zamanında HttpException istisnası alacağızBuradaki hatanın sebebi ASP.NET sayfasının yapısı itibariyle çalışma zamanı esnasında içerisinde bulunan bir kontrolü RenderControl metodu ile çözümlememize izin vermemesidir. Bu hatayı düzeltebilmek için Page class"ı içerisinde virtual olarak tanımlanmış olan VerifyRenderingInServerForm isimli metodu ezmek(override işlemi) gerekecektir. Bu işlemi Visual Studio 2005 editöründe gerçekleştirdiğimizde metodun gövdesinde otomatik olarak base class"taki metodu çağıran base.VerifyRenderingInServerForm(control); ifadesi bulunacaktır. Bu metot parametre olarak Control tipinden nesneler almaktadır ki; bu nesneler sayfamız içerisinde bulunan runat="server" tanımlaması içeren sunucu kontrollerimizdir. Bizim burada yapmamız gereken işlem metot içerisinde gelen kontrole bakmak ve eğer gridview kontrolü ise bu metodun çağrılmasını engellemek olacaktır. Aşağıdaki kodlarda bu işlemi nasıl yapacağımız görülmektedir. public override void VerifyRenderingInServerForm(Control control){   // Oluşan hata gvUrunler isimli kontrolün render edilmesi esnasında alındığı için, render edilen    // kontrolün gvUrunler olmadığı durumda base class"taki metodunu çağırıyoruz   if(control.ID != "gvUrunler")      base.VerifyRenderingInServerForm(control);} Böylece gridviewin RenderControl metodu ile çözümlenmesi işleminde yaşanan sorunun üstesinden gelebileceğiz. Sayfayı çalıştırdığımızda seçim işlemini yaparak kayıtları dosyaya aktarabiliriz.Şekil: Seçime göre oluşan Urunler.xls dosyamız Bu şekilde 1. yolumuz olan gridviewden direkt okuma ve Excel"e yazma işlemini gerçekleştirdik. Buradaki en büyük avantajımız satır okuma işlemleriyle uğraşmadan sadece render edilme işlemi ile bu işlemi yürütebilmek olacaktır. Dezavantajımız ise sayfamızın yapısı ile ilgili olan bir metodu override ederek gridview kontrolünün render edilmesini engellemek gibi bir işlemle uğraşmamız gerekeceğidir.Gridviewdeki kayıtları Excel dosyasına aktarmamızın bir diğer yolu ise System.Web.UI.WebControls isim alanı altında yer alan Table isimli bir class"tan faydalanarak bu işlemi yürütmektir. Table class"ı aslında HTML etiketinin sunucu tarafında oluşturulmasını sağlayan, içinde satır ve hücreler bulundurabilen nesne yapısı sunan bir kontroldür. Burada ise Table nesnesini Excel dosyasındaki satır ve sütunları oluşturması amacıyla kullanacağız. Aşağıda, gridview içerisindeki satırları Table nesnesine aktarma ve ardından da gridview yerine Table nesnesini render ederek içeriğini dosyaya aktarma işlemlerini içeren TabloyuExceleKaydet metodu bulunmaktadır. protected void TabloyuExceleKaydet(){   // Yeni bir tablo oluşturuyoruz. Bu tablo griddeki satırları içerisinde barındıracak.    // Oluşan Excel dosyasında hücreler arasında çizgiler ekliyoruz   Table tablo = new Table();   tablo.GridLines = GridLines.Both;   // Tablonun ilk satırı sütun başlıkları olacak   tablo.Rows.Add(gvUrunler.HeaderRow);   // Gridview"daki satırları döngü ile Rows kolleksiyonundan alıyor ve tabloya ekliyoruz   foreach (GridViewRow row in gvUrunler.Rows)   {      // GridViewRow class"ı TableRow class"ından kalıtıldığı için Add metoduna parametre olarak verilebilir      tablo.Rows.Add(row);   }   // Burada gridview yerine tablo nesnesini render ediyoruz   StringWriter stringYaz = new StringWriter();   HtmlTextWriter htw = new HtmlTextWriter(stringYaz);   tablo.RenderControl(htw);  // Render edilen bilgileri htw nesnesine yaz   Response.Clear();   Response.AddHeader("content-disposition", "attachment;filename=Urunler.xls");   Response.ContentType = "application/ms-excel";   Response.Write(stringYaz.ToString());   Response.End();} Butonun click eventinde çağırdığımız GridiExceleKaydet metodu yerine TabloyuExceleKaydet metodunu çağıracak olursak artık griddeki veriler önce Table nesnesine, ardından Excel dosyasına aktarılacaktır. Bu yolu seçtiğimizde VerifyRenderingInServerForm metodunu override etmemize gerek kalmayacaktır.Böylece gridview içerisinde yer alan kayıtları bir Excel dökümanına nasıl aktarabileceğimizi iki farklı yolu kullanarak görmüş olduk. Bir başka makalede görüşmek dileğiyle.

Döküman Arama

Başlık :

Kapat