ASP.NET:将GridView导出到Excel的正确方法,包括dynamic添加的行

我一直在试图实现一个简单的方法来导出GridViews到Excel工作表。 不过,现在我坚持了这一段时间:

我的GridView AutoGenerateColumns设置为true ,因为数据源是dynamic的,并不是真正可预测的(随着时间的推移而改变列数)。 它自动创build的HeaderRow不适合我,因此我也将ShowHeader设置为false并在OnRowCreated事件中创build自己的事件,如下所示:

 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和stuff)。 这一切都在网站上很好地工作,但是,当我尝试使用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做得很好),然后我读了一些表实际上可用于数据处理,在这种情况下是至关重要的。

编辑:我在OnRowDataBound而不是OnRowCreated添加两个HeaderRow后,循环帐户为他们,但是所有进入工作表的空白字段,它似乎也没有考虑到由gv.Rows.Count ,作为循环永远不会到我的表中的最后两行。

我试过debugging,实际上所有这些都是由gv.Rows[j].Cells[i].Text; 是一个"" ,即使单元格的Text属性设置了,并且表格在网站上显示OK。

我发现这种行为非常混乱,我想我错过了一些很大的东西。 有人可以告诉我为什么发生这种情况?

无论是自动生成还是其他方式都无关紧要。 诀窍就是把所有东西当作对象的一个​​对象和一个孩子来对待。 然后使用对象的属性(还有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。

希望这可以帮助。