2013-10-06 46 views
0

我正在開發一個web應用程序,需要能夠將一個listview導出到Excel。列表視圖是綁定的(我可以看到數據),但是我的下面的導出函數不起作用。該功能似乎在<asp:LinkButton><asp:Imagebutton>上跳閘。任何人都知道解決這個問題的方法?將Listview導出到Excel(疑難解答)

public void ExportIntoExcel(ListView lvExport, string Header, string FileName) 
{ 
    try 
    { 
     System.Web.HttpContext.Current.Response.Clear(); 
     System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"; 
     System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + FileName + ".xls"); 
     System.Web.HttpContext.Current.Response.Charset = ""; 
     System.Web.HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     StringWriter stringWrite = new StringWriter(); 
     stringWrite.Write(Header); 
     stringWrite.WriteLine(); 
     HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); 
     HtmlForm frm = new HtmlForm(); 
     lvExport.Parent.Controls.Add(frm); 
     frm.Controls.Add(lvExport); 
     frm.RenderControl(htmlWrite); 
     System.Web.HttpContext.Current.Response.Write(stringWrite.ToString()); 
    } 
    catch (Exception ex) 
    { 
    } 
    finally 
    { 
     System.Web.HttpContext.Current.Response.End(); 
    } 
} 

protected void export_Click(object sender, EventArgs e) 
{ 
    if (paidlv.Visible == true) 
    { 
     ExportIntoExcel(paidlv, "Income Summary", "incomesummary"); 
    } 
} 

更新: 這裏是全部列表視圖,所以你可以看到<asp:LinkButton>s<asp:Imagebutton>s

<asp:ListView ID="paidlv" runat="server" OnPagePropertiesChanged="paidlv_PagePropertiesChanged" OnDataBound="paidlv_DataBound" OnSorting="paidlv_Sorting" Visible="true"> 
<LayoutTemplate> 
    <table class="detail"> 
     <tr> 
      <th> 
       <asp:LinkButton ID="lnkdate" runat="server" CommandName="Sort" CommandArgument="pmtpaydate1">Date</asp:LinkButton> 
       <asp:Image runat="server" ID="SortRevImage5" ImageUrl="~/img/arrows.png" Visible="false" /> 
      </th> 
      <th> 
       <asp:LinkButton ID="lnktname" runat="server" CommandName="Sort" CommandArgument="tname">Transaction Name</asp:LinkButton> 
       <asp:Image runat="server" ID="SortRevImage2" ImageUrl="~/img/arrows.png" Visible="false" /> 
      </th> 
      <th> 
       <asp:LinkButton ID="lnkcname" runat="server" CommandName="Sort" CommandArgument="cname">Client Name</asp:LinkButton> 
       <asp:Image runat="server" ID="SortRevImage1" ImageUrl="~/img/arrows.png" Visible="false" /> 
      </th> 
      <th> 
       <asp:LinkButton ID="lnkhalf" runat="server" CommandName="Sort" CommandArgument="pmtdesc1">Portion</asp:LinkButton> 
       <asp:Image runat="server" ID="SortRevImage3" ImageUrl="~/img/arrows.png" Visible="false" /> 
      </th> 
      <th> 
       <asp:LinkButton ID="lnkamt" runat="server" CommandName="Sort" CommandArgument="pmtamt">Amount</asp:LinkButton> 
       <asp:Image runat="server" ID="SortRevImage4" ImageUrl="~/img/arrows.png" Visible="false" /> 
      </th> 
      <th>Delete</th> 
     </tr> 
     <tr id="itemPlaceholder" runat="server"></tr> 
    </table> 
    <div class="pager"> 
     <asp:DataPager ID="paidpager" runat="server" PageSize="20" PagedControlID="paidlv"> 
      <Fields> 
       <asp:NextPreviousPagerField ShowNextPageButton="False" ButtonCssClass="previousNextLink" /> 
       <asp:NumericPagerField ButtonCount="10" ButtonType="Link" NumericButtonCssClass="numericLink" /> 
       <asp:NextPreviousPagerField ShowPreviousPageButton="False" ButtonCssClass="previousNextLink" /> 
      </Fields> 
     </asp:DataPager> 
    </div> 
