views:

1524

answers:

3

Hopefully you guys can help me out. I tried a lot of different things and cant get this working.

I have a gridview as below in a update panel:

<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>

I am trying to export this gridview out to excel. There is a button which the user clicks on it calls the on_click method for that button and in this on_click i have the following:

        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();

I get nothing from this tried debugging it seems that when i mouse over stw.tostring() all the values for the gridview are there but nothing gets written out.

+2  A: 

If the GridView and/or the button is within in update panel with an async postback, I do not believe you can change the response headers or information. Try running it again with a full postback on the button trigger and see what happens. Your code did not look incorrect, but I've not tried it...

Take a look at this samples...
1. c-sharpcorner
2. Matt Berseth
3. Code Project

RSolberg
Those are the same examples i have been looking at to get my code to work. ThanksSo i added a trigger for my button:</ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="btnExportReport" EventName="Click" /> </Triggers>I think i should also mention that the gridview and the button are in two different updatepanels.
For starters, try putting the grid on a standard webform page without any ajax or update panels and see how that works...
RSolberg
Also, where is the button at? Can you show more code?
RSolberg
+1  A: 

Check your content types and for a PostBackTrigger on the exporting button.

For Excel 2003

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

For Excel 2007

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

You can check out this blog post for the source of my content types.

EDIT: From your comments: You need to set a PostBackTrigger on the panel that contains the button doing the export, not the panel that contains the GridView.

EDIT EDIT: Your file-is-not-what-it-says-it-is error is due to a feature called Extension Hardening, present in Excel 2007. Check this StackOverflow question for more info; I linked to a blog post describing the reasoning for this error and a possible workaround.

Matthew Jones
sir you are a Hero. Thank you so much for all your help.
No problem. Also, you might want to be aware that in doing this kind of export, the file being exported is not a native Excel file. It is an HTML file that the Excel program can read. What I mean is, be sure to use Save As... and change the type to Microsoft Excel Workbook, otherwise it may be unreadable (I know because I ran into this exact problem myself).
Matthew Jones
the application/ms-excel seems to the standard used out there today for this.
RSolberg
@RSolberg: I tried that myself about a year ago and ran into almost the same problem as newbie. What you are suggesting should work, but maybe there are other factors we have not considered.
Matthew Jones
The only weird thing is when trying to open the file it says: The File you are tying to open, 'Employee.xls", is in a different format than specified by the file extension. I am thinking is exactly to what you mentioned in your comment.
also i changed the contenttype to Response.ContentType = "application/vnd.ms-excel";
Sweet thanks for all your help Matthew.
@newbie - If you hit "YES" or "OK" on that error message, does it work?
RSolberg
Good point RSolberg. It should open the file anyway, the dialog is just warning you that the file is not what it says it is.
Matthew Jones
yup file opens just fine by clicking yes.
A: 

The way I was able to work around this in a simple page that I was working on was to have a hidden gridview outside of the updatepanel and set it equal to the gridview in the update panel so that they are the same (except for the new one being hidden). Then export this hidden grid to Excel the same way that you were doing it before.

One issue with doing it this way is that the export hyperlink needs to be outside of the update panel as well which means that you might not be able to put the export hyperlink where you want it.

Granted this is probably not the best way to do it, it got me around this issue at the time. Hope it helps.

Dusty