![](/img/trans.png)
[英]ASP.NET dynamically add row in GridView not added more than 2 rows
[英]ASP.NET: Proper way of exporting GridView to Excel including dynamically added rows
我一直在嘗試實現一種將 GridViews 導出到 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 做得很好)然后我在某處閱讀了工作表不是實際上可用於數據處理,這在這種情況下至關重要。
編輯:在我在OnRowDataBound
而不是OnRowCreated
添加了兩個HeaderRow
OnRowCreated
,循環會考慮它們,但是進入工作表的所有內容都是空白字段,而且似乎gv.Rows.Count
沒有考慮它們,因為循環永遠不會到達我表中的最后兩行。
我試過調試,確實所有這些都由gv.Rows[j].Cells[i].Text;
返回gv.Rows[j].Cells[i].Text;
是""
,即使單元格設置了它們的Text
屬性並且表格在網站上顯示正常。
我發現這種行為非常令人困惑,我想我錯過了一些大事。 有人能告訴我為什么會這樣嗎?
它是自動生成的還是其他方式都沒有關系。 訣竅是將所有東西都視為一個對象和一個對象的子對象。 然后使用對象的屬性(以及 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。
希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.