none
como leer Archivo XML Excel 2003 en C# RRS feed

  • Pregunta

  • Hola..

    Quisiera saber si alguien me puede dar pautas de como leer un archivo de este tipo en C#, eh intentado con OLEDB y leerlo con un XmlDocument pero nada, por ejemplo con OLEDB dice que el la tabla a la que hago referencia no esta en el formato adecuado. Utilizo el siguiente codigo.

     string path_File = @"C:\Users\Felipe S\documents\visual studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\ColPasCiudDeptos2.xml";
                string conexionExcelOledb = @"Provider=Microsoft.Jet.OLEDB.4.0;"+
                                            "Data Source="+path_File+";"+
                                            "Extended Properties=Excel 8.0";
                string queryExcel = "Select * From Hoja2";
                DataSet dsExcel = new DataSet();
                System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(conexionExcelOledb);
                conn.Open();//Aquí se rebienta
                System.Data.OleDb.OleDbCommand comand = new System.Data.OleDb.OleDbCommand(queryExcel);
                System.Data.OleDb.OleDbDataAdapter ad = new System.Data.OleDb.OleDbDataAdapter();
                ad.FillSchema(dsExcel, SchemaType.Source);
    Y cuando lo quiero leer con XmlDocument puedo capturar los nodos que llevan como nombre Data que pues son los datos que quiero, pero el problema es que no encuentro la forma de capturar la Hoja (Hoja1, Hoja2, Hoja3 de excel) que requiero. Alguna sugerencia... Este es un trozo del Archivo

    <ss:Worksheet ss:Name="Hoja2">
      <Table ss:StyleID="ta1">
        <Column ss:Width="349.2567"/>
        <Row ss:Height="17.0362">
          <Cell ss:StyleID="ce3">
            <Data ss:Type="String">País Región Código Nombre Del Departamento
            </Data>
          </Cell>
        </Row>
        <Row ss:Height="17.0362">
          <Cell>
            <Data ss:Type="String">057 03 91 AMAZONAS
            </Data>
          </Cell>
        </Row>
        <Row ss:Height="17.0362">
          <Cell>
            <Data ss:Type="String">057 04 05 ANTIOQUIA
            </Data>
          </Cell>
        </Row>
        <Row ss:Height="17.0362">
          <Cell>
            <Data ss:Type="String">057 05 81 ARAUCA</Data>
          </Cell>
        </Row>
        <Row ss:Height="17.0362">
          <Cell>
            <Data ss:Type="String">057 01 08 ATLANTICO</Data>
          </Cell>
        </Row>
    .
    .
    .
    .
    .
    .
    </ss:Worksheet >
    Gracias por cualquier ayuda...

    "En Busqueda del conocimiento"
    domingo, 13 de diciembre de 2009 18:17

Respuestas

  • hola

    en realidad puede especificar namespaces en xml
    C ó mo: Especificar espacios de nombres cuando se utiliza un XmlDocument para ejecutar consultas XPath en C# .NET

    como veras necesitas utilziar la clase XmlNamespaceManager
    para definirlos

    Administrar espacios de nombres mediante XmlNamespaceManager

    veras que ne ele ejemplos

    lode define en estas lineas

    System.Xml.XmlNamespaceManager xmlnsManager = new System.Xml.XmlNamespaceManager(xmldoc.NameTable);

    //Add the namespaces used in books.xml to the XmlNamespaceManager.
    xmlnsManager.AddNamespace("bk", "urn:Books");
    xmlnsManager.AddNamespace("pub", "urn:Publisher");

    y luego lo usa en la consulta xpath

    MSPressBookList = xmldoc.SelectNodes("//pub:Publisher[. = 'MSPress']/parent::node()/bk:Title", xmlnsManager );


    seguramente si analzias el xml en algun punto tienes algo como esto
    <Books xmlns="urn:Books" xmlns:pub="urn:Publisher">

    o sea un xmlns:pub="urn:Publisher" por ahi no con un urn sino con un url del tipo http://.....

    bien esto es la definicion del namespace
    con esta debes armar el XmlNamespaceManager

    analzia estos link que aportan muy buena info de como hacerlo
    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Felipe Sotelo S domingo, 13 de diciembre de 2009 21:53
    domingo, 13 de diciembre de 2009 21:28

Todas las respuestas

  • hola

    pro no enteindo es Excel o XML lo que estas necesitando procesar ?

    segun veo pareciera que es xml, o al menos el archivo que estas definiendo en el path tiene esa extension, pero usas el provider de Excel para OleDb

    o sea como que hay una mezcla
    o sea con el provider de Excel de ado.net no creo que puedas leer o consultar un xml

    ese documento de donde lo estas obteniendo, o mejor dicho quien lo genera ?

    porque si es un excel entonces porque no esta en formato excel?
    o sea con la extension .xls

    si necesitas recuperar por hoja en el xml por ahi con una consulta xpath en donde filtres por atribute ayude

     Manipulate XML data with XPath and XmlDocument (C#)

    veras que en el link menciona que se peude hacer algo como esto: //cd[@country='UK']

    bien en tu caso seria similar solo cambian los nombre de los nodos y el atributo

    ahora una consulta veo que en el xml tienes un namespace, y esto se que trae problemas para cargar el xml

    la pregunta entocnes ahs podido hacer el Load() del xml en el objeto XmlDocument ?
    y no dio ningun error


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 13 de diciembre de 2009 18:43
  • Hola, gracias...

    Mira lo que sucede es que es un archovo ods de openOfice y pues para generar un archivo conpatible con Excel si no estoy mal y lo que te estoy mostrando es un archivo XML compatible con Excel 2003 entonces si con OLEDB no se podria por eso de que es un XML.(No tengo Excel jejej)
    y pues este es el reto leer el archivo tal cual jeje...


    Yo quisiera saber como poder capturar el nodo :
    <ss:Worksheet ss:Name="Hoja2">
      <Table ss:StyleID="ta1">
    O decirle algo como 


     seleccione el nodo que esta nombrado como Talbe pero que tome aquel que su atributo ss:StyleID = "ta1", me imagino que teniendo este nodo ya puedo crear un XmlNodeList con los nodos hijos de este. 








    "En Busqueda del conocimiento"
    domingo, 13 de diciembre de 2009 18:52
  • hola

    pregunta en el medio no podrias hacer la conversion de formatos ?
    por ahi usando algo como esto

    http://odf-converter.sourceforge.net/

    - has probado abrir ese ods desde Excel, la verdad segun veo no se si es tan compatible, o al menos no se si desde Excel podrias verlo


    - segun comentas has podido utilizar XmlDocument para cargar el xml, no ?
    o al menos eso saco como conclusion ya que comentas que has seleccionado por el nodo Table

    bien como lo has realziado por ahi recorriedno a estructura del xml ?
    has probado usar xPath ?

    por ahi algo como //Workseet//Table[@StyleID='ta1']

    como te decia ese xml esta usando namespaces, por ahi esto cause algunos problemas


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 13 de diciembre de 2009 19:07
  • Hola Leandro gracias me diste una idea mira pues no es lo mejor pero al fin tengo este nodo con sus hijo, pero de pronto no habría otra forma de hacerlo:

     string path_File = @"C:\Users\Felipe S\documents\visual studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\ColPasCiudDeptos2.xml";
                StreamReader sr = new StreamReader(path_File);
                XmlDocument xdoc = new XmlDocument();
                xdoc.Load(sr);
                XmlElement ewb = xdoc.DocumentElement;
                XmlNode ndo = ewb.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling;
                XmlNodeList dataList = ndo.ChildNodes;
                XmlNode nodoTable = dataList.Item(0);
                XmlNodeList nodosSolicitados = nodoTable.ChildNodes;
    

    No se por ahy con un foreach pero la cosa radica en que los nombres de los nodos los antesede ss:Woorksheet ss:Name="Hoja2"

    No se ve bien el código quisiera encontrar otra forma de hacerlo....

    "En Busqueda del conocimiento"
    domingo, 13 de diciembre de 2009 20:12
  • hola

    como te decia no has probado con xPath, este es el lenguaje de consulta de XML
    no se si has analziado el linkd e codeproject que te habia paso alli menciona algo sobre el tema

    por ahi podrias probar algo como ser

    string path_File = @"C:\Users\Felipe S\documents\visual studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\ColPasCiudDeptos2.xml";

    XmlDocument xdoc = new XmlDocument();
    xdoc.LoadXml(path_File);

    XmlNodeList dataList = xdoc.SelectNodes("/Worksheet[@Name='Hoja2']/Table");


    como veras si los namespace no molestan esta seleccion es mucho mas simples, ene ste caso tendras la lista de nodos Table que pertence a la Hoja2

    en este link veras que tambien se usa xPath
    XmlNode. SelectNodes

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 13 de diciembre de 2009 20:54
  • Hola, como tu decias genera conflicto con el espacio de nombres:

    XmlNodeList nl = ewb.SelectNodes("//ss:Worksheet[@Name='Hoja2']"); Arroja una excepcion 


    Al intentar de esta forma no encuentra el nodo : Administrador de espacio de nombres o XsltContext necesario. Esta consulta tiene un prefijo, una variable o función definida por el usuario. La cosa es que no se como indicarsela jeje, pues es un XML complejo para mi entender

    Al intentar asi no encuentra el nodo

    XmlNodeList nl = ewb.SelectNodes("//Worksheet[@Name='Hoja2']");

    Tambien intente asi:

     
    XmlNodeList nl = ewb.SelectNodes("/Worksheet[@Name='Hoja2']/Table");

    pues yo se que es un poco absurdo, por que no convertirlo?, la cosa es que deseo conocer algunas cosillas jeje. Gracias

    "En Busqueda del conocimiento"
    domingo, 13 de diciembre de 2009 21:14
  • hola

    en realidad puede especificar namespaces en xml
    C ó mo: Especificar espacios de nombres cuando se utiliza un XmlDocument para ejecutar consultas XPath en C# .NET

    como veras necesitas utilziar la clase XmlNamespaceManager
    para definirlos

    Administrar espacios de nombres mediante XmlNamespaceManager

    veras que ne ele ejemplos

    lode define en estas lineas

    System.Xml.XmlNamespaceManager xmlnsManager = new System.Xml.XmlNamespaceManager(xmldoc.NameTable);

    //Add the namespaces used in books.xml to the XmlNamespaceManager.
    xmlnsManager.AddNamespace("bk", "urn:Books");
    xmlnsManager.AddNamespace("pub", "urn:Publisher");

    y luego lo usa en la consulta xpath

    MSPressBookList = xmldoc.SelectNodes("//pub:Publisher[. = 'MSPress']/parent::node()/bk:Title", xmlnsManager );


    seguramente si analzias el xml en algun punto tienes algo como esto
    <Books xmlns="urn:Books" xmlns:pub="urn:Publisher">

    o sea un xmlns:pub="urn:Publisher" por ahi no con un urn sino con un url del tipo http://.....

    bien esto es la definicion del namespace
    con esta debes armar el XmlNamespaceManager

    analzia estos link que aportan muy buena info de como hacerlo
    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Felipe Sotelo S domingo, 13 de diciembre de 2009 21:53
    domingo, 13 de diciembre de 2009 21:28
  • Hola muchísimas gracias Leandro, eres un Genio!!



    "En Busqueda del conocimiento"
    domingo, 13 de diciembre de 2009 21:55