Asp net e Excel

lunedì 20 novembre 2006 - 10.26

TurboRazzo Profilo | Newbie

Salve a tutti, avrei bisogno di sapere come si può esportare i dati contenuti in una grid view in exel.
Ho visto alcuni esempi, ma non sono in grado di farli funzionare.
Qualcuno mi sa dare un esempio semplice da consultare.
Ps la base dati è SQL

Grazie a chiunque

alx_81 Profilo | Guru

>Salve a tutti,
Ciao!

>avrei bisogno di sapere come si può esportare
>i dati contenuti in una grid view in exel.
>Ho visto alcuni esempi, ma non sono in grado di farli funzionare.
>Qualcuno mi sa dare un esempio semplice da consultare.
>Ps la base dati è SQL
>

Utilizzo una tecnica che qualche utente più esperto può migliorare
All'epoca di Classic ASP mi creavo una tabella html contenente tutte le righe del datasource, mettendo il contenttype della pagina a application/vnd.ms-excel.. ora la procedura cambia un pochino..

Imports System.IO ... Response.Clear(); Response.AddHeader("content-disposition", "attachment;filename=FileName.xls"); Response.ContentType = "application/vnd.xls"; StringWriter sw = new System.IO.StringWriter(); HtmlTextWriter hw = new HtmlTextWriter(sw); MyGrid.RenderControl(hw); Response.Write(sw.ToString()); Response.End();

Con questa procedura, basta eseguire il click di un link o di un bottone per scaricarti l'excel del tuo controllo..
Indipendentemente dalla base dati che utilizzi..

>Grazie a chiunque
Di nulla!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

TurboRazzo Profilo | Newbie

Ti ringrazio per il post ...

Mi domando solo in quale linguaggio sia scritto, perchè se copio e incollo quanto da te scritto mi da tutta una serie di errori.

TurboRazzo Profilo | Newbie

... Ti disturbo ancora ...

quando eseguo il codice da te indicato mi restituisce il seguente errore:

Exception Details: System.Web.HttpException: Control 'GridView1' of type 'GridView' must be placed inside a form tag with runat=server

sai dirmi perché ??

alx_81 Profilo | Guru

Il codice è scritto in Vb.Net..
Per ciò che riguarda il tuo secondo post.. te lo dice proprio l'errore..
la form che contiene il gridview deve avere un attributo runat="server" nella definizione..

<form .... runat=server>
...
</form>

ovviamente il codice che ti ho mandato va riadattato per il tuo controllo GridView (nome corretto).. poi devi aggiungere in testa l'imports indicato..
ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

TurboRazzo Profilo | Newbie

Ciao,

incomincio a dubitare di essere stupido ... ti riporto di seguito il codice da me usato .. puoi dirmi dove sbaglio ??

-----------------------------------------------------
<%@ Page Language="VB" %>

<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data.DataTable" %>
<%@ Import Namespace="System.IO.StringWriter" %>
<%@ Import Namespace="System.Web.UI.HtmlTextWriter" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">


Protected Sub Button6_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs)



Response.Clear()
Response.AddHeader("content-disposition", "attachment;filename=FileName.xls")
Response.ContentType = "application/vnd.xls"

Dim sw = New System.IO.StringWriter()
Dim hw = New HtmlTextWriter(sw)

GridView1.RenderControl(hw)
Response.Write(sw.ToString())
Response.End()

End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">

<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1">
</asp:GridView>

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:SD350ConnectionString %>"
SelectCommand="SELECT * FROM [CV_STN_ANA_USERS]"></asp:SqlDataSource>

<input id="Button6" runat="server" onserverclick="Button6_ServerClick " style="font: menu;
width: 140px" type="button" value="Mostra dati" />

</form>
</body>
</html>
-----------------------------------------------------

GRAZIE PER LA PAZIENZA

totti240282 Profilo | Guru

cmq con questo ultimo metodo almeno a me con + di 10.000 record il server impazzisce e poi se il gridview lo divido in pagine mi esporta (ovviamente) solo la pagina visualizzata.
C'è solo un capitano !!!!!!

alx_81 Profilo | Guru

>Ciao,
>
>incomincio a dubitare di essere stupido ... ti riporto di seguito
>il codice da me usato .. puoi dirmi dove sbaglio ??
>

La colpa è mia, mi sono dimenticato di farti ridefinire il metodo VerifyRenderingInServerForm. Devi implementarlo e lasciarlo vuoto, altrimenti lancia quell'eccezione. Devi implementarlo perchè fai il render a runtime del controllo GridView..
Aggiungi la seguente riga dopo la sub che gestisce il click (ti consiglio comunque di usare un asp:Button, per allinearti ad ASP.NET..):


Public Overrides Sub VerifyRenderingInServerForm(ByVal control As System.Web.UI.Control) 'Do nothing End Sub

Per quanto riguarda il messaggio di totti240282, in effetti una grossa quantità di dati può essere impegnativa per il server.. Seppure ci siano comunque altre strategie, non so quanto possano essere interessanti 10000 righe su excel.. è possibile e può capitare.. ma in quel caso cerco di sconsigliare a chi vuole il report di visualizzare così tante righe.. anche perchè guardarne 10000 vuol dire perdere un sacco di tempo . Poi non dimentichiamo che per la produzione di documenti così pesanti esistono sempre altri strumenti (reporting services, ecc.) oppure semplici elaborazioni asincrone o batch.. insomma.. online, bisogna cercare di stare leggeri.. sei d'accordo totti240282?

Ciao!
facci sapere!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

totti240282 Profilo | Guru

certo hai perfettamente ragione.
C'è solo un capitano !!!!!!

TurboRazzo Profilo | Newbie

Ciao, intanto grazie per la pazienza che dimostri ....

Purtroppo ho cercato di fare come mi hai suggerito, vedi esempio sotto, ma non funziona, ovvero mi restituisce l'errore di cui sotto:

-----------------------------------------------------------------------------------------
RegisterForEventValidation can only be called during Render();
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: RegisterForEventValidation can only be called during Render();

Source Error:


Line 24: Dim hw = New HtmlTextWriter(sw)
Line 25:
Line 26: GridView1.RenderControl(hw)
Line 27: Response.Write(sw.ToString())
Line 28: Response.End()

-----------------------------------------------------------------------------------------
*******************************************************
Code:
*******************************************************

<%@ Page Language="VB" %>

<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data.DataTable" %>
<%@ Import Namespace="System.IO.StringWriter" %>
<%@ Import Namespace="System.Web.UI.HtmlTextWriter" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">


Protected Sub Button6_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs)



Response.Clear()
Response.AddHeader("content-disposition", "attachment;filename=FileName.xls")
Response.ContentType = "application/vnd.xls"

Dim sw = New System.IO.StringWriter()
Dim hw = New HtmlTextWriter(sw)

GridView1.RenderControl(hw)
Response.Write(sw.ToString())
Response.End()


End Sub

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As System.Web.UI.Control)
'Do nothing
End Sub

**************************************************************************
Mi sai dire perché ???


Grazie !!!!

alx_81 Profilo | Guru

Hai una BETA di Visual Studio?
guarda qui
http://geekswithblogs.net/azamsharp/archive/2005/12/21/63845.aspx

ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

TurboRazzo Profilo | Newbie

No, ho la versione express ...

grazie

alx_81 Profilo | Guru

Hai provato a fixare in uno dei metodi indicati nel link?
Alx81 =)

http://blogs.dotnethell.it/suxstellino

TurboRazzo Profilo | Newbie

Scusa ma non capisco cosa intendi dire con "fixare"?

alx_81 Profilo | Guru

Nel link indicato ti dice di provare a mettere nella direttiva page EnableEventValidation = "false", oppure di ridefinire il metodo EnableEventValidation.. ti chiedevo se hai provato o se vuoi che passiamo ad un altro metodo
Alx81 =)

http://blogs.dotnethell.it/suxstellino

TurboRazzo Profilo | Newbie

Mitico !!!

adesso funziona, è stato sufficiente inserire quella voce nella <% Page ...%>.

Grazie mille... ti devo un caffé

alx_81 Profilo | Guru

>Mitico !!!
>
>adesso funziona, è stato sufficiente inserire quella voce nella
><% Page ...%>.
esatto.. fixato
>
>Grazie mille... ti devo un caffé
ma figurati..
mi basta che tu accetti la risposta, così chiudiamo il thread
CIAO!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

PEPE Profilo | Senior Member

Salve a tutti,
grazie a questo vostro intervento mi avete fatto risparmiare un bel po di tempo.

Cercando in rete ho trovato quest'articolo molto diretto.

http://community.visual-basic.it/tdj/archive/2007/07/20/19983.aspx

Colgo l'occasione, se possibile, di chiedervi il motivo per il quale bisogna ridefinire quel metodo ed impostare il false tra le opzioni della direttiva page...nel senso...l'ho fatto e mi funziona ma non so perche :D:D:D.

Grazie 1000,
Luca.

p.s.
prima del gridview usavo il datagrid e con quello funzionava tranquillamente :P.

schifidus Profilo | Junior Member

Ciao,
Non capisco perchè non usi delle bellissime odbc e vai ascrivere direttametente nel tuo foglio Excel...
Almeno hai una gestione più object oriented del problema...
OleDbConnection objConn = new OleDbConnection(Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0; + tuo datasource che sarebbe il path del tuo file excel)
e dai qui ci lavori normalmente come con qualsiasi connection ADO, quindi ti basterò creare un OleDbCommand per eseguire la insert nel tuo foglio excel come se fosse una banalissima tabella...

Marco.

ETCEFALA Profilo | Newbie

Per esportare un gran numero di righe in Excel ho realizzato http://www.gridviewtoexcel.com ; può esportare in vero formato XML per Excel 2003 e in formato XLSX per Excel 2007. Oltretutto è in grado di comprimere il file ottenuto e di inviarlo via email al destinatario. Ovviamente fa anche il tradizionale export HTML, che va sempre quando devi esportare un numero limitato di righe.

Ciao

fabiana Profilo | Newbie

Ciao a tutti, avrei bisogno del vostro aiuto. Cercavo sul web informazioni per esportare una gridview in un file di excel e ho trovato diverse soluzioni. Quella che serviva a me rigaurdava il codice in vb.net che vi riporterò sotto.
In pratica ho una pagina aspx con una gridview che è il risultato di una query che vorrei esportare in un file di excel.
Non avendo conoscenze al riguardo ho cercato un pò sul web e credevo di aver trovato la soluzione che consiste nel mettere un bottone nella pagina aspx e il codice qua sotto scritto in vb.net nell'ento click del bottone. Infine ho letto che bisogna aggiungere nella pagina aspx la stringa EnableEventValidation="false". Fatto queste cose quando vado sulla pagina e clicco sul bottone non succede niente, ne errori ne foglio di excel. Sapete spiegarmi cosa sbaglio?
Grazie mille


Protected Sub Export_Click(ByVal sender As Object, ByVal e As EventArgs)
Response.Clear()
Response.Buffer = True
Response.ContentType = "application/ms-excel"
Response.AddHeader("content-disposition", "inline;filename=NomeFile.xls")
Response.Charset = ""
Dim swr As New System.IO.StringWriter()
Dim htw As New System.Web.UI.HtmlTextWriter(swr)
TimesheetGridView.RenderControl(htw)
Response.Write(swr.ToString())
Response.End()
End Sub

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As System.Web.UI.Control)
End Sub

TurboRazzo Profilo | Newbie

Ciao,
questo è il codice che ho usato io e funziona. All'evento click del pulsante, io ho fatto un response.redirect su una pagina aspx che carica il seguente codice
e che, come potrai leggere, contiene la sola gridview con i dati da esportare. Questo sistema presenta alcuni limiti di righe esportabili. Inoltre viene esportato solo
quello che viene visualizzato. A seguire il codice:

<%@ Page Language="VB" enableEventValidation ="false"%>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace=System.Xml%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">


Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs)

'Questa sezione può essere omessa. Si tratta di una personalizzazione fatta secondo mie esigenze

Dim tipo As String
Dim nrreport As String

tipo = Request("tipo")
nrreport = Request("nrreport")


'SEZIONE PER POPOLARE LA GRIDVIEW DI EXPORT

'REPORT CLIENTE
If nrreport = 1 Then

Dim con As SqlConnection
Dim constr As String
Dim cmd As New SqlCommand
Dim read As SqlDataReader
Dim qry1 As String
'Dim qry2 As String
'Dim qry3 As String
'Dim qry4 As String


qry1 = "SELECT * FROM myTable"

constr = ("data source=xxx.xxx.xxx.xxx; " & "initial catalog=mydb; UID=myUser; PWD=myPasword")

con = New SqlConnection(constr)

con.Open()

cmd = New SqlCommand(qry1, con)

read = cmd.ExecuteReader()

Me.GridView1.DataSource = read

Me.GridView1.DataBind()


End If



' SEZIONE EXPORT TO XLS

Response.Clear()
Response.AddHeader("content-disposition", "attachment;filename=FileName.xls")
Response.ContentType = "application/vnd.xls"

Dim sw = New System.IO.StringWriter()
Dim hw = New HtmlTextWriter(sw)

GridView1.RenderControl(hw)
Response.Write(sw.ToString())
Response.End()



End Sub

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As System.Web.UI.Control)
'Do nothing
End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body style="text-align: center">
<form id="form1" runat="server">

<asp:GridView ID="GridView1" runat="server" >
</asp:GridView>

</form>
</body>
</html>

fabiana Profilo | Newbie

Grazie mille per la risposta. Ma scusa la domanda, quindi io devo riscrivere il codice per la connessione al db e per l'esecuzione della query?
Scusa la domanda ma non ne capisco molto, pensavo che servisse solo il codice per esportare ciò che c'è nella gridview visto che tutta la connesisone e secuzione della query la fa già il sqldatasource...
Ogni volta quindi che voglio aggiungere del codice devo cmq rifare la connessione al db?
Grazie ancora
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5