Ver Mensaje Individual
  #4 (permalink)  
Antiguo 12/11/2009, 18:19
Avatar de xdrtas
xdrtas
 
Fecha de Ingreso: junio-2008
Ubicación: Venezuela
Mensajes: 97
Antigüedad: 15 años, 11 meses
Puntos: 13
Respuesta: Cargar un excel convertirlo a CSV y importar eso en Postgres

Hola Kil, lo que interpreto de tu spregunta es que quieres pasar los datos de tu hoja de excel directamente a postgreQL, si es eso lo que quieres, sigue estos pasos:
  1. Instalar el driver ODBC de postgre para windows, (PostgreSQL ODBC Driver(ANSI),PostgreSQL ODBC Driver(UNICODE)).
  2. Si ya lo tienes instalado, lo siguiente es crear un DNS de usuario con el driver correspondiente, para este ejemplo que te coloco más abajo voy a usar PostgreSQL ODBC Driver(UNICODE). Para esto, te vas a "Herramientas administrativas" y haces click en Administrador de orígenes de datos ODBC, pestaña DNS de ususario.
  3. Cuando ya tengas creado tu driver con los parametros de tu servidor de base de datos vete al siguiente paso.
  4. Abrir tu hoja de excel habilitado para macros.
  5. Busca el botón o opción de menú que se llama macros o crear macro. Te pedirá un nombre de macro, para este caso le puse el nombre conexion. Cuando aceptes te aparecerá el entorno de programación de VBA, (Visual Basic de Aplicaciones), con el "sub conexion()" creado.
  6. Vete al menu Herramientas-->Referencias y selecciona la siguiente referencia Microsoft ActiveX Data Objects 6.0 Library, esta es la librería ODBC para conectarse a bases de datos por medio de ADO (ActiveX Data Objects). Aceptas y pasamos al código.
Código:
Sub conexion()
    Dim connString As String              'Es la cadena de conexión...
    Dim cnn As ADODB.Connection     'El objeto conexión al cual le vamos a asignar la cadena de conexión "connString"
    Dim rs As ADODB.Recordset         'El recordset, para ejecutar comandos SQL y asignar los resultados a controles o celdas de la hoja de excel...
    
    connString = "Driver={PostgreSQL35W};Server=localhost;Port=5432;Database=aikido;Uid=tuusuario;Pwd=tucontraseña;" 'Driver={PostgreSQL35W} Este es el nombre que le dí yo cuando creé mi DNS de postgreSQL. Esta cadena de conexión es solo para PostgreSQL ODBC Driver(UNICODE), con ANSI o teniendo activo SSL cambia un poco la cadena de conexión.
    
    Set cnn = New ADODB.Connection 'Creamos el objeto conexión
    Set rs = New ADODB.Recordset     'Creamos el objeto recordset
    
    With cnn
        .ConnectionString = connString 'Establecemos la conexión
        .Open                                         'Abrimos la conexión
    End With
    
    With rs
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockOptimistic
        .Open "INSERT INTO ""Album"" (""alb_ID"", ""alb_Titulo"", ""alb_Fecha"", ""alb_Descripcion"") VALUES (" + CStr(Worksheets("hoja1").Cells(1, 1)) + "::bigint, '" + Worksheets("hoja1").Cells(1, 2) + "', '" + CStr(Worksheets("hoja1").Cells(1, 3)) + "'::date, '" + Worksheets("hoja1").Cells(1, 4) + "')", cnn, , , adCmdText
    End With

    cnn.Close
End Sub
Unos comentarios:

En mi base de datos usé mayúsculas, por eso es que mi nombre de tabla y de campos están entre comilla doble ""nombreTabla"", ""NombreCampo"", cosas del visual basic. El caracter "+" es para concatenar cadenas de caracteres. Para que lo entiendas mejor te coloco el insert antes y después de interpretarse:
  1. "INSERT INTO ""Album"" (""alb_ID"", ""alb_Titulo"", ""alb_Fecha"", ""alb_Descripcion"") VALUES (" + CStr(Worksheets("hoja1").Cells(1, 1)) + "::bigint, '" + Worksheets("hoja1").Cells(1, 2) + "', '" + CStr(Worksheets("hoja1").Cells(1, 3)) + "'::date, '" + Worksheets("hoja1").Cells(1, 4) + "')", cnn, , , adCmdText
  2. INSERT INTO "Album" ("alb_ID", "alb_Titulo", "alb_Fecha", "alb_Descripcion") VALUES (15::bigint, 'Uno', '07/11/2009'::date, 'otro desde excel')
  3. CStr(Worksheets("hoja1").Cells(1, 1)): Para tomar el valor de la Fila 1, columna 1, en ese orden. "hoja1" es el nombre de la hoja donde estoy obteniendo los datos.
  4. CStr Función para convertir en cadena de caracteres los números y las fechas. Como la consulta es una cadena de texto, todos los campos que sean numéricos o de tipo fecha los tienes que convertir a cadena.
  5. La tabla se llama "Album" y tiene 4 campos, los valores los tomo de la "hoja" de excel, ejecuto el recordset con el INSERT mostrado más arriba y listo, los datos de las celdas 1 hasta la 4 quedan guardados.
  6. Cuando se trate de varias filas o varias columnas entonces puedes usar bucles. For i = 0 to X .. NEXT i
  7. Una cosa más, si quieres ejecutar un select tienes haces lo mismo que con el insert, ejemplo: .Open "Select * from ""Album""", cnn, , , adCmdText :: pero en este caso al final antes del cnn.Close tienes que añadir el siguiente comando rs.Close porque en el caso del select tienes que cerrar el recordset.

Siento tanto texto, pero he intentado explicarlo paso a paso, este ejemplo lo hice con Office 2007 y postgre 8.4 y funciona pasar los datos desde excel por medio de macros a postgreSQL sin problemas. Saludos y espero que te sirva.