2012-08-13 119 views
1

我想將gridview內容導出到Excel中,如下所示,Excel被創建但沒有內容。但我可以查看網頁中的內容。導出爲Excel不導出Gridview內容

using System; 
using System.IO; 
using System.Reflection; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Xml; 
using System.Data; 
using System.Web.UI; 
using System.Web; 

namespace CustomReports.Reports 
{ 
public partial class Reports : System.Web.UI.Page 
{ 
    DataTable ResultTable = new DataTable();   
    GridView ResultGrid = new GridView(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public override void VerifyRenderingInServerForm(Control control) 
    { 
    /* Verifies that the control is rendered */ 
} 


    protected void Button1_Click(object sender, EventArgs e) 
    { 

     DataColumn col1 = new DataColumn("S.No"); 
     DataColumn col2 = new DataColumn("Workflow Name"); 
     DataColumn col3 = new DataColumn("Subject Name"); 
     DataColumn col4 = new DataColumn("Subject ID"); 

     col1.DataType = System.Type.GetType("System.Int32"); 
     col2.DataType = System.Type.GetType("System.String"); 
     col3.DataType = System.Type.GetType("System.String"); 
     col4.DataType = System.Type.GetType("System.String"); 

     ResultTable.Columns.Add(col1); 
     ResultTable.Columns.Add(col2); 
     ResultTable.Columns.Add(col3); 
     ResultTable.Columns.Add(col4); 

     CoreServiceSession client = new CoreServiceSession(); 
     SessionAwareCoreServiceClient csClient = client.GetClient(); 
     var readoption = new ReadOptions(); 

     ProcessesFilterData filter = new ProcessesFilterData() 
     { 
      BaseColumns = ListBaseColumns.IdAndTitle, 
      ProcessType = ProcessType.Historical 

     }; 

     int i = 1; 
     foreach (IdentifiableObjectData data in csClient.GetSystemWideList(filter)) 
     { 
      var processHistory = data as ProcessHistoryData; 
      if (processHistory != null) 
      { 
       DataRow row = ResultTable.NewRow(); 
       row[col1] = i; 
       row[col2] = processHistory.Title; 
       foreach (var subjectdetails in processHistory.Subjects) 
       { 
        row[col3] = subjectdetails.Title.ToString(); 
        row[col4] = subjectdetails.IdRef.ToString(); 
       } 
       ResultTable.Rows.Add(row); 
      } 
      i++; 
     } 

     //GridView ResultGrid = new GridView(); 
     ResultGrid.DataSource = ResultTable; 
     ResultGrid.DataBind(); 
     Panel1.Controls.Add(ResultGrid); 
    } 

    protected void Button2_Click(object sender, EventArgs e) 
    { 
     ExporttoExcel(ResultGrid, "Reports"); 
    } 


    protected void ExporttoExcel(GridView objGridView, string FileName) 
    { 
     string attachment = "attachment; filename=" + FileName + ".xls"; 
     HttpContext.Current.Response.ClearContent(); 
     HttpContext.Current.Response.AddHeader("content-disposition", attachment); 
     HttpContext.Current.Response.ContentType = "application/ms-excel"; 
     StringWriter objStringWriter = new StringWriter(); 
     HtmlTextWriter objHtmlTextWriter = new HtmlTextWriter(objStringWriter); 
     objGridView.RenderControl(objHtmlTextWriter); 
     HttpContext.Current.Response.Write(objStringWriter.ToString()); 
     HttpContext.Current.Response.End(); 


    } 






} 

} 

Excel未imporing在GridView,它的空白

ASPX代碼內容:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Reports.aspx.cs" Inherits="CustomReports.Reports.Reports" EnableEventValidation="false" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server">  
<title>Custom Report Page</title> 
</head> 
<body> 
<form id="form1" runat="server"> 
    <div> 
      <table id="table1" runat="server"> 
       <tr> 
        <td> 
         <asp:Label ID="CustomReports1" runat="server" Text="Custom Reports" 
         Font-Bold="True"></asp:Label> 
        </td> 
       </tr> 

       <tr> 
        <td> 
         <asp:Label ID="SelectReportType2" runat="server" Text="Select Report Type"></asp:Label> 
        </td> 

        <td> 
         <asp:DropDownList ID="DDReportTypes" runat="server" Height="25px" Width="193px" onselectedindexchanged="DDReportTypes_SelectedIndexChanged" AutoPostBack = "true" ></asp:DropDownList> 
        </td> 
       </tr> 
      </table> 


      <table id="dynamictable" runat="server"> 
      </table> 


      <table id="buttons"> 
       <tr> 
        <td> 
         <asp:Button ID="Button1" runat="server" Text="Search" onclick="Button1_Click" /> 
        </td> 

        <td> 
         <asp:Button ID="Button2" runat="server" Text="Export" onclick="Button2_Click" /> 
        </td> 

        <td> 
         <asp:Button ID="Button3" runat="server" Text="GetValues" onclick="Button3_Click" /> 
        </td>   
       </tr> 
      </table> 



      <asp:TextBox ID="TextBox0" runat="server" Height="28px" Width="355px"></asp:TextBox> 

      <asp:Panel ID="Panel1" runat="server">    
        <asp:GridView ID="ResultGrid" runat="server"> 
        </asp:GridView>   
      </asp:Panel> 

    </div> 

</form> 

</body> 
</html> 

回答

2

你不需要的形式。只呈現網格:

ResultGrid.RenderControl(htw); 

但是,你需要因爲通常電網必須是這樣的形式

public override void VerifyRenderingInServerForm(Control control) 
{  
} 
+0

是的,我已經做到了。並添加公共覆蓋無效VerifyRenderingInServerForm(控制控制){返回; }在我的代碼背後。並在頁面指令中設置EnableEventValidation =「false」。現在沒有錯誤,但Excel中沒有任何內容 – user1428019 2012-08-13 09:16:11

+0

你能發表這個版本的代碼嗎? – 2012-08-13 09:21:12

+0

@@ Amiram:請查看我更新的完整代碼 – user1428019 2012-08-13 09:53:14

0

使用此代碼嘗試出口添加此代碼...

Response.Clear(); 
    Response.Buffer = true; 
    Response.AddHeader("content-disposition", "attachment;filename=fooreport.xls"); 
    Response.Charset = ""; 
    Response.ContentType = "application/ms-excel"; 
    System.IO.StringWriter stringWrite = new System.IO.StringWriter(); 
    System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); 
    lstEarningReport.RenderControl(htmlWrite); 
    Response.Write("<table border='1' > "); 
    Response.Write(stringWrite.ToString()); 
    Response.Write("</table>"); 
    Response.End(); 
+0

我得到這個錯誤「類型'GridView'的Control'ResultGrid'必須放置在runat = server的表單標籤中。」在這一行「lstEarningReport.RenderControl(htmlWrite);」這就是ASPX代碼 「的 「 – user1428019 2012-08-13 08:50:00

+0

'lstEarningReport'是一些控件的名稱..你應該用你的控件名稱替換...我想它是'ResultGrid' ... – 2012-08-13 09:06:45

+0

是的,我已經做到了。並添加了公共覆蓋void VerifyRenderingInServerForm(Control control) { return; }在我的代碼背後。並在頁面指令中設置EnableEventValidation =「false」。現在沒有錯誤,但Excel中沒有任何錯誤 – user1428019 2012-08-13 09:15:09

0

這是一個古老的問題,但遇到同樣的問題時會遇到這個問題。在我的情況下,gridview上的EnableViewState被設置爲false。將其重新設置爲true可以解決問題。我也在數據綁定gridview出口之前,也刪除了。