【问题标题】:Export to excel file in MVC3 ASP.net在 MVC3 ASP.net 中导出到 excel 文件
【发布时间】:2011-09-14 13:34:46
【问题描述】:

我在控制器中有以下代码,想将其全部保存到 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());
}

提前非常感谢!

【问题讨论】:

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


    【解决方案1】:

    试试这个:

    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");
    }
    

    【讨论】:

    • 请尝试添加这个 HttpContext.Response.AddHeader("content-disposition", "attachment; filename=Employees.xls");
    • 如何从视图中调用操作以及结果如何?
    • 我正在使用具有以下内容的 HTML 自定义助手:
    【解决方案2】:

    我不确定您使用ContentResult 是否与此有关。但最近我使用了一个继承自 FileResult 的自己的类,它有助于生成 Excel-Exports(对不起,cmets 是德语):

    /// <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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多