2016-08-05 56 views
0

我一直在試圖實現一個將GridViews導出到Excel工作表的簡單方法。不過,我卡在這一塊,現在相當長的一段:ASP.NET:將GridView導出到Excel的正確方式,包括動態添加的行

GridViewAutoGenerateColumns設置爲true,因爲數據源是動態的,而不是真正可預見的(改變列的數量隨着時間的推移)。它會自動創建的HeaderRow是不適合我,所以我也設置ShowHeaderfalse並創建了自己的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和東西)。這一切都很好地工作在網站上,但是,當我嘗試了GridView使用OpenXML的出口是這樣的:

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 S,爲他們的循環帳戶,但所有進入工作表是空白的領域,它也似乎他們沒有被gv.Rows.Count考慮,如循環永遠不會到達我表格中的最後兩行。

我試過調試,實際上所有返回的gv.Rows[j].Cells[i].Text;都是"",即使這些單元格的Text屬性已設置,並且表格在網站上顯示OK。

我覺得這種行爲很混亂,我想我錯過了很大的東西。有人能告訴我爲什麼會發生這種情況嗎?

回答

1

無論是自動生成還是其他。訣竅是將所有東西視爲對象和對象的孩子。然後使用該對象的屬性(以及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。

希望這會有所幫助。

+0

謝謝,但正如我上面提到的,這不工作,因爲Excel拒絕打開下載的文件。雖然OpenOffice可以毫無問題地打開它,這讓我很困惑o_o。 – Epsiloney

+0

我從您的代碼中看到您正在使用ExcelPackage類。如果您的代碼有效,請嘗試使用Excel類。正如我所說,我的答案只是一條路。還有其他許多例子。只要做一個搜索。 –