【问题标题】:Export not visible columns in a GridView to Excel将 GridView 中不可见的列导出到 Excel
【发布时间】:2014-04-28 18:45:28
【问题描述】:

我在一个 ASP.Net 网页(.Net 4.0,C#)中有一个 GridView,其中有一些不可见的列。但是,用户希望这些列显示在 Excel 导出中。我很困惑如何做到这一点。我尝试将其中一列设为BoundFieldTemplateField,其中包含标签:

<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 的代码。我已经做到了没有问题。您真的应该考虑设置要显示的列(而不是单元格)。我再次猜测,取决于您的代码如何使其可见
  • 已添加整个导出方法的代码。

标签: c# asp.net excel gridview


【解决方案1】:

在调用 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();
    }

【讨论】:

    【解决方案2】:

    我确定您正在加载数据以在页面加载或按钮单击事件时显示在 GridView 上。我建议将这些数据保存在缓存或内存中,然后使用像 EPPlus 这样的库来生成具有所需格式的 Excel 文件。 Here 是一篇介绍如何使用 EPPlus 的文章。

    Here 是关于 SO 的另一个问题,它讨论了使用 ashx 处理程序创建一个有用的 Excel 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多