Autor
|
Tema: xml-matriz (Leído 3,945 veces)
|
PETTETE
Desconectado
Mensajes: 127
|
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;)
|
|
|
En línea
|
UN SALUDO DE VUESTRO AMIGO Y VECINO, PETETE;)
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.813
|
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.. 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
|
|
« Última modificación: 4 Julio 2017, 09:22 am por Eleкtro »
|
En línea
|
|
|
|
PETTETE
Desconectado
Mensajes: 127
|
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!!!!
|
|
« Última modificación: 4 Julio 2017, 11:21 am por PETTETE »
|
En línea
|
UN SALUDO DE VUESTRO AMIGO Y VECINO, PETETE;)
|
|
|
PETTETE
Desconectado
Mensajes: 127
|
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;)
|
|
|
En línea
|
UN SALUDO DE VUESTRO AMIGO Y VECINO, PETETE;)
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.813
|
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
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Duda - Buscar si existe una matriz dentro de otra matriz
Programación Visual Basic
|
EddyW
|
2
|
5,830
|
14 Agosto 2010, 06:18 am
por EddyW
|
|
|
Matriz Dentro de otra matriz
Programación Visual Basic
|
moba741120
|
3
|
6,748
|
13 Abril 2011, 18:29 pm
por raul338
|
|
|
MATRIZ que imprima como una matriz en forma de cuadrado... ayudaaaaa!! help
Programación C/C++
|
oscarpy
|
3
|
8,515
|
9 Abril 2012, 16:23 pm
por Xandrete
|
|
|
Enviar una matriz desde una funcion a la matriz del main
Programación C/C++
|
erest0r
|
3
|
3,553
|
22 Junio 2013, 09:05 am
por leosansan
|
|
|
Juego con matriz dinámica en c++, función para rrecorrer matriz
Programación C/C++
|
jajaimess
|
1
|
3,429
|
21 Junio 2014, 05:21 am
por .:UND3R:.
|
|