Asp.Net Mvc Excel Export | C#

Merhaba, genelde ekranda görüntülenen bir listeyi excel olarak da indirmek ister kullanıcılar. Bununla ilgili aşağıdaki yöntemi kullanıyorum.

        public FileContentResult FaturaListesiExcel(string musteriNo)
        {
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(GetirFaturalarExcel(musteriNo));
            ExcelResponseAyarla(this.Response, "_FaturaListesi.xls");
            return new FileContentResult(buffer, this.Response.ContentType);
        }
		
        public string GetirFaturalarExcel(string musteriNo)
        {
            List<Fatura> lst = GetirMusteriFaturalar(musteriNo);
            return List2Excel((IEnumerable<Fatura>)lst, new List<string>() { "Id" });
        }
		
        public static string List2Excel<T>(IEnumerable<T> liste, List<string> excelHariciKolonlar)
        {
            Dictionary<string, string> dictBaslikKarsiliklar = getirBaslikKarsilik(); // Eger tabloda kullandiginiz isimle ayni isimde olmasini istemiyorsak...
            string sonucHtml = "";
            using (StringWriter sw = new StringWriter())
            {
                using (HtmlTextWriter htw = new HtmlTextWriter(sw))
                {
                    Table table = new Table();
                    TableRow row = new TableRow();
                    IList<PropertyInfo> properties = typeof(T).GetProperties().ToList();
                    foreach (PropertyInfo prop in properties)
                    {
                        if (!excelHariciKolonlar.Contains(prop.Name))
                        {
                            string baslik = "";
                            if (dictBaslikKarsiliklar.TryGetValue(prop.Name, out baslik) == false)
                            {
                                baslik = prop.Name;
                            }
                            TableHeaderCell hcell = new TableHeaderCell();
                            hcell.Text = baslik;
                            hcell.BackColor = Color.Yellow;
                            row.Cells.Add(hcell);
                        }
                    }
                    table.Rows.Add(row);

                    foreach (T item in liste)
                    {
                        row = new TableRow();
                        foreach (PropertyInfo prop in properties)
                        {
                            if (!excelHariciKolonlar.Contains(prop.Name))
                            {
                                TableCell cell = new TableCell();
                                cell.Text = "<span>&nbsp;</span>" + Convert.ToString(prop.GetValue(item)); // Excel sayilara bazen tarih muamelesi yapiyor. Onun icin onune bir bosluk ekledim...
                                row.Cells.Add(cell);
                            }
                        }
                        table.Rows.Add(row);
                    }
                    table.RenderControl(htw);
                    sonucHtml = sw.ToString();
                }
            }
            return sonucHtml;
        }
		
        private static Dictionary<string, string> getirBaslikKarsilik()
        {
            Dictionary<string, string> dictBaslikKarsiliklar = new Dictionary<string, string>();
            dictBaslikKarsiliklar.Add("MusteriNo", "Müşteri No");

            return dictBaslikKarsiliklar;
        }
		
        public static void ExcelResponseAyarla(HttpResponseBase response, string dosyaAdi)
        {
            response.AddHeader("content-disposition", "attachment; filename=" + StrTarihGetir() + dosyaAdi);
            response.ContentType = "application/vnd.ms-excel";
            response.ContentEncoding = Encoding.UTF8;
            response.BinaryWrite(Encoding.UTF8.GetPreamble()); // Turkce karakter sorunu icin mutlaka olmasi lazim...
            response.Cache.SetCacheability(HttpCacheability.NoCache);
        }
		
	public static string StrTarihGetir()
        {
            return DateTime.Now.Year.ToString("0000") + DateTime.Now.Month.ToString("00") + DateTime.Now.Day.ToString("00") + "_" + DateTime.Now.Hour.ToString("00") + DateTime.Now.Minute.ToString("00") + DateTime.Now.Second.ToString("00");
        }

Selamlar.

Leave a Reply

Your email address will not be published. Required fields are marked *