C#通过gridview导出excel

  [CustomAuthorize]
        public FileResult ExportQuestionCenterExcel(SearchBaseQuestion search)
        {
            List<EXPORT_BASE_QUESTION> exportBaseQuestionList = new List<EXPORT_BASE_QUESTION>();

            try
            {
                search.PageSize = Int32.MaxValue;
                search.Status = DeleteMarkEnum.Active;
                search.isAnswer = IsAnswerEnum.Total;
                search.isReview = IsReviewEnum.Total;
                search.AddOrderBy("MODIFYDATE", SearchOrderType.Desc);
                
                if (search.SOURCE == "0")
                    search.SOURCE = "";
                if (search.MODULE == "0")
                    search.MODULE = "";
                if (search.QUESTIONTYPE == "0")
                    search.QUESTIONTYPE = "";
                if (search.QSTATUS == "0")
                    search.QSTATUS = "";
                if (search.ADMINID == "0")
                    search.ADMINID = "";
                if (!string.IsNullOrEmpty(search.IsSaleQuestion) && search.IsSaleQuestion == "1")
                    search.CUSTOMERMANAGERIDs = GetInPermissionCustomerMannagerIDs();
                 
                IList<BASE_QUESTION> baseQuestionList = questionManager.SearchQuestionList(search);

                IList<BASE_CHOICECUSTOMERMANAGER> managerList = customerManagerService.GetChoiceCusManageList();
                SearchChoiceCusManager search_msg = new SearchChoiceCusManager();
                search_msg.SearchType = SearchTypeEnum.Total;
                search_msg.Status = DeleteMarkEnum.Active;
                search_msg.parentIdMany = "samedatakefu";
                IList<BASE_CHOICECUSTOMERMANAGER> choiceManagerList = choiceCusManagerManager.Search(search_msg);

                foreach (var baseQuestion in baseQuestionList)
                {
                    //获取受理人
                    string ADMINID_Str = "";
                    if (choiceManagerList != null && choiceManagerList.Count > 0)
                    {
                        BASE_CHOICECUSTOMERMANAGER em = choiceManagerList.Where(m => m.USERID == baseQuestion.ADMINID).FirstOrDefault();
                        if (em != null)
                        {
                            ADMINID_Str = em.NAME;
                        }
                    }
                    BASE_CHOICECUSTOMERMANAGER manager = managerList.FirstOrDefault(t => t.ID == baseQuestion.CUSTOMERMANAGERID);

                    string strSource = string.Empty;
                    switch (baseQuestion.SOURCE)
                    {
                        case 1:
                            strSource = "QQ";
                            break;
                        case 2:
                            strSource = "Email";
                            break;
                        case 3:
                            strSource = "Online";
                            break;
                        case 4:
                            strSource = "Sales";
                            break;
                        case 5:
                            strSource = "用户直通车";
                            break;
                        case 6:
                            strSource = "需求直通车";
                            break;
                        case 7:
                            strSource = "回访";
                            break;
                        case 8:
                            strSource = "QQ群";
                            break;
                        case 9:
                            strSource = "社区";
                            break;
                        case 10:
                            strSource = "微信群";
                            break;
                        default:
                            strSource = "全部";
                            break;
                    }

                    exportBaseQuestionList.Add(new EXPORT_BASE_QUESTION() {
                        TITLE = baseQuestion.TITLE == null ? StringConst.NAConst : baseQuestion.TITLE.Count() < 10 ? baseQuestion.TITLE : baseQuestion.TITLE.Substring(0, 10) + "..",
                        MODULE = string.IsNullOrEmpty(baseQuestion.MODULE) ? "" : packageTreeCopy.GetOneById(baseQuestion.MODULE) == null ? "" : packageTreeCopy.GetOneById(baseQuestion.MODULE).FULLNAME,
                        strQUESTIONTYPE = AttributesUtils.GetEnumDescription<QuestionCenterTypeEnum>(baseQuestion.QUESTIONTYPE),
                        USERNAME = baseQuestion.USERNAME,
                        REALNAME = baseQuestion.REALNAME,
                        SOURCE = strSource,
                        ADMINID_Str = ADMINID_Str,
                        strSTATUS = AttributesUtils.GetEnumDescription<QuestionCenterStatusEnum>(baseQuestion.STATUS),
                        JIRAPATH = string.IsNullOrEmpty(baseQuestion.JIRAPATH) ? "" : "<a href='" + JiraIP + baseQuestion.JIRAPATH.Trim() + "' target='blank'>" + baseQuestion.JIRAPATH.Trim() + "</a>",
                        JIRASTATUSName = AttributesUtils.GetEnumDescription<QuestionJiraStatusEnum>(baseQuestion.JIRASTATUS),
                        MODIFYDATE = baseQuestion.MODIFYDATE,
                        KEYWORD = baseQuestion.KEYWORD,
                        customerManagerName = manager == null ? "N/A" : manager.NAME,
                        CREATEDATE = baseQuestion.CREATEDATE,
                        OVERDUETYPE = AttributesUtils.GetEnumDescription<CrmAccountBuyType>(baseQuestion.OVERDUETYPE),
                    });
                }
            }
            catch (Exception ex)
            {
                LogHelper.Instance.Error("ExportQuestionCenterExcel error:", ex);
            }

            GridView gvExport = new GridView();
            gvExport.DataSource = exportBaseQuestionList;
            gvExport.AllowPaging = false;
            gvExport.RowDataBound += new System.Web.UI.WebControls.GridViewRowEventHandler(dgExport_RowDataBound);
            gvExport.DataBind();

            TableCell[] header = GetTableHeader();
            if (gvExport.HeaderRow != null)
            {
                gvExport.HeaderRow.Cells.AddRange(header);
                GridViewRow row = gvExport.HeaderRow;
                if (row != null)
                {
                    row.Cells[0].Visible = false;
                    row.Cells[1].Visible = false;
                    row.Cells[2].Visible = false;
                    row.Cells[3].Visible = false;
                    row.Cells[4].Visible = false;
                    row.Cells[5].Visible = false;
                    row.Cells[6].Visible = false;
                    row.Cells[7].Visible = false;
                    row.Cells[8].Visible = false;
                    row.Cells[9].Visible = false;
                    row.Cells[10].Visible = false;
                    row.Cells[11].Visible = false;
                    row.Cells[12].Visible = false;
                    row.Cells[13].Visible = false;
                    row.Cells[14].Visible = false;
                }
            }

            StringWriter strWriter = new StringWriter();
            HtmlTextWriter htmlWriter = new HtmlTextWriter(strWriter);
            if (exportBaseQuestionList.Count > 0)
            {
                gvExport.RenderControl(htmlWriter);
            }
            else
            {
                strWriter.WriteLine("没有数据!");
            }

            byte[] fileContents = Encoding.GetEncoding("gb2312").GetBytes("<html><head><meta http-equiv=Content-Type content="text/html; charset=gb2312">" + strWriter.ToString() + "</body></html>");
            return File(fileContents, "application/vnd.ms-excel", string.Format("{0}.xls", "问题中心" + DateTime.Now.Date.ToString("yyyyMMdd")));
        }

        protected static void dgExport_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                e.Row.Cells[6].Text = HtmlDecode(e.Row.Cells[6].Text);
                
                //创建时间
                e.Row.Cells[9].Text = e.Row.Cells[9].Text == "&nbsp;" ? "" : (string.IsNullOrEmpty(e.Row.Cells[9].Text) ? "" : Convert.ToDateTime(e.Row.Cells[9].Text).ToString("yyyy-MM-dd HH:mm:ss"));
                //最后处理时间
                e.Row.Cells[10].Text = e.Row.Cells[10].Text == "&nbsp;" ? "" : (string.IsNullOrEmpty(e.Row.Cells[10].Text) ? "" : Convert.ToDateTime(e.Row.Cells[10].Text).ToString("yyyy-MM-dd HH:mm:ss"));

                if (e.Row.Cells[9].Text == "0001-01-01")
                {
                    e.Row.Cells[9].Text = "";
                }

                if (e.Row.Cells[10].Text == "0001-01-01")
                {
                    e.Row.Cells[10].Text = "";
                }

                e.Row.Cells[13].Attributes.Add("style", "vnd.ms-excel.numberformat:@");
            }
        }

        private TableCell[] GetTableHeader()
        {
            TableCell[] header = new TableCell[15];
            for (int i = 0; i < header.Length; i++)
            {
                header[i] = new TableHeaderCell();
            }

            header[0].Text = "标题";
            header[1].Text = "来源";
            header[2].Text = "模块";
            header[3].Text = "类型";
            header[4].Text = "账号";
            header[5].Text = "真实姓名";
            header[6].Text = "JIRA地址";
            header[7].Text = "JIRA状态";
            header[8].Text = "账号的状态";
            header[9].Text = "创建时间";
            header[10].Text = "最后处理时间";
            header[11].Text = "受理人";
            header[12].Text = "状态";
            header[13].Text = "标签";
            header[14].Text = "客户经理</th>";

            return header;
        }

    }

也可以跨列

   header[0].ColumnSpan = 9;
            header[0].Text = "业务信息";

            header[1].ColumnSpan = 6;
            header[1].Text = "购买信息";

            header[2].ColumnSpan = 5;
            header[2].Text = "查账信息";

            header[3].ColumnSpan = 7;
            header[3].Text = "开票信息";

            header[4].ColumnSpan = 6;
            header[4].Text = "状态</th></tr><tr>";

            //第二行
            header[5].Text = "订单号";

原文地址:https://www.cnblogs.com/sojastudio/p/6646046.html