gabiset
Messages postés53Date d'inscriptionmercredi 14 septembre 2005StatutMembreDernière intervention 9 novembre 2007
-
18 déc. 2006 à 16:04
larry_31
Messages postés3Date d'inscriptionjeudi 20 juillet 2006StatutMembreDernière intervention23 juillet 2008
-
23 juil. 2008 à 09:42
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.
gabiset
Messages postés53Date d'inscriptionmercredi 14 septembre 2005StatutMembreDernière intervention 9 novembre 20071 18 déc. 2006 à 16:30
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 !
zigxag
Messages postés142Date d'inscriptionjeudi 10 février 2005StatutMembreDernière intervention 2 octobre 200812 18 déc. 2006 à 16:37
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.
lassaad83
Messages postés148Date d'inscriptionvendredi 28 avril 2006StatutMembreDernière intervention 1 décembre 2009 4 janv. 2007 à 17:22
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 = ""
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 ...
Vous n’avez pas trouvé la réponse que vous recherchez ?