簡體   English   中英

ASP.NET:將 GridView 導出到 Excel 的正確方法,包括動態添加的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM