Export EXCEL d'un GridView

Signaler
Messages postés
53
Date d'inscription
mercredi 14 septembre 2005
Statut
Membre
Dernière intervention
9 novembre 2007
-
Messages postés
3
Date d'inscription
jeudi 20 juillet 2006
Statut
Membre
Dernière intervention
23 juillet 2008
-
Bonjour, j'utilise un GridView pour afficher le résultat d'une requête sur une base de données, et j'aimerais exporter ce tableau vers Excel. Toutes les discussions que j'ai trouvées à ce sujet sur le forum utilisent un DataGrid et appliquent la méthode suivante :

HttpContext.Current.Response.Clear()
HttpContext.Current.Response.Buffer = True
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"
HttpContext.Current.Response.Charset = ""
Dim sw As New StringWriter
Dim tw As New UI.HtmlTextWriter(sw)
MonGridView.RenderControl(tw)
HttpContext.Current.Response.Write(sw.ToString())
HttpContext.Current.Response.End()

Si je mets un DataGrid, cela marche parfaitement. Mais si je mets un GridView, alors j'obtiens le message d'erreur suivant :"Control 'MonGridView' of type 'GridView' must be placed inside a form tag with runat=server." Pourtant, mon GridView est bien dans un form qui comporte runat=server...
Pour info, j'utilise le GridView car je peux modifier son aspect selon mes souhaits contrairement au datagrid...
J'ai essayé d'insérer sur ma page un DataGrid, copie de mon GridView mais sans mise en forme, avec le param Visible=False (puisque je ne veux pas voir ce tableau mais seulement mon GridView), mais dans ce cas l'export du DataGrid ne marche plus...
Quelqu'un peut-il me dire comment faire pour appliquer la méthode d'export Excel sur un GridView ?
Merci d'avance.

6 réponses

Messages postés
53
Date d'inscription
mercredi 14 septembre 2005
Statut
Membre
Dernière intervention
9 novembre 2007
1
J'ai fini par trouver, alors je donne la réponse car cela peut servir à d'autres ;-)

Je crée un nouveau dataset à partir du datatable qui compose mon gridview, et je crée à la volée un datagrid lié à ce dataset :

            export As New DataGrid
            monDataSet = New DataSet()
            monDataSet.Tables.Add(maTableResult)
            export.DataSource = monDataSet
            export.AllowSorting = False
            export.DataBind()
et ensuite j'applique le code donné tout-à-l'heure pour l'export Excel sur mon datagrid export :
            export.RenderControl(tw)
Et ça marche !
Messages postés
142
Date d'inscription
jeudi 10 février 2005
Statut
Membre
Dernière intervention
2 octobre 2008
2
Bonjour,
je pense que le probleme vient du fait que tu effaces le HTTPResponse avec la methode Clear(), et que tu essayes ensuite d'utiliser le GridView (corrigez moi si je me trompe...)


Pour tester, essaye de stocker ton gridview en session (apres son DataBind), puis, avant d'ecrire MonGridView.RenderControl(tw), recupere d'abord ce gridview de ta session.

Tiens moi au courant !

zigxag
Messages postés
53
Date d'inscription
mercredi 14 septembre 2005
Statut
Membre
Dernière intervention
9 novembre 2007
1
Salut zigxag, je ne pense pas que le problème vienne du HTTPResponse puisque en laissant ce code sur un DataGrid cela fonctionne...
Merci quand-même.
Messages postés
148
Date d'inscription
vendredi 28 avril 2006
Statut
Membre
Dernière intervention
1 décembre 2009

Salut,

Je suis bloqué sur un probleme d'export vers Excels depuis un petit bou de temps, alors j'ai quand meme réussi a faire un export grace a ce code :

Private
Sub ExportEx_Cmd_Click(
ByVal sender
As System.Object,
ByVal e
As   
 System.Web.UI.ImageClickEventArgs)
Handles ExportEx_Cmd.Click

               ' On désactive la pagination
DataGrid3.AllowPaging =
False

' On relance la recherche pour avoir tout les information dans le DataGrid
Session().Add("Recherche", "Oui")
Search(
Nothing)
Session().Remove("Recherche")

' On appelle de verifColonne avec le nom du DataGrid concerné en paramètre
VerifColonne(DataGrid3)

' On efface les éventuelles données déjà dans la mémoire tampon
Response.Clear()

' On place tout ce qui est destiné au client dans la mémoire tampon
Response.Buffer =
True
' On définit le type d'informations renvoyée, ici des données au format Excel
Response.ContentType = "application/vnd.ms-excel"

'Response.ContentType = "application/msword"
' On efface le jeux de caractères actuellement défini
Response.Charset = ""

' On instancie deux objets qui vont nous permettre de récupérer les données du DataGrid :
' le StringWriter et l'HtmlTextWriter
Dim monStringWriter
As StringWriter =
New StringWriter

Dim monHtmlTextWriter
As HtmlTextWriter =
New HtmlTextWriter(monStringWriter)

' On extrait le contenu du DataGrid dans l'HtmlTextWriter
DataGrid3.RenderControl(monHtmlTextWriter)

' On copie le contenu extrait dans la mémoire tampon
Response.Write(monStringWriter.ToString())

' On ferme "le flux" de données et envoi les données au client
Response.End()

' On réactive la pagination
DataGrid3.AllowPaging =
True
End
Sub

Private
Sub VerifColonne(
ByVal MonDataGrid
As Control)

' On récupère le nombre de controles enfants composant le DataGrid
Dim NbControls
As
Integer = MonDataGrid.Controls.Count - 1

While NbControls >= 0
VerifColonne(MonDataGrid.Controls(NbControls))
NbControls = NbControls - 1

End
While
' Si la cellule ne contient pas du texte simple
If
Not (
TypeOf MonDataGrid
Is TableCell)
Then
' Si le controle concerné à une prorpiété "Selected Item" alors...
' Remarque : Seul les controles offrant des choix multiples ont une propriété "SelectedItem"
If
Not (MonDataGrid.GetType().GetProperty("SelectedItem")
Is
Nothing)
Then
Dim controleLitteral1
As LiteralControl =
New LiteralControl
MonDataGrid.Parent.Controls.Add(controleLitteral1)

Try
' La cellule prend alors pour valeur le texte correspondant à la propriété "SelectedItem"
controleLitteral1.Text =
CType(MonDataGrid.GetType().GetProperty("SelectedItem").GetValue
MonDataGrid,
Nothing),
String)
controleLitteral1.Text = ""

Catch monException
As Exception

' On récupère l'exception en cas de problème
Response.Write(monException.Message)

End
Try
' Le controle concerné est retiré
MonDataGrid.Parent.Controls.Remove(MonDataGrid)

Else
' Si le controle concerné n'a pas de propriété "SelectedItem" alors on récupère le
' texte (s'il y en a un) de sa propriété "Text"
If
Not (MonDataGrid.GetType().GetProperty("Text")
Is
Nothing)
Then
Dim controleLitteral2
As LiteralControl =
New LiteralControl
MonDataGrid.Parent.Controls.Add(controleLitteral2)

' On attribue le texte de la propriété "Text" à la cellule concernée
If (
CType(MonDataGrid.GetType().GetProperty("Text").GetValue(MonDataGrid,
Nothing),
strring)).Length > 20
Then
controleLitteral2.Text = ""

Else
controleLitteral2.Text =
CType(MonDataGrid.GetType().GetProperty("Text").GetValue
MonDataGrid,
Nothing),
String)

End
If
MonDataGrid.Parent.Controls.Remove(MonDataGrid)

End
If
End
If
End
If
End
Sub

Cependant un probleme perssiste : ce code ne prend pas en charge les caracteres spéciaux, alors résultat des courses j'ai un fichier excel qui me sert pratiquement a rien !!

Est ce que quelqu'un aurais une petite idée de comment on peu résoudre ce probleme? ou un lien qui pourais m'aider..

MERCI ...
Messages postés
1
Date d'inscription
mardi 15 janvier 2008
Statut
Membre
Dernière intervention
15 janvier 2008

Try http://www.gridviewtoexcel.com to get a real gridview export to XML Excel 2003 or XLSX Excel 2007 format.
Messages postés
3
Date d'inscription
jeudi 20 juillet 2006
Statut
Membre
Dernière intervention
23 juillet 2008

 Larry_31
Informaticien
Musicien
Amuseur public
San-Antoniovore
Extermine les c... (et y a du boulot !!!)