在Web应用程序中将Gridview导出到Excel

时间:2009-06-10 15:50:46

标签: excel gridview export

希望你们能帮助我。我尝试了很多不同的东西,不能让它发挥作用。

我在更新面板中有如下的gridview:

<asp:UpdatePanel ID="udpReport" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
      <ContentTemplate>
          <asp:GridView runat="server" ID="preferenceReportGrd" AutoGenerateColumns="false"
               AutoGenerateSelectButton="false" CaptionAlign="Top" EnableSortingAndPagingCallbacks="false" HorizontalAlign="left" CssSelectorClass="gvwPrefReport">
                   <Columns>
                       <asp:BoundField ReadOnly="true" DataField="ClientName" HeaderText="Company Name" />
                            <asp:BoundField ReadOnly="true" DataField="typeDescription" HeaderText="Preference" />
                            <asp:BoundField ReadOnly="true" DataField="defaultValue" HeaderText="Default Preference" />
                            <asp:BoundField ReadOnly="true" DataField="previousPreferenceValue" HeaderText="Previous Preference" />
                            <asp:BoundField ReadOnly="true" DataField="selectedValue" HeaderText="New Preference" />
                            <asp:BoundField ReadOnly="true" DataField="lastUpdated" HeaderText="Date Last Edited" />
                    </Columns>
          </asp:GridView>
          <div>
              <user:MsgLine runat="server" ID="MsgLine1" />
          </div>
     </ContentTemplate>
</asp:UpdatePanel>

我正在尝试将此gridview导出为ex​​cel。用户点击它的按钮调用该按钮的on_click方法,在此on_click中我有以下内容:

        string attachment = "attachment; filename=Employee.xls";            
        Response.AddHeader("content-disposition", attachment);
        Response.ContentType = "application/excel";
        StringWriter stw = new StringWriter();
        HtmlTextWriter htextw = new HtmlTextWriter(stw);
        preferenceReportGrd.RenderControl(htextw);
        Response.Write(stw.ToString());
        Response.End();

我从这个尝试过的调试中得不到什么似乎当我将鼠标移到stw.tostring()上时,gridview的所有值都存在,但没有任何内容被写出来。

4 个答案:

答案 0 :(得分:3)

是。在更新面板标签内excel导出不起作用。我面临同样的问题。 要解决此问题,请在更新面板标记

的末尾使用以下代码
</ContentTemplate>          
       <Triggers>
        <asp:PostBackTrigger ControlID="BtnExport" />
    </Triggers>
        </asp:UpdatePanel>

它甚至可以在更新面板中工作

答案 1 :(得分:2)

如果GridView和/或按钮位于带有异步回发的更新面板中,我不相信您可以更改响应标头或信息。尝试使用按钮触发器上的完整回发再次运行它,看看会发生什么。你的代码看起来不正确,但我没试过......

看一下这个样本......
1. c-sharpcorner
2. Matt Berseth
3. Code Project

答案 2 :(得分:1)

检查导出按钮上的内容类型和PostBackTrigger。

对于Excel 2003

Response.ContentType = "application/vnd.ms-excel

对于Excel 2007

Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

您可以check out this blog post获取我的内容类型来源。

编辑:从您的评论: 您需要在包含执行导出的按钮的面板上设置PostBackTrigger,而不是包含GridView的面板。

编辑编辑:您的文件不是它说的错误是由于Excel 2007中存在一项称为扩展加固的功能。请查看this StackOverflow question以获取更多信息;我链接到blog post,描述了此错误的原因以及可能的解决方法。

答案 3 :(得分:0)

我在一个简单的页面中解决这个问题的方法就是在updatepanel之外有一个隐藏的gridview,并将它设置为更新面板中的gridview,以便它们是相同的(除了为了隐藏新的一个)。然后以与之前相同的方式将此隐藏网格导出到Excel。

这样做的一个问题是导出超链接也需要在更新面板之外,这意味着您可能无法将导出超链接放在所需的位置。

当然这可能不是最好的方法,它让我解决了这个问题。希望它有所帮助。