Makale Özeti

Bu makalemizde Gridview'daki kayıtlarımızı Word, Excel, PDF ve CSV formatlarına nasıl aktaracağımızı öğreneceğiz. ASP.NET ile Word,Excel ve CSV formatlarına 3. parti yazılımlar gerektirmeden kolayca aktarım sağlarken , PDF'e veri aktarımında ise ücretsiz 3. parti bir yazılım olan iTextSharp tool'unu kullanacağız.

Makale

Bu makalemizde Gridview'daki kayıtlarımızı Word, Excel, PDF ve CSV formatlarına nasıl aktaracağımızı öğreneceğiz.
ASP.NET ile Word,Excel ve CSV formatlarına 3. parti yazılımlar gerektirmeden kolayca aktarım sağlarken , PDF'e veri aktarımında ise ücretsiz 3. parti bir yazılım olan iTextSharp tool'unu kullanacağız.
Öncelikle aktarım için Gridview içerisinde biraz veri bulunması gerekmekte. Bunun için Northwind Database'nden Customers kayıtlarını Gridview'e dolduruyorum. Gridview’mızın HTML çıktısı aşağıdaki gibidir ;


Gridview'mızı hazırladıktan sonra altına 4 tane buton ekliyoruz.
  1. Export To Word
  2. Export To Excel
  3. Export To PDF
  4. Export To CSV



Microsoft Word Formatına Veri Aktarımı

C#
protected void btnExportWord_Click(object sender, EventArgs e) {
  // İçeriği yüklemeden önce ekrandaki çöpleri temizliyoruz
  Response.Clear();
  Response.Buffer = true;
  Response.AddHeader("content-disposition","attachment;filename=GridViewExport.doc");
  Response.Charset = "";
  Response.ContentType = "application/vnd.ms-word ";
  StringWriter sw= new StringWriter();
  HtmlTextWriter hw = new HtmlTextWriter(sw);
  // Gridviewdakı bütün verileri aktarabilmek için sayfalama özelleğini iptal edip , Gridview’mızdaki değişikliklerin geçerli olabilmesi için tekrar dolduruyoruz
  GridView1.AllowPaging = false;
  GridView1.DataBind();
  // Gridview’daki değerlerimizi html formatına renderlıyoruz
  GridView1.RenderControl(hw);
  Response.Output.Write(sw.ToString());
  Response.Flush();
  Response.End(); }

VB.Net
Protected Sub btnExportWord_Click(ByVal sender As Object, ByVal e As EventArgs)
  Response.Clear()
  Response.Buffer = True
  Response.AddHeader("content-disposition","attachment;filename=GridViewExport.doc")
  Response.Charset = ""
  Response.ContentType = "application/vnd.ms-word "
  Dim sw As New StringWriter()
  Dim hw As New HtmlTextWriter(sw)
  GridView1.AllowPaging = False
  GridView1.DataBind()
  GridView1.RenderControl(hw)
  Response.Output.Write(sw.ToString())
  Response.Flush()
  Response.End()
End Sub

Not : C# içerisinde yazdığım açıklamalar VB.Net tarafı içinde geçerlidir. Eğer eksiksiz kodu yazdıysanız alttaki gibi bir çıktı elde edeceksiniz.



Microsoft Excel Formatına Veri Aktarımı

