导出到MVC3 ASP.net中的excel文件

时间:2011-09-14 13:34:47

标签: c# asp.net asp.net-mvc-3

我在Controller中有以下代码,并希望将其全部保存到excel文件中,但我无法让浏览器向我显示文件保存对话框。

public ContentResult Export(...) {
StringBuilder sb = new StringBuilder();
            sb.Append("<table border='" + "2px" + "'b>");
            //write column headings
            sb.Append("<tr>");
            foreach (System.Data.DataColumn dc in dt.Columns) {
                sb.Append("<td><b><font face=Arial size=2>" + dc.ColumnName + "</font></b></td>");
            }
            sb.Append("</tr>");

            //write table data
            foreach (System.Data.DataRow dr in dt.Rows) {
                sb.Append("<tr>");
                foreach (System.Data.DataColumn dc in dt.Columns) {
                    sb.Append("<td><font face=Arial size=" + "14px" + ">" + dr[dc].ToString() + "</font></td>");
                }
                sb.Append("</tr>");
            }
            sb.Append("</table>");

            this.Response.AddHeader("Content-Disposition", "Employees.xls");
            this.Response.ContentType = "application/vnd.ms-excel";
            return this.Content(sb.ToString());
}

提前多多感谢!

2 个答案:

答案 0 :(得分:3)

我不确定您使用ContentResult是否有任何关系。但是最近我使用了一个继承自FileResult的自己的类,这有助于生成Excel-Exports(抱歉,评论是德语):

/// <summary>
/// Generiert eine Excel-Datei
/// </summary>
public sealed class ExcelFileResult : FileResult
{
    private DataTable dt;
    private TableStyle tableStyle;
    private TableItemStyle headerStyle;
    private TableItemStyle itemStyle;

    /// <summary>
    /// Z.Bsp. "Exportdatum: {0}" (Standard-Initialisierung) - wenn leerer String, wird Exportdatum
    /// nicht angegeben.
    /// </summary>
    public string TitleExportDate { get; set; }
    /// <summary>
    /// Titel des Exports, wird im Sheet oben links ausgegeben
    /// </summary>
    public string Title { get; set; }


    /// <summary>
    /// Konstruktor
    /// </summary>
    /// <param name="dt">Die zu exportierende DataTable</param>
    public ExcelFileResult(DataTable dt)
        : this(dt, null, null, null)
    { }

    /// <summary>
    /// Konstruktor
    /// </summary>
    /// <param name="dt">Die zu exportierende DataTable</param>
    /// <param name="tableStyle">Styling für gesamgte Tabelle</param>
    /// <param name="headerStyle">Styling für Kopfzeile</param>
    /// <param name="itemStyle">Styling für die einzelnen Zellen</param>
    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;

        // provide defaults
        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)
    {
        // Create HtmlTextWriter
        StringWriter sw = new StringWriter();
        HtmlTextWriter tw = new HtmlTextWriter(sw);

        // Build HTML Table from Items
        if (tableStyle != null)
            tableStyle.AddAttributesToRender(tw);
        tw.RenderBeginTag(HtmlTextWriterTag.Table);

        // Create Title Row
        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();

        // Create Header Row
        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();

        // Create Data Rows
        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(); //  /tr
        }

        tw.RenderEndTag(); //  /table

        // Write result to output-stream
        Stream outputStream = response.OutputStream;
        byte[] byteArray = Encoding.Default.GetBytes(sw.ToString());
        response.OutputStream.Write(byteArray, 0, byteArray.GetLength(0));
    }
}

然后在你的控制器中:

    /// <summary>
    /// Excel-Export
    /// </summary>
    public ExcelFileResult ExportExcel()
    {
        // DataTable dt = -- > get your data
        ExcelFileResult actionResult = new ExcelFileResult(dt) { FileDownloadName = "yourFileName.xls" };
        return actionResult;
    }

答案 1 :(得分:3)

试试这个:

public ActionResult Export(...) {
        StringBuilder sb = new StringBuilder();
        sb.Append("<table border='" + "2px" + "'b>");
        //write column headings
        sb.Append("<tr>");
        foreach (System.Data.DataColumn dc in dt.Columns) {
            sb.Append("<td><b><font face=Arial size=2>" + dc.ColumnName + "</font></b></td>");
        }
        sb.Append("</tr>");

        //write table data
        foreach (System.Data.DataRow dr in dt.Rows) {
            sb.Append("<tr>");
            foreach (System.Data.DataColumn dc in dt.Columns) {
                sb.Append("<td><font face=Arial size=" + "14px" + ">" + dr[dc].ToString() + "</font></td>");
            }
            sb.Append("</tr>");
        }
        sb.Append("</table>");

        this.Response.AddHeader("Content-Disposition", "Employees.xls");
        this.Response.ContentType = "application/vnd.ms-excel";
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
            return File(buffer, "application/vnd.ms-excel");
}