【发布时间】: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