GridView içindeki verileri Excel’e Aktarmak

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.

29 thoughts on “GridView içindeki verileri Excel’e Aktarmak

  1. Berkan Bilgin kardesim Allah senden Razi olsun 🙂 her ne kadar 5 sene önce yazsanda bilgiler günümüze kadar ulasiyor artik 🙂

  2. Hersey iyi guzel de iste birde Excel e atarken farkli hucreler yapmasa kafasina gore
    1 satirlik yeri 8 satir olarak ceviriyor Excel

    protected void ExceleAktarLinkButton_Click(object sender, EventArgs e)
       
    {
           
    Response.Clear();
           
    Response.AddHeader("content-disposition", "attachment;filename=testExport.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(GridView1);
           form1
    .RenderControl(htmlWrite);
           
    Response.Write(stringWrite.ToString());
           
    Response.End();
       
    }
     
       
    //HTML Codes into Visual HTML (Bu kisim HTML olarak gozukmesini sagliyor)
       
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
       
    {
           
    if (e.Row.RowType == DataControlRowType.DataRow)
           
    {
               
    for (int j = 0; j < e.Row.Cells.Count; j++)
               
    {
                   
    string encoded = e.Row.Cells[j].Text;
                   e
    .Row.Cells[j].Text = Context.Server.HtmlDecode(encoded);
               
    }
     
           
    }
       
    }

    8 satir yaptigi hucrede aslinda HTML tag lari var

    <table width="600" class="MsoNormalTable" style="width: 450pt; mso-cellspacing: .7pt; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 0cm 0cm 0cm;" border="0" cellspacing="1" cellpadding="0">      <tbody>          exists="1"></o:p></td>          </tr>      </tbody>  </table>

  3. 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.

  4. 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?

    wallace7402012-12-28 07:15:41

  5. 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

  6. Açykcasy telerik ile hiç denemedim. Telerik ile çaly?an bir arkada?a yönlendiriyim sizi, musaid ise cevap yazmaya çaly?syn.

  7. 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();
        }

  8. 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.

  9. 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.

  10. 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 :))

  11. 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 .

  12. 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??

     

  13. 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???

     

  14. 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

  15. PageRequestManagerParserErrorException ve RegisterForEventValidation hatasi alan arkadaslar
    public override void VerifyRenderingInServerForm(Control control)
    bu metodu override ederse sorun ortadan kalkacaktir.
    iyi çalismalar

  16. excele aktarma isleminde bir çok sorun çikabiliyor. eger kodlarini gönderirsen daha ii yardimci olabirim

  17. kodunuzu denedim ancak RegisterForEventValidation ancak Render() sirasinda çagrilabilir böyle bir hata aldim nedeni nedir acaba? yardimci olursaniz sevinirm

  18. 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.

  19. 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

  20. Ajax in içinde kulladim kodlari fakat
    PageRequestManagerParserErrorException hatasi aldim nedendir acaba,rica etsem mailime yazar misiniz.(zynp13@hotmail.com)

Guests için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir