• Jueves 28 de Marzo de 2024, 14:38

Autor Tema:  no consigo conectar con Excel mediante OleDb  (Leído 8890 veces)

picyo

  • Visitante
no consigo conectar con Excel mediante OleDb
« en: Martes 29 de Enero de 2013, 18:03 »
0
Pues no se porque me falla mi conexión, por mas que he probado todas las cadenas de conexión que he visto. Quiero simplemente conectar con una hoja de excel e implementarla (leerla) en mi dataGreedView1. En efecto. Algo bastante estúpido que no funciona, a pesar de toda la información que hay en este foro y en todo Google, no encuentro pq falla...
Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


using System.Data.OleDb;
using Excel = Microsoft.Office.Interop.Excel;

namespace leer_excel
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btLeerExcel_Click(object sender, EventArgs e)
        {
            try
            {
                OleDbConnection MyConnection;
                DataSet DtSet;
                OleDbDataAdapter MyCommand;
                MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;");
                MyCommand = new OleDbDataAdapter("select * from [Hoja1$]", MyConnection);
                MyCommand.TableMappings.Add("Table", "TestTable");
                DtSet = new DataSet();
                MyCommand.Fill(DtSet);
                dataGridView1.DataSource = DtSet.Tables[0];
                MyConnection.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}
- cabe decir que si he hecho referencia en el explorador de solucuiones, en el apartado reference, a Microsoft.Office.Interop.Excel
- También he probado poner la ruta exacta de mi archivo excel, o sin poner la ruta (tal como esta ahora), para ver si lo  coge  de forma local...
« última modificación: Martes 29 de Enero de 2013, 20:26 por picyo »

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #1 en: Miércoles 30 de Enero de 2013, 21:06 »
0
Ya te había contestado por mensaje privado, sin embargo veo que ya puedo responder al tema.. te copio la respuesta de nuevo.

Es un ejemplo de como lo haría..

Código: C#
  1.  
  2.   string ruta = "C:\\Movimientos.xls"; //Aquí supongo que está la ruta de mi archivo en excel.
  3.                 System.Data.Odbc.OdbcConnection conexionExcel =
  4.                 new System.Data.Odbc.OdbcConnection("Driver={Microsoft Excel Driver (*.xls)};Dbq=" + ruta + ";ReadOnly=0;");
  5.                 //En mi ejemplo yo tengo una "tabla" llamada movimientos.. pero en excel se especifica de esa manera
  6.                 //con los corchetes y el signo de $                
  7.                 System.Data.Odbc.OdbcDataAdapter adaptadorExcel =
  8.                 new System.Data.Odbc.OdbcDataAdapter ("SELECT * FROM [Movimientos$] ", conexionExcel);
  9.                 System.Data.DataTable dtExcel =
  10.                 new System.Data.DataTable("Movimientos");
  11.                 adaptadorExcel.Fill(dtExcel); //Aquí lleno mi datatable, luego sólo le asignas al DataSource del gridview ese datatable.
  12.  
  13.  


Saludos!
« última modificación: Lunes 11 de Febrero de 2013, 00:55 por ProfesorX »
@gabio87

picyo

  • Visitante
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #2 en: Jueves 31 de Enero de 2013, 17:20 »
0
Hola!
Gracias por la respuesta!
Si, vi el mensaje privado. Bueno, ahora he realizado la prueba, y me pasa exactamente igual. Tengo la duda en el nombre del archivo, si has de poner la ruta entera, o el compilador se da cuenta que esta en la c:// (en mi caso e://). de todos modos, probé las dos. he de decir que me pasa lo mismo...y vi como "solucionarlo". Lo entrecomillo, pq no es una solución... es algo que debería arreglar:
El hecho es que si tengo mi hoja de excel abierta, si se carga el DataGridView con los datos dela hoja. vamos..como si estuvieramos en SQL y debieramos tener la conexión de SQL Server de Microsoft abierta, pues igual. Y digo yo... si he de abrir una cosa que ya está abierta... ( volviendo a mi caso con OleDB). Vamos, quiero abrir un archivo, o x archivos directamente desde la aplicación de escritorio.
¿Cómo puedo hacer que se conecte .NET sin tener la hoja abierta?

cachorro

  • Miembro MUY activo
  • ***
  • Mensajes: 196
  • Nacionalidad: ec
    • Ver Perfil
    • http://www.pumamix.com
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #3 en: Jueves 31 de Enero de 2013, 19:50 »
0
yo hice eso alguna vez..recuerdo que lo hice identico a la conexion como si estuviera habriendo una base acces, creo q era como te lo menciono gabio2...
La Vida es un Reto..Enfrentala....

picyo

  • Visitante
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #4 en: Sábado 2 de Febrero de 2013, 09:57 »
0
Pues consigo siempre lo mismo... me pasa con Odbc  lo mismo que con OleDb. He de tener la hoja abierta.

Es posible que me deje alguna cosa..? Abrís algún DataResource como si estuviésemos abriendo una base de datos de SQL?

Lo único que hice para OleDb fue añadir la referencia  Microsof.Office.Interop.Excel, y después en cabecera de programa el using Excel = Microsoft.Office.Interop.Excel;
Lo tengo tal cual:
Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


using System.Data.OleDb;
using System.Data.Odbc;
using Excel = Microsoft.Office.Interop.Excel;

namespace leer_excel
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btLeerExcel_Click(object sender, EventArgs e)
        {
            try
            {
               /* OleDbConnection MyConnection;
                DataSet DtSet;
                OleDbDataAdapter MyCommand;
                MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; "+
                "Data Source=LEER.xlsx;Extended Properties=Excel 8.0;");
                //MessageBox.Show("entras");
                MyCommand = new OleDbDataAdapter("select * from [Hoja1$]", MyConnection);
                //MyCommand.TableMappings.Add("Table", "TestTable");
                DtSet = new DataSet();
                MyCommand.Fill(DtSet);               
                dataGridView1.DataSource = DtSet.Tables[0];
                MyConnection.Close();
                */

               
                string ruta = "E:/Proyectos_carpeta_seguridad/Visual C#/Enciclopedia de MVC#/"+
                "capitulo 15/excel/leer excel/leer excel/bin/Debug/LEER.xlsx";
                System.Data.Odbc.OdbcConnection conexionExcel =
                new System.Data.Odbc.OdbcConnection("Driver={Microsoft Excel Driver (*.xls)};Dbq=" +
                ruta + ";ReadOnly=0;");
                System.Data.Odbc.OdbcDataAdapter adaptadorExcel =
                new System.Data.Odbc.OdbcDataAdapter("SELECT * FROM [Hoja1$] ", conexionExcel);
                System.Data.DataTable dtExcel = new System.Data.DataTable("Hoja1");
                //Aquí lleno mi datatable, luego sólo le asignas al DataSource
                //del gridview ese datatable.
                adaptadorExcel.Fill(dtExcel);
                dataGridView1.DataSource = dtExcel;
                 


               
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}
« última modificación: Lunes 11 de Febrero de 2013, 01:14 por ProfesorX »

picyo

  • Visitante
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #5 en: Sábado 2 de Febrero de 2013, 10:22 »
0
Resuelto.
El problema es la cadena de conexión. Estoy usando un archivo xslx, y debería haber usado un archivo tipo xsl (office 2007). Pues, si quiero abrir todo tipo de archivos, supongo que debería crear una macro estilo "#define x" #ifdefine x....

Antes de eso, trataré de encontrar la string connection para office 2010.
Código: [Seleccionar]
MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; Data Source=LEER.xls;Extended Properties=Excel 8.0;");

« última modificación: Lunes 11 de Febrero de 2013, 01:14 por ProfesorX »

picyo

  • Visitante
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #6 en: Sábado 2 de Febrero de 2013, 11:26 »
0
Bueno, ya soy capaz de hacer que se conecten ambos archivos. Por defecto coge el xslx, pero comentando la línea que hace que abra esa conexión, abre el archivo xsl ( la otra conexión). Aquí dejo lo hecho, usando las directivas de preprocesador #define y #if
Código: [Seleccionar]
#define CadenaExcel2007
#define CadenaExcel2010

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


using System.Data.OleDb;
using System.Data.Odbc;
using Excel = Microsoft.Office.Interop.Excel;




namespace leer_excel
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btLeerExcel_Click(object sender, EventArgs e)
        {
            try
            {
                OleDbConnection MyConnection;
                DataSet DtSet;
                OleDbDataAdapter MyCommand;
                String sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;"+
                "Data Source=E:/Proyectos_carpeta_seguridad/Visual C#/Enciclopedia de MVC#/capitulo 15/"+
                "excel/leer excel/leer excel/bin/Debug/LEER.xlsx;"+
                "Extended Properties=Excel 8.0;";
                #if CadenaExcel2007
                 MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; "+
                 "Data Source=LEER.xls;Extended Properties=Excel 8.0;");
                #endif
                #if CadenaExcel2010
                MyConnection = new OleDbConnection(sConnectionString);
                #endif
                                         
               
                MyCommand = new OleDbDataAdapter("select * from [Hoja1$]", MyConnection);
                MyCommand.TableMappings.Add("Table", "TestTable");
                DtSet = new DataSet();
                MyCommand.Fill(DtSet);               
                dataGridView1.DataSource = DtSet.Tables[0];
                MyConnection.Close();
               
               
               
                 


               
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

Estoy usando un libro para aprender VC#, que creo que está bastante bien (lo tengo original...), pero se empeñan demasiado en conexiones SQL Server, que es mas correcto crear una base de datos en SQL, pero... a veces solo tenemos simples hojas de Excel..y quería probar algo mas simple
« última modificación: Lunes 11 de Febrero de 2013, 01:15 por ProfesorX »

picyo

  • Visitante
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #7 en: Domingo 10 de Febrero de 2013, 12:54 »
0
Bueno, como es normal, ahora que puedo leer los archivos, quiero que se guarden, pero no en modo de diseño, como veo por los foros, sino en modo ejecución.
hago algo así como:
Código: [Seleccionar]
private void btAbrirModificarExcel_Click(object sender, EventArgs e)
        {//
           
            openFileDialog1.FileName = "";           
            openFileDialog1.Filter="Archivos Excel(*.xls)|*.xls|Archivos Excel(*.xlsx)|*.xlsx";



            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string ruta = openFileDialog1.FileName;
                try
                {
                    OleDbConnection MyConnection;
                    DataSet DtSet;
                    OleDbDataAdapter MyCommand;
                    String sConnectionString2010 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ruta +
                    ";Extended Properties=Excel 8.0;";
                    String sConnectionString2007 = "provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + ruta +
                    ";Extended Properties=Excel 8.0;";
                    #if CadenaExcel2007
                                        MyConnection = new OleDbConnection(sConnectionString2007);
                    #endif
                    #if CadenaExcel2010
                                        MyConnection = new OleDbConnection(sConnectionString2010);
                    #endif


                    MyCommand = new OleDbDataAdapter("select * from [Hoja1$]", MyConnection);
                   // MyCommand.TableMappings.Add("Table", "TestTable");
                    DtSet = new DataSet();
                    MyCommand.Fill(DtSet);
                    dataGridView1.DataSource = DtSet.Tables[0];
                    /* OleDbCommand cmd = new OleDbCommand();                   
                    cmd.Connection = new OleDbConnection(sConnectionString2010);
                    cmd.CommandText = "UPDATE [Hoja1$B2:B2] SET F1=" + data[0];
                    cmd.ExecuteNonQuery();
                    */
                    MyConnection.Close();                   

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
veréis, la parte que está comentada por /* y */ es la que quiero adecuar a mi problema. Eso esta hecho de modo de diseño, donde data (cogido del foro), es un dato que mete el usuario quizás en un textBox... Pero bueno, yo lo que no se como hacer es ese margen de casillas en el UPDATE (Hoja1$B2:B2), que sea de modo tal como si el usuario añade 1 o 1000 filas, vamos, no entiendo que margen poner ahi y como sabe que lo quiero desde el datagridview1,
« última modificación: Lunes 11 de Febrero de 2013, 01:16 por ProfesorX »

picyo

  • Visitante
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #8 en: Miércoles 13 de Febrero de 2013, 18:00 »
0
como puedo hacer para que se guarden en la base de datos(la hoja de excel) los datos modificados??? Trato de hacerlo por activa y por pasiva, pero no lo consigo!

cachorro

  • Miembro MUY activo
  • ***
  • Mensajes: 196
  • Nacionalidad: ec
    • Ver Perfil
    • http://www.pumamix.com
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #9 en: Jueves 14 de Febrero de 2013, 04:07 »
0
buscalo en google hay muchos ejemplos...yo hice eso hace años..en todo caso dejame te busco el codigo y te lo subo....
La Vida es un Reto..Enfrentala....

picyo

  • Visitante
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #10 en: Jueves 14 de Febrero de 2013, 21:39 »
0
Que tal Cachorro?
Si, he visto multitud de ellos, pero todos con una base común: el programador es el que varia el código "in situ", o sea programando, dando órdenes tal como "UPDATE from Tabla y el valor/es a añadir"
Lo que quiero es que el propio usuario modificando el gridview del dataset, modifique la BBDD. Y he de reconocer que he hecho un poco follón de código, porque para que se use un tipico botón de guardar, debo abrir conexión de nuevo y cerrar de nuevo en el evento botón.
Bueno, espero eso que me dices, y de paso veo como se organiza ese caos. He visto por aqui que alguien definia una funcion solo de conexion y otra de cierre, y me ha gustado, me ha parecido limpio, pero luego otro decia que era poco efectiva... bueno, a ver si leo el post otra vez

cachorro

  • Miembro MUY activo
  • ***
  • Mensajes: 196
  • Nacionalidad: ec
    • Ver Perfil
    • http://www.pumamix.com
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #11 en: Jueves 14 de Febrero de 2013, 22:16 »
0
umm????
Hasta donde entiendo...lo que deseas es que los datos del excel se cargue en un datagridview y el usuario modifica dichos datos, al presionar un boton "guardar" se guarde esos datos en el excel que abrio..???? es eso lo que necesitas...???
La Vida es un Reto..Enfrentala....

picyo

  • Visitante
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #12 en: Viernes 15 de Febrero de 2013, 06:03 »
0
Si. Basicamente es eso. El datagridview se carga bien,independientemente e la version de excel usada. Pero cuanfo guardo, abro el xls,o el xslx que habia modificado,y no se aprecian cambios. Algo pasa con mi update..

cachorro

  • Miembro MUY activo
  • ***
  • Mensajes: 196
  • Nacionalidad: ec
    • Ver Perfil
    • http://www.pumamix.com
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #13 en: Viernes 15 de Febrero de 2013, 14:37 »
0
Ummmmm lo que recuerdo que hice fue cargar los datos al datagrid pero el usuario no midificaba nada, tenia una parte de codigo donde la mandaba a modificar(el usuario no se enteraba que se esta modificando) no se si eso ya lo pudiste hacer...???

en todo caso ya encontre ese proyecto de hace algunos años el problema esq esta hecho con visual studio 2007 y lo trate de abrir con el 2010 pero no me dejo abrirlo..en todo caso te paso el archivo quiza lo puedas abrir..cualquier cosa me comentas...a revisa bien el codigo ya que no recuerdo si efectivamente es el proyecto q te envio..saludos

Mandame un MP con tu direccion de mail para enviarte el archvio ya q esta mas grande de lo que me dejan subir aqui en el foro...
La Vida es un Reto..Enfrentala....

picyo

  • Visitante
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #14 en: Sábado 16 de Febrero de 2013, 09:09 »
0
ok, te mando y después comentamos por aquí. Grácias!

picyo

  • Visitante
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #15 en: Domingo 17 de Febrero de 2013, 13:47 »
0
Bueno he hecho unas modificaciones al programa, que me parece que está mas limpio, pero sigo sin poder grabar lo que el usuario modifica...
He modificado una sentencia SQL, simplificándola, a ver si me daba problemas por eso..pero nada. os pongo la modificación
Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


using System.Data.OleDb;
using Excel = Microsoft.Office.Interop.Excel;

namespace AbreModificaExcel
{
    public partial class Form1 : Form
    {


        string sRutaArchivo = "";
       
       
       
 
        public Form1()
        {
            InitializeComponent();           
           
        }




        private  string  RutaArchivo(object sender, EventArgs e)
        {
            // mediante OpenFileDialog se crea la ruta que el usuario da, guardandola en string ruta.
            // es una funcion con devolución, para que pueda ser usada de froma global.
            string ruta="";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)  // si pulsamos Ok después de seleccionar ruta
            {
                ruta = openFileDialog1.FileName;
                sRutaArchivo = ruta;
               
            }
            return ruta;
           
           
        }


        private void AbrirConexion(object sender, EventArgs e, string ruta)
        {
            try
            {
                OleDbConnection MyConnection;
                DataSet DtSet;
                OleDbDataAdapter MyCommand;
                String sConnectionString2010 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
                + ruta + ";Extended Properties=Excel 8.0;";
                MyConnection = new OleDbConnection(sConnectionString2010);   
                MyCommand = new OleDbDataAdapter("select * from [Hoja1$]", MyConnection);
                //MyCommand.TableMappings.Add("Table", "TestTable");
                DtSet = new DataSet();
                MyCommand.Fill(DtSet);
                dataGridView1.DataSource = DtSet.Tables[0];
                //MyConnection.Close();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }


        private void CerrarConexion(object sender, EventArgs e)
        {
        }



        /// abrirHojaDeDatosToolStripMenuItem_Click
        /// ////
        /// Acción dada al evento de pulsar el boton del menú "abrir...".Se le pasa la ruta de archivo desde la funcion RutaArchivo
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void abrirHojaDeDatosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string ruta = "";
            openFileDialog1.Filter = "Archivos Excel(*.xls)|*.xls|Archivos Excel(*.xlsx)|*.xlsx";
            ruta=RutaArchivo(sender,e);           
            AbrirConexion(sender, e,ruta);
        }

        private void guardarHojaActualToolStripMenuItem_Click(object sender, EventArgs e)
        {
             
            OleDbConnection MyConnection;
            DataSet DtSet;
            DtSet = new DataSet();
            //OleDbDataAdapter MyCommand;
            String sConnectionString2010 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
            + sRutaArchivo + ";Extended Properties=Excel 8.0;";
            MyConnection = new OleDbConnection(sConnectionString2010);
            OleDbCommand cmd = new OleDbCommand();   
            cmd.CommandText = "UPDATE [Hoja1$] ";
            dataGridView1.DataSource = DtSet;
            //cmd.ExecuteNonQuery();
            MyConnection.Close();           
           
        }
    }
}
« última modificación: Miércoles 20 de Febrero de 2013, 07:38 por ProfesorX »

DiabloRojo

  • Miembro MUY activo
  • ***
  • Mensajes: 220
    • Ver Perfil
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #16 en: Miércoles 20 de Febrero de 2013, 03:34 »
0
Qué tal Picyo?

Revisa este link a ver si te resulta de utilidad http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

Saludos.

picyo

  • Visitante
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #17 en: Miércoles 6 de Marzo de 2013, 13:30 »
0
mal.
no consigo que salga en absoluto. cada vez me parece menos fiable c#
los ejemplos de microsoft tienden a ser demsiado grandes, para reflejar una duda te aparecen diez mas...poco productivos.
no se quizas como hacer mejor la pregunta

picyo

  • Visitante
Re:no consigo conectar con Excel mediante OleDb
« Respuesta #18 en: Miércoles 6 de Marzo de 2013, 21:27 »
0
En fin, muerto el perro muerta la rabia. Me quede sin PC