C#
protected void btnExportExcel_Click(object sender, EventArgs e) {
  Response.Clear();
  Response.Buffer = true;
  Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.xls");
  Response.Charset = "";
  Response.ContentType = "application/vnd.ms-excel";
  StringWriter sw = new StringWriter();
  HtmlTextWriter hw = new HtmlTextWriter(sw);
  GridView1.AllowPaging = false;
  GridView1.DataBind();
  //Başlık rowlarının arka planını beyaz olarak ayarlıyoruz.
  GridView1.HeaderRow.Style.Add("background-color", "#FFFFFF");
  //Şimdide hücre başlıklarının arka planını yeşil yapıyoruz
  GridView1.HeaderRow.Cells[0].Style.Add("background-color", "green");
  GridView1.HeaderRow.Cells[1].Style.Add("background-color", "green");
  GridView1.HeaderRow.Cells[2].Style.Add("background-color", "green");
  GridView1.HeaderRow.Cells[3].Style.Add("background-color", "green");
  for (int i = 0; i < GridView1.Rows.Count;i++ )
 {
     GridViewRow row = GridView1.Rows[i];
     //Arka plan rengini beyaz olarak ayarlıyoruz
     row.BackColor = System.Drawing.Color.White;
     //Her row’un text özelliğine bir class atıyoruz
     row.Attributes.Add("class", "textmode");
     //Biraz daha güzellik katmak için 2. Row’ların arka planlarına farklı bir renk veriyoruz
          if (i % 2 != 0)
          {
               row.Cells[0].Style.Add("background-color", "#C2D69B");
               row.Cells[1].Style.Add("background-color", "#C2D69B");
               row.Cells[2].Style.Add("background-color", "#C2D69B");
               row.Cells[3].Style.Add("background-color", "#C2D69B");
          }
  }
  GridView1.RenderControl(hw);
  //Sayısal formatların bozuk çıkmaması için format belirliyoruz
  string style = @"";
  Response.Write(style);
  Response.Output.Write(sw.ToString());
  Response.Flush();
  Response.End();

VB.Net
PProtected Sub btnExportExcel_Click(ByVal sender As Object, ByVal e As EventArgs)
     Response.Clear()
     Response.Buffer = True
     Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.xls")
     Response.Charset = ""
     Response.ContentType = "application/vnd.ms-excel"
     Dim sw As New StringWriter()
     Dim hw As New HtmlTextWriter(sw)
     GridView1.AllowPaging = False
     GridView1.DataBind()
     GridView1.HeaderRow.Style.Add("background-color", "#FFFFFF")
     GridView1.HeaderRow.Cells(0).Style.Add("background-color", "green")
     GridView1.HeaderRow.Cells(1).Style.Add("background-color", "green")
     GridView1.HeaderRow.Cells(2).Style.Add("background-color", "green")
     GridView1.HeaderRow.Cells(3).Style.Add("background-color", "green")
     For i As Integer = 0 To GridView1.Rows.Count - 1
          Dim row As GridViewRow = GridView1.Rows(i)
          row.BackColor = System.Drawing.Color.White
          row.Attributes.Add("class", "textmode")
          If i Mod 2 <> 0 Then
               row.Cells(0).Style.Add("background-color", "#C2D69B")
               row.Cells(1).Style.Add("background-color", "#C2D69B")
               row.Cells(2).Style.Add("background-color", "#C2D69B")
               row.Cells(3).Style.Add("background-color", "#C2D69B")
          End If
     Next
     GridView1.RenderControl(hw)
     Dim style As String = ""
     Response.Write(style)
     Response.Output.Write(sw.ToString())
     Response.Flush()
     Response.End()
End Sub br />


C# içerisinde yazdığım açıklamalar VB.Net tarafı içinde geçerlidir. Eğer eksiksiz kodu yazdıysanız alttaki gibi bir çıktı elde edeceksiniz.



PDF Formatına Veri Aktarımı
Gridview içerisindeki verileri PDF formatına aktarmak için ücretsiz bir yazılım olan iTextSharp kütüphanesini kullanacağız. Bunun için projenize iTextSharp kütüphanesini projenize ekliyorsunuz ve aşağıdaki namespace ‘leri sayfanıza ekliyorsunuz.

C#
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html;
using iTextSharp.text.html.simpleparser;

VB.Net
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.text.html
Imports iTextSharp.text.html.simpleparser


Not: Eğer PDF’inizin görselliği ile oynamak isterseniz iTextSharp bunu desteklemez.

C#
protected void btnExportPDF_Click(object sender, EventArgs e)
{
     Response.ContentType = "application/pdf";
     Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.pdf");
     Response.Cache.SetCacheability(HttpCacheability.NoCache);
     StringWriter sw = new StringWriter();
     HtmlTextWriter hw = new HtmlTextWriter(sw);
     GridView1.AllowPaging = false;
     GridView1.DataBind();
     GridView1.RenderControl(hw);
     StringReader sr = new StringReader(sw.ToString());
     Document pdfDoc = new Document(PageSize.A4, 10f,10f,10f,0f);
     HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
     PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
     pdfDoc.Open();
     htmlparser.Parse(sr);
     pdfDoc.Close();
     Response.Write(pdfDoc);
     Response.End();
}

VB.Net

Protected Sub btnExportPDF_Click(ByVal sender As Object, ByVal e As EventArgs)
     Response.ContentType = "application/pdf"
     Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.pdf")
     Response.Cache.SetCacheability(HttpCacheability.NoCache)
     Dim sw As New StringWriter()
     Dim hw As New HtmlTextWriter(sw)
     GridView1.AllowPaging = False
     GridView1.DataBind()
     GridView1.RenderControl(hw)
     Dim sr As New StringReader(sw.ToString())
     Dim pdfDoc As New Document(PageSize.A4, 10.0F, 10.0F, 10.0F, 0.0F)
     Dim htmlparser As New HTMLWorker(pdfDoc)
     PdfWriter.GetInstance(pdfDoc, Response.OutputStream)
     pdfDoc.Open()
     htmlparser.Parse(sr)
     pdfDoc.Close()
     Response.Write(pdfDoc)
     Response.End()
End Sub

Eğer eksiksiz kodu yazdıysanız alttaki gibi bir çıktı elde edeceksiniz.



CSV Formatına Veri Aktarımı

En son konumuz olan CSV formatına veri aktarımına geldik. Burada belirleyeceğiniz bir karakter ile verilerinizi birbirinden ayırmanız gerekmektedir. Ben “,” karakterini kullanacağım.
C#
protected void btnExportCSV_Click(object sender, EventArgs e)
{
     Response.Clear();
     Response.Buffer = true;
     Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.csv");
     Response.Charset = "";
     Response.ContentType = "application/text";
     GridView1.AllowPaging = false;
     GridView1.DataBind();
     StringBuilder sb = new StringBuilder();
     for (int k = 0; k < GridView1.Columns.Count; k++)
     {
          //Ayıraç belirliyoruz
          sb.Append(GridView1.Columns[k].HeaderText + ',');
     }
     //Yeni bir satır ekliyoruz
     sb.Append("\r\n");
     for (int i = 0; i < GridView1.Rows.Count; i++)
     {
          for (int k = 0; k < GridView1.Columns.Count; k++)
          {
          // Ayıraç belirliyoruz
          sb.Append(GridView1.Rows[i].Cells[k].Text + ',');
          }
      //Yeni bir satır ekliyoruz
     sb.Append("\r\n");
     }
     Response.Output.Write(sb.ToString());
     Response.Flush();
     Response.End();
}    

VB.Net
PProtected Sub btnExportCSV_Click(ByVal sender As Object, ByVal e As EventArgs)
     Response.Clear()
     Response.Buffer = True
     Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.csv")
     Response.Charset = ""
     Response.ContentType = "application/text"
     GridView1.AllowPaging = False
     GridView1.DataBind()
     Dim sb As New StringBuilder()
     For k As Integer = 0 To GridView1.Columns.Count - 1
     sb.Append(GridView1.Columns(k).HeaderText + ","c)
     Next
     sb.Append(vbCr & vbLf)
     For i As Integer = 0 To GridView1.Rows.Count - 1
     For k As Integer = 0 To GridView1.Columns.Count - 1
     sb.Append(GridView1.Rows(i).Cells(k).Text + ","c)
     Next
     sb.Append(vbCr & vbLf)
     Next
     Response.Output.Write(sb.ToString())
     Response.Flush()
     Response.End()
End Sub


Eğer eksiksiz kodu yazdıysanız alttaki gibi bir çıktı elde edeceksiniz.



Projenizi ilk çalıştırdığınızda verileri export etmek istediğinizde aşağıdaki gibi bir hata ile karşılacaksınız.


Gridview nesnesinin export işleminden önce render edilmemiş olması. Bunun için aşağıdaki kod bloğunu projemize ekliyoruz.

C#
public override void VerifyRenderingInServerForm(Control control)
{
/* Kontrolün renderlandığı doğrulanıyor */
}

VB.Net
Public Overloads Overrides Sub VerifyRenderingInServerForm (ByVal control As Control)
' Kontrolün renderlandığı doğrulanıyor
End Sub


Bir makalemizin daha sonuna geldik. Makale ile ilgili sorularınızı mail adresimden bana ulaşarak sorabilirsiniz.


Volkan KORKMAZ
Microsoft Certified Business Management Solutions Specialist
volkankorkmaz@gmail.com
http://www.volkankorkmaz.net