VB.NET Données XML -> Excel
Dernière réponse : dans Programmation
Bonjour,
J'aimerai transférer des données d'un fichier XML dans un classeur Excel tous ceci en VB.NET ,est ce que quelqu'un aurai une idée?
Merci d'avance !!
J'aimerai transférer des données d'un fichier XML dans un classeur Excel tous ceci en VB.NET ,est ce que quelqu'un aurai une idée?
Merci d'avance !!
Autres pages sur : net donnees xml excel
Lassé par la pub ? Créez un compte
Ca ne change rien...
Tu as deux solutions en utilisant du CSV:
- soit tu parses le fichier XML en .Net et tu recréé un fichier CSV avec. Il faut noter que tu as des librairies qui te permettent de générer du CSV. Parce que le format CSV est un peu plus compliqué que de mettre juste une virgule entre les deux valeurs.
- soit tu utilises XSLT qui va transformer ton fichier XML en ce que tu veux (CSV par exemple). Tu as sur ce lien deux exemples de code XSLT qui font ça.
Et puis sinon, si tu veux transformer ton fichier XML en un fichier lisible par Excel, tu peux lire ce lien: http://articles.techrepublic.com.com/5100-10878_11-6163...
Tu as deux solutions en utilisant du CSV:
- soit tu parses le fichier XML en .Net et tu recréé un fichier CSV avec. Il faut noter que tu as des librairies qui te permettent de générer du CSV. Parce que le format CSV est un peu plus compliqué que de mettre juste une virgule entre les deux valeurs.
- soit tu utilises XSLT qui va transformer ton fichier XML en ce que tu veux (CSV par exemple). Tu as sur ce lien deux exemples de code XSLT qui font ça.
Et puis sinon, si tu veux transformer ton fichier XML en un fichier lisible par Excel, tu peux lire ce lien: http://articles.techrepublic.com.com/5100-10878_11-6163...
Pour le moment j'ai ceci :
Cela devrai fonctionner non ?? Il devrait m'afficher un message box
Imports System.Xml Imports System.IO Public Class Form1 Public Sub Form1() 'creation d'une nouvelle instance du membre xmldocument Dim XmlDoc As XmlDocument = New XmlDocument() XmlDoc.Load("C:\Users\toto.xml") Dim element As XmlNodeList element = XmlDoc.DocumentElement.GetElementsByTagName("NewDataSet") Dim noeud, noeudEnf As XmlNode Dim UrlSite As String Dim NomSite As String For Each noeud In element For Each noeudEnf In noeud.ChildNodes If noeudEnf.LocalName = "PropertyIdentifier" Then UrlSite = noeudEnf.InnerText Else If (noeudEnf.LocalName = "PropertyValue") Then NomSite = noeudEnf.InnerText End If End If MsgBox(NomSite & " à " & UrlSite) Next Next End Sub End Class
Cela devrai fonctionner non ?? Il devrait m'afficher un message box
Tout dépend à quoi ressemble ton fichier XML...
Ta ligne 13 me parait bizarre, si ton fichier XML est un dataset sérialisé, tu auras NewDataSet en tant que DocumentElement.
Donc tu ne pourras pas faire XmlDoc.DocumentElement.GetElementsByTagName("NewDataSet")
J'aurais plutôt mis element = XmlDoc.DocumentElement.ChildNodes à cette ligne 13, mais c'est sans avoir regardé ton fichier XML...
Ta ligne 13 me parait bizarre, si ton fichier XML est un dataset sérialisé, tu auras NewDataSet en tant que DocumentElement.
Donc tu ne pourras pas faire XmlDoc.DocumentElement.GetElementsByTagName("NewDataSet")
J'aurais plutôt mis element = XmlDoc.DocumentElement.ChildNodes à cette ligne 13, mais c'est sans avoir regardé ton fichier XML...
Mon code XML est:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<DictationProperties>
<PropertyIdentifier>SpecialInstructionsLength</PropertyIdentifier>
<PropertyValue>0</PropertyValue>
</DictationProperties>
<DictationProperties>
<PropertyIdentifier>DictationLength</PropertyIdentifier>
<PropertyValue>2624</PropertyValue>
</DictationProperties>
<DictationProperties>
<PropertyIdentifier>CreationDateTime</PropertyIdentifier>
<PropertyValue>2010-01-28 09:16:18</PropertyValue>
</DictationProperties> ...
Donc c'est bien ce que je disais.
Vu que NewDataSet est ton élément root, si tu fais XmlDoc.DocumentElement, ça va te retourner ton noeud NewDataSet.
Donc, si tu fais XmlDoc.DocumentElement.GetElementsByTagName("NewDataSet"), ça va te retourner rien du tout.
Tu dois soit faire (je préfère utiliser SelectNodes que GetElementsByTagName) :
soit faire
Et au passage, appeler "element" une variable de type XmlNodeList, c'est confu...
Vu que NewDataSet est ton élément root, si tu fais XmlDoc.DocumentElement, ça va te retourner ton noeud NewDataSet.
Donc, si tu fais XmlDoc.DocumentElement.GetElementsByTagName("NewDataSet"), ça va te retourner rien du tout.
Tu dois soit faire (je préfère utiliser SelectNodes que GetElementsByTagName) :
element = XmlDoc.DocumentElement.SelectNodes("DictationProperties")
soit faire
element = XmlDoc.DocumentElement.ChildNodes
Et au passage, appeler "element" une variable de type XmlNodeList, c'est confu...
J'en suis ici :
Mai dans mon MessageBox il ne me retourne pas les valeurs de mon fichier XML.
Imports System.Xml
Imports System.IO
Public Class Form1
Public Sub Form1()
'creation d'une nouvelle instance du membre xmldocument
Dim XmlDoc As XmlDocument = New XmlDocument()
XmlDoc.Load("C:\Users\Philippe\Documents\speechexec\a_finish\philippe069.ds2.xml")
Dim XmlNodeList As XmlNodeList
'element = XmlDoc.DocumentElement.GetElementsByTagName("NewDataSet")
XmlNodeList = XmlDoc.DocumentElement.SelectNodes("DictationProperties")
Dim noeud, noeudEnf As XmlNode
Dim PropertyIdentifier As String
Dim PropertyValue As String
For Each noeud In XmlNodeList
For Each noeudEnf In noeud.ChildNodes
If noeudEnf.LocalName = "PropertyIdentifier" Then
PropertyIdentifier = noeudEnf.InnerText
Else
If (noeudEnf.LocalName = "PropertyValue") Then
PropertyValue = noeudEnf.InnerText
End If
End If
Next
Next
End Sub
Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim PropertyIdentifier As String
Dim PropertyValue As String
MessageBox.Show(PropertyValue & " à " & PropertyIdentifier)
End Sub
End Class
Mai dans mon MessageBox il ne me retourne pas les valeurs de mon fichier XML.
Euh, tu m'expliques comment tu veux qu'il te retourne les valeurs de ton fichier XML ?
Dans ton constructeur, tu créés 2 variables PropertyIdentifier et PropertyValue, que tu initialises autant de fois qu'il y a des noeuds DictationProperties.
Tes 2 variables sont locales au constructeur, donc une fois sorti du constructeur, elles n'existent plus.
Et dans ton évènement Click, tu recréé deux variables PropertyIdentifier et PropertyValue, sans les initialiser, et tu affiches leur valeur, qui doit être "Nothing" en VB.
Si tu fais ça :
Est-ce que ça marche (j'ai juste ajouté l'avant dernière ligne) ?
Ca devrait t'afficher une seule message box avec les derniers résultats de ton fichier XML.
Dans ton constructeur, tu créés 2 variables PropertyIdentifier et PropertyValue, que tu initialises autant de fois qu'il y a des noeuds DictationProperties.
Tes 2 variables sont locales au constructeur, donc une fois sorti du constructeur, elles n'existent plus.
Et dans ton évènement Click, tu recréé deux variables PropertyIdentifier et PropertyValue, sans les initialiser, et tu affiches leur valeur, qui doit être "Nothing" en VB.
Si tu fais ça :
Public Sub Form1() 'creation d'une nouvelle instance du membre xmldocument Dim XmlDoc As XmlDocument = New XmlDocument() XmlDoc.Load("C:\Users\Philippe\Documents\speechexec\a_finish\philippe069.ds2.xml" ) Dim XmlNodeList As XmlNodeList 'element = XmlDoc.DocumentElement.GetElementsByTagName("NewDataSet" ) XmlNodeList = XmlDoc.DocumentElement.SelectNodes("DictationProperties" ) Dim noeud, noeudEnf As XmlNode Dim PropertyIdentifier As String Dim PropertyValue As String For Each noeud In XmlNodeList For Each noeudEnf In noeud.ChildNodes If noeudEnf.LocalName = "PropertyIdentifier" Then PropertyIdentifier = noeudEnf.InnerText Else If (noeudEnf.LocalName = "PropertyValue" ) Then PropertyValue = noeudEnf.InnerText End If End If Next Next MessageBox.Show(PropertyValue & " à " & PropertyIdentifier) End Sub
Est-ce que ça marche (j'ai juste ajouté l'avant dernière ligne) ?
Ca devrait t'afficher une seule message box avec les derniers résultats de ton fichier XML.
Bah un fichier CSV c'est juste des données séparées par point-virgule. Tu mets le nom des colonnes dans la première ligne du fichier.
Après, chaque donnée se retrouvera dans une colonne différente. Un saut de ligne pour commencer une nouvelle ligne et c'est fini.
T'as qu'à créer un fichier toto.csv sur ton bureau avec ces données et tu l'ouvres avec Excel:
Sinon, il faut regarder le format XML accepté par Excel, et le recréer manuellement, mais ça sera certainement beaucoup plus compliqué que ça.
A noter que tu as des outils qui te permettent de créer des fichiers CSV facilement (parce que c'est un peu plus compliqué que ça, au cas où t'as une donnée sur plusieurs lignes, ou si t'as un point virgule dans les données, etc...). Une petite recherche sur google te donnera ça.
Après, chaque donnée se retrouvera dans une colonne différente. Un saut de ligne pour commencer une nouvelle ligne et c'est fini.
T'as qu'à créer un fichier toto.csv sur ton bureau avec ces données et tu l'ouvres avec Excel:
Nom;Prénom;Age
Toto;Tata;18
Titi;Tutu;24
Tété;Tyty;32
Sinon, il faut regarder le format XML accepté par Excel, et le recréer manuellement, mais ça sera certainement beaucoup plus compliqué que ça.
A noter que tu as des outils qui te permettent de créer des fichiers CSV facilement (parce que c'est un peu plus compliqué que ça, au cas où t'as une donnée sur plusieurs lignes, ou si t'as un point virgule dans les données, etc...). Une petite recherche sur google te donnera ça.
Oui pardon, c'est pour de l'ASP.Net...
Quelque chose dans ce genre:
Quelque chose dans ce genre:
Dim fs As FileStream = Nothing Dim sw As StreamWriter = Nothing Dim separator AS String = ";" Dim nomFichier AS String = "C:\\fichier.csv" Try 'Supprime le fichier cible si existant If File.Exists(nomFichier) Then IO.File.Delete(nomFichier) 'Ouvre/crée le fichier fs = New FileStream(nomFichier, FileMode.CreateNew, FileAccess.Write) sw = New StreamWriter(fs, System.Text.Encoding.UTF7) 'Ecrit les entêtes de colonnes sw.WriteLine("Column1" & separator & "Column2" & separator & "Column3") 'Ecrit les lignes sw.WriteLine("valeur1" & separator & "toto" & separator & "ma valeur") sw.WriteLine("ligne2" & separator & "tata" & separator & "titi") sw.WriteLine("ligne3" & separator & "arf" & separator & "jifrej") Finally 'Libération des ressources If sw IsNot Nothing Then sw.Close() If sw IsNot Nothing Then sw.Dispose() If fs IsNot Nothing Then fs.Dispose() End Try
J'ai fait sa et j'ai du ajouter :
Les deux ligne du bas. Mais quand je lis mon fichier aucune valeur dans ma feuille Excel.
Et puis mon fichier XML est :
Pour récupérer les valeurs :
Mais pour les afficher une part une dans un tableau, comment faire ?
Public Class Form1
Dim PropertyIdentifier As String
Dim PropertyValue As String
Les deux ligne du bas. Mais quand je lis mon fichier aucune valeur dans ma feuille Excel.
Et puis mon fichier XML est :
<PropertyIdentifier>Custom1</PropertyIdentifier>
<PropertyValue>Bob</PropertyValue>
</DictationProperties>
<DictationProperties>
<PropertyIdentifier>Custom2</PropertyIdentifier>
<PropertyValue>28/05/1988</PropertyValue>
</DictationProperties>
Pour récupérer les valeurs :
For Each noeud In XmlNodeList
For Each noeudEnf In noeud.ChildNodes
If noeudEnf.LocalName = "PropertyIdentifier" Then
PropertyIdentifier = noeudEnf.InnerText
Else
If (noeudEnf.LocalName = "PropertyValue") Then
PropertyValue = noeudEnf.InnerText
End If
End If
Next
If PropertyIdentifier = "Custom1" Then
MessageBox.Show(PropertyIdentifier & " = " & PropertyValue)
End If
If PropertyIdentifier = "Custom2" Then
MessageBox.Show(PropertyIdentifier & " = " & PropertyValue)
End If
If PropertyIdentifier = "Custom3" Then
MessageBox.Show(PropertyIdentifier & " = " & PropertyValue)
End If
If PropertyIdentifier = "Custom4" Then
MessageBox.Show(PropertyIdentifier & " = " & PropertyValue)
End If
Next
Mais pour les afficher une part une dans un tableau, comment faire ?
Imports System.Xml
Imports System.IO
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Excel
Public Class Form1
Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim separator As String = ";"
Dim fs As FileStream = Nothing
Dim sw As StreamWriter = Nothing
Dim nomFichier As String = "C:\Users\Philippe\Documents\speechexec\a_finish\Test.csv"
Dim noeud, noeudEnf As XmlNode
Dim PropertyIdentifier As String
Dim PropertyValue As String
Try
'Supprime le fichier cible si existant
If File.Exists(nomFichier) Then IO.File.Delete(nomFichier)
'Ouvre/crée le fichier
fs = New FileStream(nomFichier, FileMode.CreateNew, FileAccess.Write)
sw = New StreamWriter(fs, System.Text.Encoding.UTF8)
'Ecrit les entêtes de colonnes
sw.WriteLine("N° Dossier" & separator & "Nom" & separator & "Prenom" & separator & "Date Naissance")
'Ecrit les lignes
'creation d'une nouvelle instance du membre xmldocument
Dim XmlDoc As XmlDocument = New XmlDocument()
XmlDoc.Load("C:\Users\Philippe\Documents\speechexec\a_finish\WelcomeToSpeechExec.dss.xml")
Dim XmlNodeList As XmlNodeList
XmlNodeList = XmlDoc.DocumentElement.SelectNodes("DictationProperties")
For Each noeud In XmlNodeList
For Each noeudEnf In noeud.ChildNodes
If noeudEnf.LocalName = "PropertyIdentifier" Then
PropertyIdentifier = noeudEnf.InnerText
Else
If (noeudEnf.LocalName = "PropertyValue") Then
PropertyValue = noeudEnf.InnerText
End If
End If
Next
If PropertyIdentifier = "Custom1" Then
MessageBox.Show(PropertyIdentifier & " = " & PropertyValue)
sw.WriteLine(PropertyValue & separator & "..." & separator & "..." & separator & "...")
End If
If PropertyIdentifier = "Custom2" Then
MessageBox.Show(PropertyIdentifier & " = " & PropertyValue)
sw.WriteLine(PropertyValue & separator & "..." & separator & "..." & separator & "...")
End If
If PropertyIdentifier = "Custom3" Then
MessageBox.Show(PropertyIdentifier & " = " & PropertyValue)
sw.WriteLine(PropertyValue & separator & "..." & separator & "..." & separator & "...")
End If
If PropertyIdentifier = "Custom4" Then
MessageBox.Show(PropertyIdentifier & " = " & PropertyValue)
sw.WriteLine(PropertyValue & separator & "..." & separator & "..." & separator & "...")
End If
Next
Finally
'Libération des ressources
If sw IsNot Nothing Then sw.Close()
If sw IsNot Nothing Then sw.Dispose()
If fs IsNot Nothing Then fs.Dispose()
End Try
End Sub
End Class
Le problème est juste qu'il change de ligne pour m'écrire la valeur de Custom1 Custom2 ... alors que j'aimerai qu'il change juste de colonne.
Alors... Je vais un peu arranger pour utiliser Using plutôt que le block Try / Finally.
Je suis pas habitué au VB.Net aussi, c'est pour ça
(Qu'est ce que c'est moche du VB
)
Je suis pas habitué au VB.Net aussi, c'est pour ça
(Qu'est ce que c'est moche du VB
)
Imports System.Xml Imports System.IO Imports Microsoft.Office.Interop Imports Microsoft.Office.Interop.Excel Public Class Form1 Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim separator As String = ";" Dim nomFichier As String = "C:\Users\Philippe\Documents\speechexec\a_finish\Test.csv" Dim noeud, noeudEnf As XmlNode Dim PropertyIdentifier As String Dim PropertyValue As String Dim NoDossier, Nom, Prenom, DateNaissance As String 'Supprime le fichier cible si existant If File.Exists(nomFichier) Then IO.File.Delete(nomFichier) 'Ouvre/crée le fichier Using fs As FileStream = New FileStream(nomFichier, FileMode.CreateNew, FileAccess.Write) Using sw As StreamWriter = New StreamWriter(fs, System.Text.Encoding.UTF8) 'Ecrit les entêtes de colonnes sw.WriteLine("N° Dossier" & separator & "Nom" & separator & "Prenom" & separator & "Date Naissance") 'Ecrit les lignes Dim XmlDoc As XmlDocument = New XmlDocument() XmlDoc.Load("C:\Users\Philippe\Documents\speechexec\a_finish\WelcomeToSpeechExec.dss.xml" ) Dim XmlNodeList As XmlNodeList XmlNodeList = XmlDoc.DocumentElement.SelectNodes("DictationProperties" ) For Each noeud In XmlNodeList For Each noeudEnf In noeud.ChildNodes If noeudEnf.LocalName = "PropertyIdentifier" Then PropertyIdentifier = noeudEnf.InnerText Else If (noeudEnf.LocalName = "PropertyValue" ) Then PropertyValue = noeudEnf.InnerText End If End If Next If PropertyIdentifier = "Custom1" Then NoDossier = PropertyValue End If If PropertyIdentifier = "Custom2" Then Nom = PropertyValue End If If PropertyIdentifier = "Custom3" Then Prenom = PropertyValue End If If PropertyIdentifier = "Custom4" Then DateNaissance = PropertyValue End If sw.WriteLine(NoDossier & separator & Nom & separator & Prenom & separator & DateNaissance) Newt End Using End Using End Sub End Class
Un grand MERCI !! Juste un problème avec la ligne :
Il faut la mettre après le Next.
Une dernière question :
Dans le logiciel j'aurai ouvert un fichier par exemple : WelcomeToSpeechExec.dss et quand j'appuierai sur Terminé, mon logiciel va créer un fichier WelcomeToSpeechExec.dss.xml ( ce qui est deja fait ) et va retransmettre les données de se XML dans un tableau Excel ( ce qui est deja fait aussi), mais comment à la place de :
Je peux mettre le meme nom de fichier qui sera ici "WelcomeToSpeechExec.dss" +".xml" car quand je vais lancer mon programme là, je n'aurai que les données de WelcomeToSpeechExec.dss qui seront inscrites dans mon tableau. Mais je peux avoir comme nom de fichier "toto.dss"
J'espère que tu as compris, car j'explique très très mal.
sw.WriteLine(NoDossier & separator & Nom & separator & Prenom & separator & DateNaissance)
Il faut la mettre après le Next.
Une dernière question :
Dans le logiciel j'aurai ouvert un fichier par exemple : WelcomeToSpeechExec.dss et quand j'appuierai sur Terminé, mon logiciel va créer un fichier WelcomeToSpeechExec.dss.xml ( ce qui est deja fait ) et va retransmettre les données de se XML dans un tableau Excel ( ce qui est deja fait aussi), mais comment à la place de :
XmlDoc.Load("C:\Users\Philippe\Documents\speechexec\a_finish\WelcomeToSpeechExec.dss.xml" )
Je peux mettre le meme nom de fichier qui sera ici "WelcomeToSpeechExec.dss" +".xml" car quand je vais lancer mon programme là, je n'aurai que les données de WelcomeToSpeechExec.dss qui seront inscrites dans mon tableau. Mais je peux avoir comme nom de fichier "toto.dss"
J'espère que tu as compris, car j'explique très très mal.
Non il ouvre bien WelcomeToSpeechExec.dss.xml mais je veux a la place de WelcomeToSpeechExec.dss une variable du genre "nomfichier".xml qui va chercher le nom du fichier qui est ouvert par exemple WelcomeToSpeechExec.dss ou toto.dss et qui va choisir WelcomeToSpeechExec.dss.xml ou toto.dss.xml et qui va ajouter les données xml dans le tableau.
Oui c'est bon aussi, ce code est bon pour faire ca :
' Fonction permettant de récupérer tous les fichiers se trouvant dans un dossier
Private Function Recuperation_Fichier(ByVal NomDossier As String) As ArrayList
Dim i, j As Integer
Dim ListeFichiers As ArrayList
ListeFichiers = New ArrayList()
'detection des fichiers
Dim Fichiers As String()
Fichiers = Directory.GetFiles(NomDossier)
'ajout à la collection
For i = 0 To Fichiers.Length - 1
ListeFichiers.Add(Fichiers(i))
Next
'detection de tous les dossiers
Dim Dossiers As String()
Dossiers = Directory.GetDirectories(NomDossier)
'Récupération des fichiers se trouvant dans les dossiers
Dim MesFichiers As ArrayList
MesFichiers = New ArrayList()
For i = 0 To Dossiers.Length - 1
' récupération des fichiers
MesFichiers = Recuperation_Fichier(Dossiers(i))
' ajout à la collection
For j = 0 To MesFichiers.Count - 1
ListeFichiers.Add(MesFichiers(j))
Next
Next
Return ListeFichiers
End Function
'Fonction permettant de récuperer le fichier dss parmis les différents fichiers nouveaux
Private Function RechercheDSS(ByVal FichiersAnciens As ArrayList, ByVal FichiersActuels As ArrayList)
Dim i, j As Integer
Dim nouveau As Boolean
Dim NouveauxFichiers As ArrayList
NouveauxFichiers = New ArrayList()
'Recherche des nouveaux fichiers
For i = 0 To FichiersActuels.Count - 1
nouveau = True
' Regarde si le fichier trouvé est identique à un ancien fichier
For j = 0 To FichiersAnciens.Count - 1
If (FichiersActuels(i) = FichiersAnciens(j)) Then
nouveau = False
End If
Next
' Si ce fichier n'était pas repertorié dans la liste des anciens fichiers, il est considéré comme nouveau
If (nouveau) Then
NouveauxFichiers.Add(FichiersActuels(i))
End If
Next
'Recherche du fichier dss
Dim NomRenvoye As String = ""
Dim NomFichier As String
For i = 0 To NouveauxFichiers.Count - 1
NomFichier = NouveauxFichiers(i)
If (NomFichier.Substring(NomFichier.Length - 4, 4) = ".xml") Then
NomRenvoye = NomFichier
End If
Next
Return NomRenvoye
End Function
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumImportation excel vers vb .net datagridview
- ForumVb .net tester reference excel
- ForumVb net ouvrir fichier excel
- ForumCopier fichier excel sur printdocument vb net
- ForumVb net excel
- ForumRemplir excel 2007 depuis application vb net
- ForumOuvrir un fichier excel avec vb .net
- ForumAjouter element xml vb net
- ForumVb .net ecrire dans un fichier excel
- ForumVb net lier excel a sql
- Voir plus