Jag försöker åstadkomma så att jag kan lägga in en knapp intill de tabeller som förekommer i en webapplikation så att dessa tabeller kan exporteras till Excel. Jag vet att när jag satt med masterpages och skulle skapa excelfiler från dataset så blev det problem och jag hittade då denna lösning som jag hoppas kunna vara till hjälp.Skapa knapp för att exportera till Excel
Jag har ordnat en klass som ordnar ett DataGrid-objekt utifrån Repeater, jag har hört att detta gör det enkelt att exportera till Excel.
Jag har testat några varianter när man klickar på en knapp i en vanlig .ASPX, och det fungerar bra. Jag använder då följande (på ett ungefär):
HttpResponse Response = HttpContext.Current.Response;
System.Web.UI.WebControls.DataGrid excelGrid = CreateDataGrid(Repeater tableToGenerate);
Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=ExportedData.xls");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/vnd.xls";
System.IO.StringWriter stringWrite = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite);
excelGrid.RenderControl(htmlWrite);
Response.Write(stringWrite.ToString());
Response.End();
Problemet är att jag har en dynamiskt laddad User Control i vilken tabellen och knappen för att exportera till Excel finns med. Detta verkar skapa allvarliga problem, men jag kan inte riktigt lista ut hur jag ska komma runt det.
Jag vet att problemet kanske är lite luddigt, men finns det någon som känner igen någon liknande problematik?
Sv: Skapa knapp för att exportera till Excel
Vid första visningen av datan lagras det i en cache, nu är det lite Linq inblandat i detta men men...
<code>
Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click
Dim mDB As New db(ConfigurationManager.ConnectionStrings("mConn").ConnectionString)
Dim ds As DataSet = New DataSet()
If Cache("DataSet") Is Nothing Then
ds = (From t In mDB.TblTasks _
Select t)
Cache("DataSet") = ds
End If
gv2.DataSource = CType(Cache("DataSet"), DataSet)
gv2.DataBind()
btnExcel.Visible = True
End Sub
Protected Sub btnExcel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExcel.Click
Response.Clear()
Response.AddHeader("content-disposition", "attachment;filename=file.xls")
Response.Charset = ""
' If you want the option to open the Excel file without saving than
' comment out the line below
' Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/vnd.xls"
Dim stringWrite As System.IO.StringWriter = New System.IO.StringWriter()
Dim htmlWrite As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(stringWrite)
Dim gv1 As GridView = GetGridView()
gv1.RenderControl(htmlWrite)
Response.Write(stringWrite.ToString())
Response.End()
End Sub
Private Function GetGridView() As GridView
fv1.DataSource = CType(Cache("DataSet"), DataSet)
fv1.DataBind()
Dim row As FormViewRow = fv1.Row
Dim gv As GridView = CType(row.FindControl("gv1"), GridView)
gv.DataSource = CType(Cache("DataSet"), DataSet)
gv.DataBind()
Return gv
End Function
Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
' Confirms that an HtmlForm control is rendered for the specified ASP.NET server control at run time.
End Sub
</code>
I aspx-sidan så finns följande. Dvs en formview med en gridview i sig som aldrig visas men som hjälper till att rendera till excel. gv2 används för att visa datan
<code>
<asp:FormView ID="fv1" runat="server">
<ItemTemplate>
<asp:GridView ID="gv1" runat="server" AutoGenerateColumns="true" />
</ItemTemplate>
</asp:FormView>
<asp:GridView ID="gv2" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="False" DataKeyNames="intId" Width="800px">
<FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" VerticalAlign="Top" />
<EditRowStyle BackColor="#999999" VerticalAlign="Top" />
<SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" VerticalAlign="Top" />
<PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
<HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" ForeColor="#284775" VerticalAlign="Top" />
<Columns>
<asp:BoundField DataField="strText" HeaderText="Ärende">
<ItemStyle Width="150px" Wrap="True" />
</asp:BoundField>
<asp:BoundField HeaderText="Beskrivning" DataField="strDescr" >
<ItemStyle Width="490px" Wrap="True" />
</asp:BoundField>
<asp:BoundField HeaderText="Datum" DataField="dtmReportDate" DataFormatString="{0:dd-MM-yyyy}" HtmlEncode="False" >
<ItemStyle Width="90px" Wrap="False" />
</asp:BoundField>
<asp:BoundField HeaderText="Tid" DataField="decTime" >
<ItemStyle Width="20px" Wrap="False" />
</asp:BoundField>
<asp:HyperLinkField DataNavigateUrlFields="intId" DataNavigateUrlFormatString="~/AddEdit.aspx?id={0}"
Text="Visa/Redigera" ItemStyle-ForeColor="#5d7b9d" >
<ItemStyle Width="50px" Wrap="False" ForeColor="#5d7b9d" />
</asp:HyperlinkField>
</Columns>
</asp:GridView>
</code>