MVC导出Excel,提供下载Excel

image

类1:

using System.Collections.Generic;
using System.Data;
using System.Web.Mvc;
using System.IO;
using System.Web.UI.WebControls;
using System.Web;
using System.Web.UI;
using System.Drawing;

namespace Base.ActionResult
{
    public class ExcelResult : System.Web.Mvc.ActionResult
    {
        private DataTable _dataContext;
        private string _fileName;
        private string[] _headers = null;
        private TableStyle _tableStyle;
        private TableItemStyle _headerStyle;
        private TableItemStyle _itemStyle;

        public string FileName
        {
            get { return _fileName; }
        }

        public ExcelResult(DataTable dataContext, string fileName)
            : this(dataContext, fileName, null, null, null, null)
        {
        }

        public ExcelResult(DataTable dataContext, string fileName, string[] headers)
            : this(dataContext, fileName, headers, null, null, null)
        {
        }

        public ExcelResult(DataTable dataContext, string fileName, string[] headers, TableStyle tableStyle, TableItemStyle headerStyle, TableItemStyle itemStyle)
        {
            _dataContext = dataContext;
            _fileName = fileName;
            _headers = headers;
            _tableStyle = tableStyle;
            _headerStyle = headerStyle;
            _itemStyle = itemStyle;

            // provide defaults
            if (_tableStyle == null)
            {
                _tableStyle = new TableStyle();
                _tableStyle.BorderStyle = BorderStyle.Solid;
                _tableStyle.BorderColor = Color.Black;
                _tableStyle.BorderWidth = Unit.Parse("2px");
            }

            if (_headerStyle == null)
            {
                _headerStyle = new TableItemStyle();
                _headerStyle.BackColor = Color.LightGray;
            }
        }

        public override void ExecuteResult(ControllerContext context)
        {
            // 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);

            // Generate headers from table
            if (_headers == null)
            {
                List<string> lst = new List<string>();
                for (int i = 0; i < _dataContext.Columns.Count; i++)
                {
                    lst.Add(_dataContext.Columns[i].ColumnName);
                }
                _headers = lst.ToArray();
            }

            // Create Header Row
            tw.RenderBeginTag(HtmlTextWriterTag.Thead);

            foreach (string header in _headers)
            {
                if (_headerStyle != null)
                    _headerStyle.AddAttributesToRender(tw);

                tw.RenderBeginTag(HtmlTextWriterTag.Th);
                tw.Write(header);
                tw.RenderEndTag();
            }

            tw.RenderEndTag();

            // Create Data Rows
            tw.RenderBeginTag(HtmlTextWriterTag.Tbody);

            foreach (DataRow dr in _dataContext.Rows)
            {
                tw.RenderBeginTag(HtmlTextWriterTag.Tr);

                foreach (string header in _headers)
                {
                    string strValue = dr[header].ToString();
                    strValue = ReplaceSpecialCharacters(strValue);

                    if (_itemStyle != null)
                        _itemStyle.AddAttributesToRender(tw);

                    tw.RenderBeginTag(HtmlTextWriterTag.Td);
                    tw.Write(HttpUtility.HtmlEncode(strValue));
                    tw.RenderEndTag();
                }

                tw.RenderEndTag();
            }

            tw.RenderEndTag(); // tbody
            tw.RenderEndTag(); // table
            WriteFile(_fileName, "application/ms-excel", sw.ToString());
        }

        private static string ReplaceSpecialCharacters(string value)
        {
            value = value.Replace("’", "'");
            value = value.Replace("“", """);
            value = value.Replace("”", """);
            value = value.Replace("–", "-");
            value = value.Replace("…", "...");
            return value;
        }

        private static void WriteFile(string fileName, string contentType, string content)
        {
            HttpContext context = HttpContext.Current;
            context.Response.Clear();
            context.Response.AddHeader("content-disposition", "attachment;filename=" + fileName);
            context.Response.Charset = "";
            context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            context.Response.ContentType = contentType;
            context.Response.Write(content);
            context.Response.End();
        }
    }

    public static class ExcelControllerExtensions
    {
        public static System.Web.Mvc.ActionResult Excel(this Controller controller,
         DataTable dataContext, string fileName)
        {
            return new ExcelResult(dataContext, fileName, null, null, null, null);
        }

        public static System.Web.Mvc.ActionResult Excel(this Controller controller,
       DataTable dataContext, string fileName, string[] headers)
        {
            return new ExcelResult(dataContext, fileName, headers, null, null, null);
        }

        public static System.Web.Mvc.ActionResult Excel(this Controller controller,
       DataTable dataContext, string fileName, string[] headers,
     TableStyle tableStyle, TableItemStyle headerStyle, TableItemStyle itemStyle)
        {
            return new ExcelResult(dataContext, fileName, headers, tableStyle, headerStyle, itemStyle);
        }
    }
}

//public ActionResult GenerateExcel1()
//{
//   return this.Excel(dt,  "data.xls");
//}

控制器方法:

public ActionResult ExportExcel(string param1, string startTime, string endTime)
     { 
         DateTime start = Convert.ToDateTime(startTime);
         DateTime end = Convert.ToDateTime(endTime);

         DataTable dt = _srv.ExportExcel(param1,start, end);
         return this.Excel(dt, "统计111.xls");
     }

js:

点击 “导出”按钮,执行下面的js:


var param = "startTime=" + startTime + "&endTime=" + endTime
          + "&param1=" + param1;

window.open("/Query/ExportExcel?" + param);

原文地址:https://www.cnblogs.com/jx270/p/4410263.html