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