</LayoutTemplate> 
<ItemTemplate> 
    <tr class="altRow rowcolor"> 
     <td class="valigntop" onclick="DoNav('<%# Eval("transactionid","bookdeal.aspx?tid={0}") %>');"> 
      <asp:Label runat="server" ID="lbldate"><%#Eval("pmtdate", "{0:d}") %></asp:Label> 
     </td> 
     <td class="valigntop" onclick="DoNav('<%# Eval("transactionid","bookdeal.aspx?tid={0}") %>');"> 
      <asp:Label runat="server" ID="lbltname"><%#Eval("tname") %></asp:Label> 
     </td> 
     <td class="valigntop" onclick="DoNav('<%# Eval("transactionid","bookdeal.aspx?tid={0}") %>');"> 
      <asp:Label runat="server" ID="lblcname"><%#Eval("cname") %></asp:Label> 
     </td> 
     <td class="valigntop" onclick="DoNav('<%# Eval("transactionid","bookdeal.aspx?tid={0}") %>');"> 
      <asp:Label runat="server" ID="lblhalf"><%#Eval("half").ToString() == "1" ? "First" : Eval("half").ToString() == "2" ? "Second" : "Full" %></asp:Label> 
     </td> 
     <td class="valigntop" onclick="DoNav('<%# Eval("transactionid","bookdeal.aspx?tid={0}") %>');"> 
      <asp:Label runat="server" ID="lblamt"><%#Eval("pmtamt", "{0:C}") %></asp:Label> 
     </td> 
     <td> 
      <asp:ImageButton runat="server" ID="btndelete" ImageUrl="~/img/delete.png" OnClick="btndelete_Click" PostBackUrl="~/transaction.aspx" CssClass="deletebutton" CommandArgument='<%#Eval("transactionid") %>' /> 
     </td> 
     <asp:HiddenField runat="server" ID="lblrevid" Value='<%#Eval("transactionid") %>' /> 
    </tr> 
</ItemTemplate> 
<AlternatingItemTemplate> 
    <tr class="rowcolor"> 
     <td class="valigntop" onclick="DoNav('<%# Eval("transactionid","bookdeal.aspx?tid={0}") %>');"> 
      <asp:Label runat="server" ID="lbldate"><%#Eval("pmtdate", "{0:d}") %></asp:Label> 
     </td> 
     <td class="valigntop" onclick="DoNav('<%# Eval("transactionid","bookdeal.aspx?tid={0}") %>');"> 
      <asp:Label runat="server" ID="lbltname"><%#Eval("tname") %></asp:Label> 
     </td> 
     <td class="valigntop" onclick="DoNav('<%# Eval("transactionid","bookdeal.aspx?tid={0}") %>');"> 
      <asp:Label runat="server" ID="lblcname"><%#Eval("cname") %></asp:Label> 
     </td> 
     <td class="valigntop" onclick="DoNav('<%# Eval("transactionid","bookdeal.aspx?tid={0}") %>');"> 
      <asp:Label runat="server" ID="lblhalf"><%#Eval("half").ToString() == "1" ? "First" : Eval("half").ToString() == "2" ? "Second" : "Full" %></asp:Label> 
     </td> 
     <td class="valigntop" onclick="DoNav('<%# Eval("transactionid","bookdeal.aspx?tid={0}") %>');"> 
      <asp:Label runat="server" ID="lblamt"><%#Eval("pmtamt", "{0:C}") %></asp:Label> 
     </td> 
     <td> 
      <asp:ImageButton runat="server" ID="btndelete" ImageUrl="~/img/delete.png" OnClick="btndelete_Click" PostBackUrl="~/transaction.aspx" CssClass="deletebutton" CommandArgument='<%#Eval("transactionid") %>' /> 
     </td> 
     <asp:HiddenField runat="server" ID="lblrevid" Value='<%#Eval("transactionid") %>' /> 
    </tr> 
</AlternatingItemTemplate> 
<EmptyDataTemplate> 
      <table id="empty"> 
       <tr> 
        <td id="tdempty"> 
         <br /> 
         Sorry, no data found 
        </td> 
       </tr> 
      </table> 
</EmptyDataTemplate> 
</asp:ListView> 
+0

我已經編輯您的標題中的數據來做到這一點。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

明白了,謝謝。 – fcholmes

回答

1

你可以嘗試通過

private void DataTableToExcel(DataTable dataTable) 
{ 
    StringWriter writer = new StringWriter(); 
    HtmlTextWriter htmlWriter = new HtmlTextWriter(writer); 
    GridView gridView = new GridView(); 
    gridView.DataSource = dataTable; 
    gridView.AutoGenerateColumns = true; 
    gridView.DataBind(); 
    gridView.RenderControl(htmlWriter); 
    htmlWriter.Close(); 

    Response.Clear(); 
    Response.AddHeader("content-disposition", "attachment;filename=FileName.xls"); 
    Response.Charset = ""; 
    Response.Write(writer.ToString()); 
    Response.End(); 
} 
+0

感謝漢斯。那就是訣竅。我創建了一個新的數據表,添加了標題,通過我的行foreach,然後使用您的方法導出。我做了一個改進,添加了Response.ContentType,以便保存對話框默認自動選擇Excel。爲後人編輯你的帖子。 – fcholmes