似乎无法将我的gridview导出到excel文件

时间:2012-01-24 17:44:58

标签: c# asp.net .net

基本上我有一个webcontrol,其中包含带导出按钮的gridview。单击此导出按钮时,我希望基本上将gridview转换为.xls文件,以便我可以在excel中查看数据。

我实际上已经设法使用GridView.RenderControl();问题是整个usercontrol的数据似乎保存到这个excel文件(包括按钮/图像/标题等)。这不是我想要的。我只想渲染GridView数据,可能还有标题。

有什么方法可以选择呈现哪些信息?在单个控件上调用函数会导致所有控件都被渲染......似乎很奇怪......

无论如何,这是我的导出按钮代码:

 protected void btnExport_Click(object sender, EventArgs e)
        {
            try
            {
                // Exports as excel spreadsheet
                Response.Clear();
                Response.Buffer = true;

                Response.AddHeader("content-disposition",
                "attachment;filename=registered_subscribers_" + System.DateTime.Now.ToShortDateString().Replace("/", "") + ".xls");
                Response.Charset = "";
                Response.ContentType = "application/vnd.ms-excel";
                StringWriter sw = new StringWriter();
                HtmlTextWriter hw = new HtmlTextWriter(sw);                

                for (int i = 0; i < gvInterest.Rows.Count; i++)
                {
                    GridViewRow row = gvInterest.Rows[i];

                    //Apply text style to each Row
                    row.Attributes.Add("class", "textmode");
                }

                gvInterest.RenderControl(hw);

                //style to format numbers to string
                string style = @"<style> .textmode { mso-number-format:\@; } </style>";
                Response.Write(style);
                Response.Output.Write(sw.ToString());
                Response.Flush();
                Response.End();
            }
            catch
            {
                // Handle error
            }
        }

这是我的前端:

 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ViewSubscribers.ascx.cs"
        Inherits="MyCode.ViewSubscribers" %>
    <div id="subscribers">
        <asp:Button ID="btnExport" runat="server" Text="Export" 
            onclick="btnExport_Click" />    
        <h2>
            Pre-registered subscribers for tickets</h2>
        <asp:GridView ID="gvInterest" runat="server" AutoGenerateColumns="false">
            <HeaderStyle CssClass="gv-header" ForeColor="#ffffff" BackColor="#333333" />
            <RowStyle BackColor="White" ForeColor="#333333" />
            <AlternatingRowStyle BackColor="#e6e6e6" ForeColor="#333333" />
            <Columns>
                <asp:BoundField DataField="Title" HeaderText="Title" />
                <asp:BoundField DataField="FirstName" HeaderText="First Name" />
                <asp:BoundField DataField="LastName" HeaderText="Last Name" />
                <asp:BoundField DataField="HouseNumber" HeaderText="House Name/Number" />
                <asp:BoundField DataField="Address1" HeaderText="Address 1" />
                <asp:BoundField DataField="Address2" HeaderText="Address 2" />
                <asp:BoundField DataField="Postcode" HeaderText="Post code" />
                <asp:BoundField DataField="Country" HeaderText="Country" />
                <asp:BoundField DataField="Phone" HeaderText="Phone" />
                <asp:BoundField DataField="Email" HeaderText="Email" />
                <asp:BoundField DataField="Comments" HeaderText="Comments" />
                <asp:BoundField DataField="DateCreated" HeaderText="Date Created" />
            </Columns>
            <EmptyDataTemplate>
                There are currently no subscribers
            </EmptyDataTemplate>
        </asp:GridView>      
    </div>

任何人都可以提供帮助吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

在此处查看此信息http://www.c-sharpcorner.com/UploadFile/DipalChoksi/ExportASPNetDataGridToExcel11222005041447AM/ExportASPNetDataGridToExcel.aspx

你可以使用clearcontrols函数删除任何html标签/控件/图像等,然后再渲染它们

另一个链接 - http://csharpdotnetfreak.blogspot.com/2011/10/export-gridview-to-excel.html

检查changecontroltovalue函数

答案 1 :(得分:0)

RenderControl是递归的,我不知道如何阻止它渲染子控件/执行你已实现的gridview事件。

从您的代码中可以清楚地了解您不想添加的图像/标记的位置和方式。我使用了两种方法来解决类似的问题:

1)维护一个单独的网格用于导出。在按钮单击时渲染它而不是显示网格。

2)在页面上维护一个表示模式的属性。跳过任何代码渲染图像/任何其他标记。您可以在导出按钮的单击上将其设置为导出,并在事件处理中查找该设置。

两者都不是一个完美的解决方案,它实际上是基于您要处理的编码量,以及您需要的格式控制。你用一个网格弄乱了你的aspx,或者你用基于这种模式的if语句混乱你的代码。

答案 2 :(得分:0)

我使用的方法是将数据导出为带有制表符分隔值的字符串。