I'm not sure if you have something that you are using ContentResult. But recently I used my own class, inheriting from FileResult, which helps to generate Excel export (sorry, comments in German):
public sealed class ExcelFileResult : FileResult
{
private DataTable dt;
private TableStyle tableStyle;
private TableItemStyle headerStyle;
private TableItemStyle itemStyle;
public string TitleExportDate { get; set; }
public string Title { get; set; }
public ExcelFileResult(DataTable dt)
: this(dt, null, null, null)
{ }
public ExcelFileResult(DataTable dt, TableStyle tableStyle, TableItemStyle headerStyle, TableItemStyle itemStyle)
: base("application/ms-excel")
{
this.dt = dt;
TitleExportDate = "Exportdatum: {0}";
this.tableStyle = tableStyle;
this.headerStyle = headerStyle;
this.itemStyle = itemStyle;
if (this.tableStyle == null)
{
this.tableStyle = new TableStyle();
this.tableStyle.BorderStyle = BorderStyle.Solid;
this.tableStyle.BorderColor = Color.Black;
this.tableStyle.BorderWidth = Unit.Parse("2px");
}
if (this.headerStyle == null)
{
this.headerStyle = new TableItemStyle();
this.headerStyle.BackColor = Color.LightGray;
}
}
protected override void WriteFile(HttpResponseBase response)
{
StringWriter sw = new StringWriter();
HtmlTextWriter tw = new HtmlTextWriter(sw);
if (tableStyle != null)
tableStyle.AddAttributesToRender(tw);
tw.RenderBeginTag(HtmlTextWriterTag.Table);
tw.RenderBeginTag(HtmlTextWriterTag.Tr);
tw.AddAttribute(HtmlTextWriterAttribute.Colspan, (dt.Columns.Count - 2).ToString());
tw.RenderBeginTag(HtmlTextWriterTag.Td);
tw.Write(Title);
tw.RenderEndTag();
tw.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
tw.RenderBeginTag(HtmlTextWriterTag.Td);
if (TitleExportDate != string.Empty)
tw.WriteLineNoTabs(string.Format(TitleExportDate, DateTime.Now.ToString("dd.MM.yyyy")));
tw.RenderEndTag();
tw.RenderBeginTag(HtmlTextWriterTag.Tr);
DataColumn col = null;
for (Int32 i = 0; i <= dt.Columns.Count - 1; i++)
{
col = dt.Columns[i];
if (headerStyle != null)
headerStyle.AddAttributesToRender(tw);
tw.RenderBeginTag(HtmlTextWriterTag.Th);
tw.RenderBeginTag(HtmlTextWriterTag.Strong);
tw.WriteLineNoTabs(col.ColumnName);
tw.RenderEndTag();
tw.RenderEndTag();
}
tw.RenderEndTag();
foreach (DataRow row in dt.Rows)
{
tw.RenderBeginTag(HtmlTextWriterTag.Tr);
for (Int32 i = 0; i <= dt.Columns.Count - 1; i++)
{
if (itemStyle != null)
itemStyle.AddAttributesToRender(tw);
tw.RenderBeginTag(HtmlTextWriterTag.Td);
tw.WriteLineNoTabs(HttpUtility.HtmlEncode(row[i]));
tw.RenderEndTag();
}
tw.RenderEndTag();
}
tw.RenderEndTag();
Stream outputStream = response.OutputStream;
byte[] byteArray = Encoding.Default.GetBytes(sw.ToString());
response.OutputStream.Write(byteArray, 0, byteArray.GetLength(0));
}
}
Then in your controller:
public ExcelFileResult ExportExcel()
{
ExcelFileResult actionResult = new ExcelFileResult(dt) { FileDownloadName = "yourFileName.xls" };
return actionResult;
}
source
share