Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Importar filas de datos desde Excel a Access con ADO

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Importar filas de datos desde Excel a Access con ADO Responder citando

Buenas a todos, ya sé que el tema de importar datos desde Excel se ha tratado en muchas preguntas del foro,pero por lo que yo he buscado, siempre se ha tratado la forma de leer los datos de una celda. Os pongo un trozo de código donde se lee toda una línea del fichero excel y se guardan los datos en una tabla Access. Espero que a alguien le sea de ayuda.
Código:


        AnsiString Datos[9];
        int contador=0; //cuenta el número de registros añadidos a la BD
        OpenDatos->Filter = "Archivo de Excel (*.xls)|*.xls|";
       // El nombre de la tabla donde quiero insertar los datos lo extraigo de un combo
        AnsiString tabla = ComboDominio->Text;
 
       if (OpenDatos->Execute())
        {
            // Así extraigo el path completo del fichero !!
            OrigenPath = OpenDatos->FileName;

            Variant xlApp, xlLibro, xlHoja, xlCelda, UltimaCelda;

            xlApp = CreateOleObject("Excel.Application");
            xlApp.Exec(PropertySet("Visible")<<false);
            xlLibro = xlApp.Exec(PropertyGet("Workbooks"));
            xlLibro.Exec(Procedure("Open")<<OrigenPath);
            xlHoja = xlApp.Exec(PropertyGet("ActiveSheet"));

            if (xlHoja.IsEmpty())
            {
                ShowMessage("No hay ninguna hoja activa");
                return;
            }

            //Busca la última fila y columna que tienen datos:
            xlCelda = xlHoja.Exec(PropertyGet("Cells"));
            UltimaCelda = xlCelda.Exec(Function("SpecialCells")<<11);
            int UltimaFila = UltimaCelda.Exec(PropertyGet("Row"));
            int UltimaCol = UltimaCelda.Exec(PropertyGet("Column"));

            int Fila=2; //es la primera fila en la que hay datos
            int Columna = 1;

            while (Fila <= UltimaFila)
            {
                Application->ProcessMessages();
                while (Columna <= UltimaCol)
                {
                    String Valor = xlHoja.Exec(PropertyGet("Cells")<<Fila<<Columna);
                    Datos[Columna] = Valor;
                    Columna++;
                }
// Inserto el array con los datos en la tabla Access
                Data->ADOTable8->TableName = tabla;
                Data->ADOTable8->Open();
                Data->ADOTable8->Append();
                Data->ADOTable8->FieldByName("Funcion")->Value = Datos[1];
                Data->ADOTable8->FieldByName("Unidad")->Value = Datos[2];
                Data->ADOTable8->FieldByName("Subclasificacion")->Value = Datos[3];
                Data->ADOTable8->FieldByName("Pais")->Value = Datos[4];
                Data->ADOTable8->FieldByName("CA")->Value = Datos[5];
                Data->ADOTable8->FieldByName("Periodo")->Value = Datos[6];
                Data->ADOTable8->FieldByName("Año")->Value = Datos[7];
                Data->ADOTable8->FieldByName("Cantidad")->Value = Datos[8];
                Data->ADOTable8->FieldByName("Fuente")->Value = Datos[9];
                Data->ADOTable8->Post();
                Data->ADOTable8->Close();

                Columna = 1;
                contador++;
                Fila++;
            }
            //Cierro excel:
            xlApp.Exec(PropertySet("Visible")<<false);
            xlApp.Exec(Procedure("Quit"));
            xlApp.Clear();
            ShowMessage(AnsiString(contador)+" registros añadidos");
        }


Utilizo componentes ADO que están en un DataModule (Data), en el código del DataModule hay que asignar la conexion ADO a la ADOTable8 y dejar la tabla cerrada.

Código:
ADOTable8->Connection = ConexionBDlocal;
ADOTable8->Active = false;


Agradecería cualquier tipo de comentarios o recomendaciones.
Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

El código ha sido mejorado por _Leo, (Wink , gracias). Aquí tenéis el enlace donde lo ha puesto:

https://cppbuilder.es/viewtopic.php?p=31019#31019
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.