7 Şubat 2016 Pazar

ASP.NET (C#) Excel Çıktı Üretme & Yaşanılan Sorunlar

Asp.net'de en çok yaşanan sorunlardan birisi excel çıktı üretmek. Bunun en çok kullanılan 3 yol şunlar;

  1. Microsoft Excel Interop dll'lerini kullanmak
  2. HTML olarak üretilmiş table'ı excel uzantılarıyla yazdırmak(Response ile)
  3. OpenXML dll'ini kullanmak. 
1.Yöntem: excelin tüm olanaklarını kullanmanızı sağlasa da, web projenizi yayınladığınızda çok fazla soruna neden oluyor. Office sürüm sorunları, serverlarda yaşanan yetkilendirme sorunları(exceli açamama), dil sorunları(nokta virgül vs), excellerin arka planda açık kalması vb bir çok soruna neden oluyor. Zaten Microsoft'ta excel'in bu şekilde kullanılmasını tavsiye etmiyor. Bir diğer sorun da bu şekilde excel üretmenin inanılmaz yavaş olması (hele ki 5000 satır üstü bir exceliniz varsa hiç kullanışlı olmuyor).

2. Yöntem: en çok kullanılan excel üretme yöntemi. MS Office Excel, bir çok formatta(standardı olan) hazırlanmış tablo yapılarını açabiliyor (html, xml, veya separatörle hazırlanmış csv vb yapıları). Bunun için döngü ile bir tablo yaratıp bunu response ile kullanıcıya verebilirsiniz. Hızlı çalışır. Tek sorunu oluşturulan dokuman excelde açıldığında bir uyarı veriyor ama çok da önemli bir eksiklik değil bence.

Hatta html tablo üretmenize bile gerek yok, asp.net'in hali hazırdaki datagrid, gridview vb yapılarını kullanmanız yeterli.

ÖR: Aşağıdaki fonksiyon, datatable(excel olarak vereceğiniz datayı sorguyla hazırlayın ve datatable doldurun)'ı bir datagrid'e bind edip, bu sayede üretilen html tabloyu ekrana yolluyor. 

    public void HtmlExcel(DataTable dt)
    {
        // dosya isimleri aynı olması diye.
        string DosyaAdi = Guid.NewGuid().ToString();
        
        HttpResponse response = HttpContext.Current.Response;
        response.Clear();
        response.ClearHeaders();
        response.ClearContent();
        response.Charset = Encoding.UTF8.WebName; //Unicode yaptık her dili desteklesin diye.
        response.AddHeader("content-disposition", "attachment; filename=" + DosyaAdi + ".xls"); //dosya uzantısı xls
        response.AddHeader("Content-Type", "application/Excel");
        response.ContentType = "application/vnd.xlsx";
        //response.AddHeader("Content-Length", file.Length.ToString());

        // string writer oluştur ve datagrid'in üreteceği html'i response ile yazdır.
        using (StringWriter sw = new StringWriter())
        {
            using (HtmlTextWriter htw = new HtmlTextWriter(sw)) //datatable'a aldığımız sorguyu bir datagrid'e atayıp html'e çevir.
            {
                // datagrid'e datatable'ı vermemiz yetiyor. Başlık ve data html olarak oluşturulmuş oluyor.
                DataGrid dg = new DataGrid();
                dg.DataSource = dt;
                dg.DataBind();
                dg.RenderControl(htw);
                response.Write(sw.ToString());
                dg.Dispose();
                dt.Dispose();
                response.End();
            }
        }
    }

3. Yöntem: OpenXML dll'ini kullanmak. İnternetten aratıp gerekli dll'i (EPPlus.dll) indirin ve projenize referans olarak ekleyin. Bu da alsında ikinci yöntemdekine benzer bir şekilde excel üretir(xml olarak). Ayrıca exceldeki bir çok fonksiyonu kullanabilirsiniz bu sayede.

public void OpenXMLExcel(DataTable dt, bool BaslikVarMi = true)

    {
        string DosyaAdi = Guid.NewGuid().ToString();

        using (ExcelPackage pck = new ExcelPackage())
        {
            //Create the worksheet
            ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Sheet1");

            //datatable'daki bilgileri excel sheetinin A1'inden itibaren yapıştır.
            ws.Cells["A1"].LoadFromDataTable(dt, true);           


            //Write it back to the client
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.AddHeader("content-disposition", "attachment;  filename=" + DosyaAdi + ".xlsx");
            Response.BinaryWrite(pck.GetAsByteArray());
        }
    }
Bu kadar basit. Tavsiyem 3. metodu kullanmanız. En basit haliyle paylaştım örneği. 3. Methot'da excel sutunları şekillendirilebiliyor, birden fazla sheet oluşturup dataset verebiliyor, exceldeki grafik vb özellikleri de kullanabiliyorsunuz. Fonksiyonu istediğiniz gibi geliştirmek sizin elinizde.