【问题标题】:ASP.NET: Proper way of exporting GridView to Excel including dynamically added rowsASP.NET:将 GridView 导出到 Excel 的正确方法,包括动态添加的行
【发布时间】:2016-12-11 20:15:39
【问题描述】:

我一直在尝试实现一种将 GridView 导出到 Excel 工作表的简单方法。但是,我已经坚持了很长一段时间了:

我的GridView 已将AutoGenerateColumns 设置为true,因为数据源是动态的并且不是真正可预测的(随时间变化的列数)。它自动创建的HeaderRow 不适合我,因此我还将ShowHeader 设置为false 并在OnRowCreated 事件中创建了自己的,如下所示:

if (e.Row.RowType == DataControlRowType.Header) {

        gv.Controls[0].Controls.AddAt(0, GetHeader());
        gv.Controls[0].Controls.AddAt(1, GetSubHeader());


}

其中GetHeader()GetSubHeader() 都返回GridViewRow(标题中有两行使用不同的colspans、rowspans 和东西)。这一切都在网站上运行良好,但是,当我尝试像这样使用 OpenXML 导出 GridView 时:

    ExcelPackage excel = new ExcelPackage();
    var workSheet = excel.Workbook.Worksheets.Add("List 1");
    var totalCols = gv.Rows[0].Cells.Count;
    var totalRows = gv.Rows.Count;
    var headerRow = gv.HeaderRow;

    for (int i = 0; i < totalCols; i++) {

        workSheet.Cells[1,i+1].Value = headerRow.Cells[i].Text;

    }

    for (int i = 0; i < totalCols; i++) {

        for (int j = 0; j < totalRows; j++) {

            workSheet.Cells[j+2,i+1].Value = gv.Rows[j].Cells[i].Text;

        }

    }

    return excel;

我得到的是一个隐藏了原始 HeaderRow 的表 - 我认为我应该显然跳过第一个周期 - 然后是包含实际数据的行。我在OnRowCreated 中添加的两行没有任何痕迹。

谁能解释一下为什么会发生这种情况以及我如何解决这个问题?理想情况下,该方法应始终导出网站上显示的整个 GridView。

注意:使用 HtmlTextWriter 和 GridView.RenderControl() 的另一种方式可能不是一个选项,因为下载后我什至无法在 Excel 中打开文件(尽管 OpenOffice 做得很好),然后我在某处读到表格不是t 实际上可用于数据处理,这在这种情况下至关重要。

编辑:在我在 OnRowDataBound 而不是 OnRowCreated 中添加了两个 HeaderRows 之后,循环说明了它们,但是进入工作表的所有内容都是空白字段,而且似乎它们也没有被考虑在内帐户gv.Rows.Count,因为循环永远不会到达我表中的最后两行。

我尝试调试,实际上gv.Rows[j].Cells[i].Text; 返回的所有内容都是"",即使单元格设置了Text 属性并且表格在网站上显示正常。

我发现这种行为非常令人困惑,我想我错过了一些重要的东西。谁能告诉我为什么会这样?

【问题讨论】:

    标签: c# asp.net excel gridview export


    【解决方案1】:

    不管它是自动生成的还是其他的。诀窍是将所有事物都视为对象和对象的子对象。然后使用对象的属性(以及 Excel 的),您可以在 gridview 中对数据进行操作。

    查看下面的示例代码

    protected void ExportToExcel(object sender, EventArgs e)
    {
        Response.Clear();
        Response.Buffer = true;
        Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.xls");
        Response.Charset = "";
        Response.ContentType = "application/vnd.ms-excel";
        using (StringWriter sw = new StringWriter())
        {
            HtmlTextWriter hw = new HtmlTextWriter(sw);
            //To Export all pages
            GridView1.AllowPaging = false;
            this.BindGrid();
            GridView1.HeaderRow.BackColor = Color.White;
            foreach (TableCell cell in GridView1.HeaderRow.Cells)
            {
                cell.BackColor = GridView1.HeaderStyle.BackColor;
            }
            foreach (GridViewRow row in GridView1.Rows)
            {
                row.BackColor = Color.White;
                foreach (TableCell cell in row.Cells)
                {
                    if (row.RowIndex % 2 == 0)
                    {
                        cell.BackColor = GridView1.AlternatingRowStyle.BackColor;
                    }
                    else
                    {
                        cell.BackColor = GridView1.RowStyle.BackColor;
                    }
                    cell.CssClass = "textmode";
                }
            }
            GridView1.RenderControl(hw);
            //style to format numbers to string
            string style = @"<style> .textmode { } </style>";
            Response.Write(style);
            Response.Output.Write(sw.ToString());
            Response.Flush();
            Response.End();
        }
    }
    

    这只是其中一种方法。

    还有许多其他示例。只需谷歌 Gridview 到 Excel。

    希望这会有所帮助。

    【讨论】:

    • 谢谢,但正如我上面提到的,这不起作用,因为 Excel 拒绝打开下载的文件。 OpenOffice 可以毫无问题地打开它,这让我很困惑 o_o。
    • 我从您的代码中看到您正在使用 ExcelPackage 类。如果您的代码有效,请尝试使用 Excel 类。正如我所说,我的回答只是一种方法。还有很多其他的例子。只需搜索即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2015-03-29
    • 2015-12-06
    • 1970-01-01
    相关资源
    最近更新 更多