CLR: .Net / Mono / Boo / Otros CLR > C#

 no consigo conectar con Excel mediante OleDb

<< < (2/4) > >>

picyo:
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: ---MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; Data Source=LEER.xls;Extended Properties=Excel 8.0;");

--- Fin del código ---

picyo:
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: ---#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());
            }
        }
    }
}

--- Fin del código ---

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

picyo:
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: ---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());
                }
            }
--- Fin del código ---
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,

picyo:
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:
buscalo en google hay muchos ejemplos...yo hice eso hace años..en todo caso dejame te busco el codigo y te lo subo....

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa