将GridView中不可见的列导出到Excel

我有一个ASP.Net网页(。NET 4.0,C#)有一些不可见的列的GridView 。 但是,用户希望这些列显示在Excel导出中。 我很难理解如何做到这一点。 我试着做一个BoundField和一个带有标签的TemplateField

 <asp:TemplateField HeaderText="Device Comments" SortExpression="DeviceComments" Visible="false"> <ItemTemplate> <asp:Label runat="server" Text='<%# Eval("DeviceComments") %>' ID="lbDeviceComments" /> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="DeviceComments" HeaderText="Device Comments" SortExpression="DeviceComments" Visible="false" /> 

按预期,这些列不会显示在网页上。 但是,当我尝试在导出到Excel的方法中使列可见时,它们保持不可见状态。 我试过了:

 protected void Export2Excel(object sender, EventArgs e) { Response.ClearContent(); Response.AppendHeader("content-disposition", "attachment; filename=Mobile.xls"); Response.ContentType = "application/excel"; StringWriter stringWriter = new StringWriter(); HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter); GridView currentGridView = new GridView(); switch (DeviceType()) { case "cell": currentGridView = gvCellResults; break; case "loaner": currentGridView = gvCellResults; break; case "wireless": currentGridView = gvCellResults; break; case "smartphone": currentGridView = gvSmartPhoneResults; break; } foreach (GridViewRow gridViewRow in currentGridView.Rows) { gridViewRow.ForeColor = Color.Black; HyperLink phonenumber = new HyperLink(); HyperLink imei = new HyperLink(); HyperLink employee = new HyperLink(); foreach (TableCell gridViewRowTableCell in gridViewRow.Cells) { phonenumber = (HyperLink)gridViewRowTableCell.FindControl("hrefPhoneNumber"); imei = (HyperLink)gridViewRow.Cells[1].FindControl("hrefIMEI"); employee = (HyperLink)gridViewRow.Cells[6].FindControl("hrefEmpName"); gridViewRowTableCell.Style["forecolor"] = "#000000"; } gridViewRow.Cells[11].Visible = true; gridViewRow.Cells[11].Style["display"] = "inline"; if (gridViewRow.RowType == DataControlRowType.DataRow) { for (int columnIndex = 0; columnIndex < gridViewRow.Cells.Count; columnIndex++) { gridViewRow.Cells[columnIndex].Attributes.Add("class", "text"); gridViewRow.Cells[columnIndex].Text = gridViewRow.Cells[columnIndex].Text.StripTags(); } if (phonenumber != null) gridViewRow.Cells[0].Text = phonenumber.Text; if (imei != null) gridViewRow.Cells[1].Text = imei.Text; if (employee != null) gridViewRow.Cells[6].Text = employee.Text; } } currentGridView.RenderControl(htmlTextWriter); string style = @"<style> .text { mso-number-format:\@; } </style> "; Response.Write(style); Response.Write(stringWriter.ToString()); Response.End(); } 

但是列不出现在Excel中。 我确定我正在处理正确的列,因为我已经通过debugging器运行了它,并检查了单元格的Text属性; 它们匹配该列的网页上显示的内容。 奇怪的是,在debugging器中,即使在我将其更改为true之前,单元格的Visible属性也显示为true。 我究竟做错了什么?

尝试在调用Response.ClearContent();之前使列可见Response.ClearContent(); 在我的情况下,它的工作。

就像是

 protected void Export2Excel(object sender, EventArgs e) { gridViewRow.Cells[11].Visible = true; gridViewRow.Cells[11].Style["display"] = "inline"; Response.ClearContent(); Response.AppendHeader("content-disposition", "attachment; filename=Mobile.xls"); Response.ContentType = "application/excel"; StringWriter stringWriter = new StringWriter(); HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter); GridView currentGridView = new GridView(); switch (DeviceType()) { case "cell": currentGridView = gvCellResults; break; case "loaner": currentGridView = gvCellResults; break; case "wireless": currentGridView = gvCellResults; break; case "smartphone": currentGridView = gvSmartPhoneResults; break; } foreach (GridViewRow gridViewRow in currentGridView.Rows) { gridViewRow.ForeColor = Color.Black; HyperLink phonenumber = new HyperLink(); HyperLink imei = new HyperLink(); HyperLink employee = new HyperLink(); foreach (TableCell gridViewRowTableCell in gridViewRow.Cells) { phonenumber = (HyperLink)gridViewRowTableCell.FindControl("hrefPhoneNumber"); imei = (HyperLink)gridViewRow.Cells[1].FindControl("hrefIMEI"); employee = (HyperLink)gridViewRow.Cells[6].FindControl("hrefEmpName"); gridViewRowTableCell.Style["forecolor"] = "#000000"; } if (gridViewRow.RowType == DataControlRowType.DataRow) { for (int columnIndex = 0; columnIndex < gridViewRow.Cells.Count; columnIndex++) { gridViewRow.Cells[columnIndex].Attributes.Add("class", "text"); gridViewRow.Cells[columnIndex].Text = gridViewRow.Cells[columnIndex].Text.StripTags(); } if (phonenumber != null) gridViewRow.Cells[0].Text = phonenumber.Text; if (imei != null) gridViewRow.Cells[1].Text = imei.Text; if (employee != null) gridViewRow.Cells[6].Text = employee.Text; } } currentGridView.RenderControl(htmlTextWriter); string style = @"<style> .text { mso-number-format:\@; } </style> "; Response.Write(style); Response.Write(stringWriter.ToString()); Response.End(); } 

我确定你正在加载数据以在页面加载时显示在GridView上,或者是一个button点击事件。 我build议将这些数据保存在caching或内存中,然后使用像EPPlus这样的库来生成所需格式的Excel文件。 这里有一篇文章展示了如何使用EPPlus。

这是另外一个关于如何使用ashx处理程序来创buildExcel文件的问题。