Hola buenas,
estoy intentando guardar un archivo xml en una matriz peor no me sale..
e.j del xml:
envio
cabecera
aplicacion =12
datos
personales
nombre=pepe
color= rojo
estoy intentando guardar los datos por filas y columnas apra luego apsar al excel, pero la matriz se me queda vacia, los datos no se guardan..
¿algún con sejo de como puedo hacerlo?
toda ayuda es bien agradecida.
Un saludo de vuestro amigo y vecino,
PETETE;)
Cita de: PETTETE en 4 Julio 2017, 08:13 AMestoy intentando guardar los datos por filas y columnas apra luego apsar al excel, pero la matriz se me queda vacia, los datos no se guardan..
Bueno, ¿pero vas a mostrarnos el código que estás utilizando para realizar tal operación de conversión y así poder intentar ayudarte a descubrir donde está el fallo, o debemos sacar la bola de cristal para adivinarlo?. Lo siento pero he perdido la cuenta de todas las veces que te habré repetido la ausencia de información...
De todas formas, tienes a tu disposición la clase
System.Xml.Linq.XElement para representar el contenido de un documento Xml, entre otras clases relacionadas, y yo supongo que ya estarás utilizando alguna de esas clases, entonces, ¿por qué te resulta tan necesaría la conversión de un tipo cuya función es precisamente la de representar un documento Xml, a un Array uni o multidimensional?.
Saludos
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!!!!
Hola buenas,
El mismo problema pero intento realizarlo de una manera. el codigo me da ERROR.
primero leo el xml, segundo, guardo lo que leo en un string y asigno el string a una posicion de un array.
Dim bsalida(,) As String
Dim dato1 As String
Public Enum c0 As Integer
aplicacion = 2
End Enum
For Each nodohijo In nodocabecera
Select Case nodohijo.Name
Case "Aplicacion" ' NODO HIJO1 DE NODO CABECERA
dato1 = nodohijo.InnerText
Next
bsalida(fila, c0.aplicacion) = dato1
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
xlapp.ReferenceStyle = Microsoft.Office.Interop.Excel.XlReferenceStyle.xlR1C1 'xlR1C1
Este codigo es el mio pero acortado. Es lo mismo pero una enumeracion mas larga mas datos como string y demás..
La cosa es que al ejecutar este codigo me da error nada mas lee bsalida(fila, c0.aplicacion)=dato1.
El error es el siguiente: Referencia a objeto no establecida como instancia de un objeto.
Agradecería mucho una ayudita..
Un saludo de vuestro amigo y vecino,
PETETE;)
Cita de: PETTETE en 7 Julio 2017, 09:56 AM
bsalida(fila, c0.aplicacion)=dato1
El error es el siguiente: Referencia a objeto no establecida como instancia de un objeto.
El error se explica por si mismo, te está diciendo que uno de los siguientes objetos es nulo (Nothing):
fila, o el valor devuelto por el miembro
bsalidaDepura tu código para comprobar cual es la referencia nula.
Saludos