【发布时间】:2014-04-28 18:45:28
【问题描述】:
我在一个 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 中。我确定我正在处理正确的列,因为我已经通过调试器运行它并检查了单元格的 Text 属性;它们与该列的网页上显示的内容相匹配。奇怪的是,在调试器中,单元格的 Visible 属性甚至在我将其更改为 true 之前就显示为 true。我做错了什么?
【问题讨论】:
-
您没有提供任何关于如何导出到 Excel 的解释。此答案取决于此,请通过更新问题提供代码。您可能还认为,大多数时候您应该直接导出底层数据,而不是导出 GridView。
-
显示您用于导出到 excel 的代码。我已经做到了没有问题。您真的应该考虑设置要显示的列(而不是单元格)。我再次猜测,取决于您的代码如何使其可见
-
已添加整个导出方法的代码。