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。
希望这可以帮助。