导出嵌套的Gridview到Excel错误

我需要使用以下代码将嵌套的Gridview导出到Excel中,但是当我单击“导出”button时,它引发了一个错误:

mscorlib.dll中发生types“System.ArgumentOutOfRangeException”的exception,但未在用户代码中处理

这是代码:

protected void ExportExcel(object sender, EventArgs e) { DataTable dt = new DataTable("GridView_Data"); GridView grvPayrollDetails = (GridView)grvPayroll.Rows[1].FindControl("grvPayrollDetails"); foreach (TableCell cell in grvPayroll.HeaderRow.Cells) { dt.Columns.Add(cell.Text); } foreach (TableCell cell in grvPayrollDetails.HeaderRow.Cells) { dt.Columns.Add(cell.Text); } dt.Columns.RemoveAt(0); foreach (GridViewRow row in grvPayroll.Rows) { GridView grvPayrollDetailscell = (row.FindControl("grvPayrollDetails") as GridView); for (int j = 0; j < grvPayrollDetailscell.Rows.Count; j++) { dt.Rows.Add(row.Cells[1].Text, row.Cells[2].Text, grvPayrollDetailscell.Rows[j].Cells[0].Text, grvPayrollDetailscell.Rows[j].Cells[1].Text); } } using (XLWorkbook wb = new XLWorkbook()) { wb.Worksheets.Add(dt); Response.Clear(); Response.Buffer = true; Response.Charset = ""; Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.AddHeader("content-disposition", "attachment;filename=grvPayrollDetails.xlsx"); using (MemoryStream MyMemoryStream = new MemoryStream()) { wb.SaveAs(MyMemoryStream); MyMemoryStream.WriteTo(Response.OutputStream); Response.Flush(); Response.End(); } } } 

grvPayroll是主Gridview和Gridview grvPayrollDetails是嵌套的子Gridview。 请帮忙! 我遵循本指南: 在ASP.Net中将嵌套的GridView(GridView内部的GridView)导出到Excel中

这是嵌套的GridView: 嵌套的GridView

尝试这个:

 public override void VerifyRenderingInServerForm(Control control) { /* Confirms that an HtmlForm control is rendered for the specified ASP.NET server control at run time. */ } protected void ExportExcel(object sender, EventArgs e) { grvPayroll.AllowPaging = false; var grvPayrollDetails = new GridView(); for (var i = 0; i < grvPayroll.Rows.Count; i++) { grvPayrollDetails = (GridView)grvPayroll.Rows[i].FindControl("grvPayrollDetails"); grvPayrollDetails.AllowPaging = false; BindGrid(SortField); } Response.Clear(); Response.Buffer = true; Response.AddHeader("content-disposition", "attachment;filename=PayrollExport.xls"); Response.Charset = ""; Response.ContentType = "application/vnd.ms-excel"; using (StringWriter sw = new StringWriter()) { HtmlTextWriter hw = new HtmlTextWriter(sw); grvPayrollDetails.AllowPaging = false; this.BindGrid(SortField); grvPayrollDetails.Font.Name = "Times New Roman"; grvPayrollDetails.BackColor = Color.Transparent; grvPayrollDetails.GridLines = GridLines.Both; grvPayrollDetails.RenderControl(hw); Response.Write(Regex.Replace(sw.ToString(), "(<a[^>]*>)|(</a>)", " ", RegexOptions.IgnoreCase)); Response.Flush(); Response.End(); } } 

改变你的下面一行GridView grvPayrollDetails = (GridView)grvPayroll.Rows[1].FindControl("grvPayrollDetails"); 用下面的代码

 GridView grvPayrollDetails = null; foreach (GridViewRow row in grvPayroll.Rows) { if (row.HasControls()) { foreach (Control ctrl in row.Controls) { if (ctrl.ID == "grvPayrollDetails" && grvPayrollDetails != null) { grvPayrollDetails = (GridView)ctrl; break; } } if (grvPayrollDetails != null) { break; } } } 

你应该修改你的for循环运行count-1,并使用if条件来检查row.Cells应该是>= 3

 for (int j = 0; j < grvPayrollDetailscell.Rows.Count - 1; j++) { if(row.Cells.Count >= 3) { dt.Rows.Add(row.Cells[1].Text, row.Cells[2].Text, grvPayrollDetailscell.Rows[j].Cells[0].Text, grvPayrollDetailscell.Rows[j].Cells[1].Text); 

还要确保您的dt.Columns在删除0列索引之前具有值

 if(dt.Columns.Count > 0) { dt.Columns.RemoveAt(0); }