GridView ASP.Net’te sik olarak kullandigimiz ve gerçekten isimizi kolaylastiran bir bilesendir. Eminim çogunuzun grid üzerindeki verileri bir Excel sayfasina aktarmaya ihtiyaci olmustur. Bu makalemizde grid içerisindeki verileri bir Excel dosyasina nasil aktaracagimizi anlatacagim.
aspx ve aspx.cs dosyalarini indirmek için tiklayin
GridView den Excel’e Veri Aktarma
Aslinda grid den excel’e veri aktarma oldukça kolay bir istir. Basit bir örnekle bunu nasil gerçeklestirecegimize bakacagiz. Makalemizde örnek olarak Microsoft tarafindan ücretsiz olarak sunulan AdventureWorksDW2008 veritabanini kullanacagim.
Ilk olarak yeni bir solution içinde web sitesi olusturup ExceleAktarForm.aspx adinda bir webform ekleyelim. Daha önceki makalelerimizde bir gridviewi nasil bind edecegimizi anlatmistik, bu yüzden bu konulari bildiginizi varsayarak geçecegim. Gelelim nasil yapacagimiza
ExceleAktarForm .aspx sayfamizi asagidaki gibi düzenleyelim.
<form id="form1" runat="server">
<asp:GridView ID="MusteriGridView" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
<asp:BoundField DataField="BirthDate" HeaderText="BirthDate" SortExpression="BirthDate" />
<asp:BoundField DataField="EmailAddress" HeaderText="EmailAddress" SortExpression="EmailAddress" />
<asp:BoundField DataField="AddressLine1" HeaderText="AddressLine1" SortExpression="AddressLine1" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:AdventureWorksDW2008ConnectionString %>"
SelectCommand="SELECT TOP 20 [FirstName], [LastName], [BirthDate], [EmailAddress], [AddressLine1] FROM [DimCustomer]">
</asp:SqlDataSource>
<asp:LinkButton ID="ExceleAktarLinkButton" runat="server" OnClick="ExceleAktarLinkButton_Click">Excele Aktar</asp:LinkButton>
</form>
ExceleAktarForm .aspx.cs içerisinde ExceleAktarLinkButton tiklandigi zaman çalisacak olan eventi asagidaki gibi düzenleyelim.
protected void ExceleAktarLinkButton_Click(object sender, EventArgs e)
{
Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=FileName.xls");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/vnd.xls";
System.IO.StringWriter stringWrite = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
form1.Controls.Clear();
form1.Controls.Add(MusteriGridView);
form1.RenderControl(htmlWrite);
Response.Write(stringWrite.ToString());
Response.End();
}
Yukarida ki koda dikkat ederseniz RenderControl fonksiyonunu gridview için degil form için kullandik, bunun sebebine gelince; ASP.NET 1.1 de kullandigimiz DataGrid bileseninde excel’e aktarmak için datagridAdi.RenderControl kullaniyorduk fakat Asp.NET 2.0 dan sonra gelen GridView kontrolünde RenderControl özelligini kullandigimizda hata aliriz. Bu yüzden sayfamizda kullandigimiz form nesnesini kullaniyoruz. Gelelim diger kisimlarin açiklamasina;
Projemizi çalistirip Excel’e Aktar butonuna bastigimizda Excel dosyasinin olusturuldugunu göreceksiniz.
Gördügünüz gibi bir gridview içindeki verileri Excel’e aktarmak oldukça basit bir islem. Bir sonraki makalemizde de grid içerisindeki verileri Word ortamina atmaya deginecegiz.
DevExpress kullanyyorum bu uygulamayy yaparken çok ba?aryly bence.
Berkan Bilgin kardesim Allah senden Razi olsun 🙂 her ne kadar 5 sene önce yazsanda bilgiler günümüze kadar ulasiyor artik 🙂
Hersey iyi guzel de iste birde Excel e atarken farkli hucreler yapmasa kafasina gore
1 satirlik yeri 8 satir olarak ceviriyor Excel
8 satir yaptigi hucrede aslinda HTML tag lari var
BU ?ekilde export yapmayy hiç denemedim malesef.
Bu html tagleri grid içindeki Türü bölümümü ? Burasy bir html metinmi tutuyor ?
Bu resme bakynca excele oldukça yi aktarmy? görünüyor.
GridView ile Excel e export ediyorum sorunsuz fakat
HTML olan kysymlary kendi kafasyna göre farkly hücrelere(excel cell) atyyor Excel.
http://i.stack.imgur.com/9Vna0.png
1 satyrlyk yeri 7-8 satyra bolmus oluyor.
Bunun üstesinden nasyl gelirim? Bi fikriniz var my?
Syrf telerikte de?il normal Grid’de de ayny sorunu ya?yyorum. ben çözüldü sanmy?tym ancak çözülmemi? 🙁
Excel e atarken birden fazla satyra bolüyor tek satyrda göstermesi gereken bilgiyi.
HTML kodlary bi ?ekilde bozuyor olayy
Açykcasy telerik ile hiç denemedim. Telerik ile çaly?an bir arkada?a yönlendiriyim sizi, musaid ise cevap yazmaya çaly?syn.
ASP.NET standard GridView ile çok güzel çaly?yyor gösterdiginiz kodla.
Yalnyz ben bunu Telerik RadGrid ile de yapmak istiyorum fakat hata veriyor, yardymcy olabilirmisiniz?
RegisterForEventValidation can only be called during Render();
Bu hatayy alyyorum
protected void ExceleAktarLinkButton_Click(object sender, EventArgs e)
{
Response.Clear();
Response.AddHeader(“content-disposition”, “attachment;filename=radGrdExport.xls”);
Response.Charset = “”;
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = “application/vnd.xls”;
System.IO.StringWriter stringWrite = new System.IO.StringWriter();
HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
form1.Controls.Clear();
form1.Controls.Add(grdRapor); //RadGrid
form1.RenderControl(htmlWrite); //BU SATIRDA HATA VERIYOR
Response.Write(stringWrite.ToString());
Response.End();
}
Bu yazdigin bir html dosyasi response etmekte ve excelin bu dosyayi açma yeteniginin olmasindan dolayi çalisiyormus gibi
görünüyor. Aslinda bu yaptigin bir excel dosyasi olusturmak degil. Bu kodun sonucunda elde ettigin dosyayi tekrar sunucuya upload yap. excel dosyasi gibi üzerindeki verileri okumaya çalis okuyamazsin. Çünkü bir excel dökümani çiktisi verilmiyor. table ve tr ,td gibi html taglar arasina yazilmis veriler var. Benim asil aradigim exceli açip içine bir seyler yaptiktan sonra kayit edince ortaya çikan dosya.
@ihsan salcan cok tesekkurler allh razi olsun,sabahloadim bu sorun yuzunden:}
Gerçekten Yarali bir kaynak olmus. emegine saglik.
arkadasim tesekkur ederim. ben sayfama yerlestirdim. excel tablosunu aliyorum. kaydediyorum. fakat excele atilan verilerde türkçe karekterlerde sorun oluyor. web sayfasi görünümünde sorun yok türkçe karekterler okunuyor. fakat excele attigimda Türkçe karekterlerin yerine farkli karekterler çikiyor.
Selam Ihsan Sancan , tesadüfen gezerken gördüm sorununu.Yazar arkadasimiza karsi saygisizlik olmaz umarim , cunku henuz yardim gelmemis, söyle yardimci olim , eger render sorunu aliyosan , hangi sayfa için kullaniyosan sayfanin html kod kismninda yukarida <%@ Page Language="C#" seklinde bu dil sende farkli da olabilir , o satira gidip oraya EnableEventValidation="false" yaziyosun.Sonra çalistirip keyfini cikartiyosun :))
merhaba arkadasim ilk önce paylasimin için tesekkur ederim ellerine saglik .
fakat ben soyle bir hata aliyorum
Özel Durum Ayrintilari: System.InvalidOperationException: RegisterForEventValidation ancak Render() sirasinda çagrilabilir;
bu sorunu çözmede yardimlarini rica ediyorum .
merhaba bir div içerisine table ve birde datalist koyup daha sonra bu div e runat="server" deyip RenderControl yapamazmiyim? yani div içerindeki herseyi excele göndermek istiyorum. Yardim edermisiniz??
Arkadaslar Gridview nesnesini form tagi içine koymadan excele gönderemem mi?? Masterpage kullandigim için form içine alamiyorum gridviewi ve
RegisterForEventValidation ancak Render() sirasinda çagrilabilir;
hatasi aliyorum çok acil yardim edebilirmisiniz???
Çok faydali oldu yazar arkadasin eline koluna ve aklina saglik…
Merhaba M.Sabri Bey,
Çok yararli bir paylasim tesekkür ederim.Bir de Excel deki verileri Oracle veya MSSql veritabanina verileri nasil aktaririz.
Saygilarimla
RIDVAN ARIK ridvanarik@gmail.com
ne hatasi aliyorsunuz.
EXPLORERDA HATA VERIYOR
PageRequestManagerParserErrorException ve RegisterForEventValidation hatasi alan arkadaslar
public override void VerifyRenderingInServerForm(Control control)
bu metodu override ederse sorun ortadan kalkacaktir.
iyi çalismalar
excele aktarma isleminde bir çok sorun çikabiliyor. eger kodlarini gönderirsen daha ii yardimci olabirim
öncelikle hizli cevap için tesekkürler, evet form taglari arasinda gridviewim var…
Gridview kontrolünü bir form içine koydunuz degilmi ?
kodunuzu denedim ancak RegisterForEventValidation ancak Render() sirasinda çagrilabilir böyle bir hata aldim nedeni nedir acaba? yardimci olursaniz sevinirm
devam..
saglarsaniz sorun kökten hallolmus olur. Updatepanel içersinde kullandiginiz buton ya da linkbuttonu tiklamanizdan sonra sayfanin refreslenmesi için updatepanelin Triggers collection’ina ilgili buton ya da link butonu ekleyin. Ekleme islemini yaparken Add butonunun sag tarafindaki imgeye tikladiginizda 2 tane seçenek çikacak karsiniza bunlardan biri PostBackTrigger digeri ise AsyncPosBackTrigger. PostBackTrigger’i seçerseniz updatepanel içersinde artik hatayi aldiginiz noktada sayfanin yenilenmesi olacagi için sorununuz ortadan kalkmis olacak.
http://www.gevisgetiren.com/post/2009/01/06/SysWebFormsPageRequestManagerParserErrorException-hatasc4b1-ve-cozumu.aspx
yukardaki linkten alintidir. eger sorununuza çözum olmassa ilgilenmeye çalisirim.
AJAX Extensions 1.0 kullanarak olusturdugunuz ASP.NET 2.0 uygulamalarinda Sys.WebForms.PageRequestManagerParserErrorException hatasini alabilirsiniz. Nedeni Ajax ile Response.Write() metodunu kullanmaya çalismaniz ya da session kullanmaniz olabilir, ajax ile Response.Write() metodu kullanmanin bazi sakincalari oluyor bunun yerine alternatif çözümler üretmeye çalismaniz gerekiyor kodunuzda. Ya da sayfada bu hatayi aldiginizda ilgili sayfayi refresh etmeniz ise yariyor bunun için bir javascript kodu yazabilirsiniz. Ama javascript kodu yazmak zor gelir bana diyorsaniz sunu deneyin: hatayi aldiginiz yer tam olarak neresi onu saptayin öncelikle, muhtemelen bir buton ya da linkbutona tikladiktan sonra aldiginiz bir hata bu. Tikladiginiz buton ya da linkbutondan sonra sayfanin refreshlenmesi
Ajax in içinde kulladim kodlari fakat
PageRequestManagerParserErrorException hatasi aldim nedendir acaba,rica etsem mailime yazar misiniz.(zynp13@hotmail.com)
faydalandim, tesekkürler.