sisi cierto es.. lo siento ahora comparto el codigo, o parte del codigo.
Imports Microsoft.Office.Interop.Excel
Module Module1
Dim xlapp As Microsoft.Office.Interop.Excel.Application
Dim xllibro As Microsoft.Office.Interop.Excel.Workbook
Dim xlhoja As Microsoft.Office.Interop.Excel.Worksheet
Dim numfila As Integer = 1
Dim numcolumna As Integer = 0
Dim bsalida(,)
Dim reader As New System.Xml.XmlTextReader("C:\Users\PEPE\Desktop\PEPE\archivos XML\Imp-BD20170239.XML")
Sub Main()
Dim contents As String = ""
xlapp = New Microsoft.Office.Interop.Excel.Application
xllibro = xlapp.Workbooks.Add
xlhoja = xllibro.Worksheets("Hoja1")
xlapp.Visible = True
While reader.Read()
reader.MoveToContent()
If reader.NodeType = Xml.XmlNodeType.Element Then
contents &= reader.Name & ": "
' datos_array()
End If
If reader.NodeType = Xml.XmlNodeType.Text Then
contents &= reader.Value & _
Microsoft.VisualBasic.ControlChars.CrLf
End If
End While
escribir_excel()
'Console.WriteLine(reader.Name & vbTab & contents)
'Console.ReadLine()
End Sub
public enum c0 as integer
nombre=1
apellido=2
sexo=3
end sub
sub array()
bsalida(fila, c0.nombre)= ???
bsalida(fila, c0.apellido)=???
bsalida(fila, c0.sexo)=???
end sub
Sub escribir_excel()
Dim num_filas As Integer = bsalida.GetLength(0) - 1
Dim num_colus As Integer = bsalida.GetLength(1) - 1
'
Dim rango As Microsoft.Office.Interop.Excel.Range = xlhoja.Range(xlhoja.Cells(1, 1), xlhoja.Cells(num_filas + 1, num_colus)) ' seleccionamos el rango de celdas,
With rango '
.NumberFormat = "@" ' formato texto, para que no quite ceros a izda
.Value = bsalida ' le añadimos la matriz completa,
'.Cells.EntireColumn.AutoFit() ' ajustamos el ancho de las columnas,
'.Interior.Color = Microsoft.Office.Interop.Excel.XlRgbColor.rgbAqua ' y le damos un color
' ALTO DE LA CELDA -----
.RowHeight = 15 ' ALTURA DE LAS CELDAS FIJA, PARA QUE AUTOAJUSTE
End With
End Sub
End Module
Lo que no se es con que igualar los datos del bsalida para que se guarden en el array.
agradecería mucho vuestra ayuda....
En este codigo faltan cosas por poner, me he dado cuenta ahora, en los 2 if reader.nodetype= falta por poner codigo....
A ver, la cosa que tengo un codigo que lee el mismo xml y lo pasa a excel. Pero en vez hacer columnas lo escribe todo en una linea y es lo que tengo que corregir, por eso quiero meterlo en un array.
El segundo codigo del que hablo es este:
Imports System.Xml
Imports Microsoft.Office.Interop.Excel
Module Module1
Dim dato As String = ""
Dim documentoXML As Xml.XmlDocument
Dim nodoprincipal As Xml.XmlNode
Dim xlapp As New Microsoft.Office.Interop.Excel.Application()
Dim xllibro As Microsoft.Office.Interop.Excel.Workbook
Dim xlhoja As Microsoft.Office.Interop.Excel.Worksheet
Dim columna As Integer = 1
Dim fila As Integer = 2
Sub Main()
'''''XML'''''
documentoXML = New Xml.XmlDocument 'CREAMOS OBJETO XML
documentoXML.Load("xml1.XML") 'CARGAMOS XML1 EN OBJETO XML
'Linea1.Text = DocumentoXml.FirstChild.InnerText ' PRIMER NODO=CODIFICACION
nodoprincipal = documentoXML.Item("EnvioEntrada") ' LE DECIMOS QUE ENVIOENTRADA ES EL NODO PRINCIPAL
'''''EXCEL'''''
xllibro = xlapp.Workbooks.Add
xlhoja = xllibro.Worksheets("Hoja1")
xlapp.Visible = True
nodo_cabecera(nodoprincipal)
End Sub
Sub nodo_cabecera(nodoprincipal As Xml.XmlNode)
'ANALIZAMOS EL NODO CABECERA
Dim nodocabecera As Xml.XmlNode
Dim nodohijo As Xml.XmlNode
Dim atributo As XmlAttribute
nodocabecera = nodoprincipal.Item("Cabecera") 'CABECERA ES EL NODO SECUNDARIO
For Each nodohijo In nodocabecera
Select Case nodohijo.Name
Case "Aplicacion" ' NODO HIJO1 DE NODO CABECERA
dato = nodohijo.InnerText
Case "NumeroEnvio" ' NODO HIJO2 DE NODO CABECERA
For Each atributo In nodohijo.Attributes 'ESPECIFICAMOS LOS 3 ATRIBUTOS DEL NODO NUMEROENVIO
If atributo.Name = "Universidad" Then dato = atributo.Value
If atributo.Name = "AñoGeneracionEnvio" Then dato = atributo.Value
If atributo.Name = "Contador" Then dato = atributo.Value
Next
Case "FechaEnvio" ' NODO HIJO3 DE NODO CABECERA
dato = nodohijo.InnerText
End Select
datos_excel_cabecera(nodohijo, nodocabecera, atributo)
Next
nodo_expediente(nodoprincipal, dato, nodocabecera, atributo)
End Sub
Sub nodo_expediente(nodoprincipal As Xml.XmlNode, dato As String, nodocabecera As XmlNode, atributo As XmlAttribute)
'ANALIZAMOS EL NODO EXPEDIENTE
Dim nodoexpediente As Xml.XmlNode 'NODOEXPEDIENTE ES NODO SECUNDARIO
Dim nodohijo As Xml.XmlNode
Dim nombrecabecera As String
For Each nodoexpediente In nodoprincipal 'LEEMOS TODOS LOS NODOS HIJOS DEL NODO EXPEDIENTE
If nodoexpediente.Name <> "Cabecera" Then
For Each nodohijo In nodoexpediente
nombrecabecera = nodoexpediente.Name
Select Case nodohijo.Name
Case "NumeroExpediente"
dato = nodohijo.InnerText 'NUMEROEXPEDIENTE.TEXT = NODOHIJO.INNERTEXT ???
Case "NumeroRegistroUniversitario"
dato = nodohijo.InnerText
Case "NumeroRegistroNacional"
dato = nodohijo.InnerText
Case "DatosPersonales"
If nodohijo.HasChildNodes Then
datospersonales_expediente(nodohijo, nodoexpediente)
End If
Case "TipoTitulo"
dato = nodohijo.InnerText
Case "TipoDocumento"
dato = nodohijo.InnerText
Case "ProgramaConjunto"
dato = nodohijo.InnerText
Case "Estudio"
dato = nodohijo.InnerText
Case "FechaConsejoMinis"
dato = nodohijo.InnerText
Case "FechaPublicacion"
dato = nodohijo.InnerText
Case "FechaFinEstudios"
dato = nodohijo.InnerText
Case "FechaExpedDocumento"
dato = nodohijo.InnerText
Case "CausaPropuesta"
dato = nodohijo.InnerText
Case "Lengua"
dato = nodohijo.InnerText
Case "MencionDoctor"
dato = nodohijo.InnerText
Case "ErasmusMundus"
dato = nodohijo.InnerText
' bsalida(fila, c0.ErasmusMundus)=nodohijo.innertext
Case "CodCentro"
dato = nodohijo.InnerText
End Select
If nodohijo.Name = "DatosPersonales" Then
GoTo SALTAR
End If
datos_excel_expediente(nodohijo, nodoexpediente, nodocabecera, atributo)
SALTAR:
Next
End If
Next
'xlhoja.Range("F2:H2").Merge() '4 LINEAS PARA:
'xlhoja.Range("F2:H2").Value = "Prueba de combinación" ' COMBINAR CELDAS
'xlhoja.Range("F1:H1").Merge() ' Y DARLES NUEVOS VALORES
'xlhoja.Range("F1:H1").Value = "AAAAA"
End Sub
Sub datos_excel_cabecera(nodohijo, nodocabecera, atributo)
'ESCRIBIMOS LOS DATOS DEL NODO CABECERA
xlhoja.Rows(1).Font.Bold = True ' PRIMERA LINEA DEL EXCEL EN NEGRITA
xlapp.Worksheets("Hoja1").cells(1, columna) = nodohijo.name
xlapp.Worksheets("Hoja1").cells(2, columna) = nodohijo.innertext
columna += 1
For Each atributo In nodohijo.attributes
xlapp.Worksheets("Hoja1").cells(1, columna) = atributo.name
xlapp.Worksheets("Hoja1").cells(2, columna) = atributo.value
columna += 1
Next
End Sub
Sub datos_excel_expediente(nodohijo, nodoexpediente, nodocabecera, atributo)
'ESCRIBIMOS LOS DATOS DEL NODO EXPEDIENTE (MENOS LOS HIJOS DEL NODO DATOS PERSONALES)
'If nodohijo.name = "NumeroExpediente" Then
' fila += 1
' columna = 7
'End If
xlapp.Worksheets("Hoja1").cells(1, columna) = nodohijo.name
'seguir1:
xlapp.Worksheets("Hoja1").cells(fila, columna) = nodohijo.innertext
columna += 1
End Sub
Sub datospersonales_expediente(nodohijo, nodocabecera)
'ESCRIBIMOS LOS NODOS HIJO DEL NODO HIJO DATOS PERSONALES
For Each nodohijo In nodohijo.childnodes
xlapp.Worksheets("Hoja1").cells(1, columna) = nodohijo.Name
xlapp.Worksheets("Hoja1").cells(fila, columna) = nodohijo.innertext
columna += 1
Next
End Sub
End Module
HE intentado poner aqui la enumeración y definir el array bsalida(fila, enumeracion). En algun sitio tiene que estar comentado algun ejemplo de eso.
La cosa es que en el excel tienen que aparecer los nombres de los hijos de cada registro en la fila 1 y los datos en las filas 2 en adelante..
Algun registro tiene 1 dato que los otros no y esto modifica todo el excel porque no respeta el nodohijo.name del nodo hijo( hermano).
No se si me estoy explicando bien...
Yo comparto los dos codigos y en caso de duda preguntar que os contestare lo mas claro que pueda..
Un saludo y muchas gracias!!!!