lunes, 3 de mayo de 2010

0004 Excel – PostgreSQL II

Este es el segundo artículo para trabajar con postgreSQL y Excel, si quieren ver el primero pueden seguir este link: 0003 excel - postgresql.

En esta segunda parte se muestra cómo escribir los datos obtenidos mediante una consulta a una tabla de postgreSQL para poder guardar esos datos en un documento de Excel.
La librería que se va a usar para escribir datos en una hoja de Excel se llama "xlwt".






Lo primero que se tiene que hacer, es crear la tabla que contiene los datos. Aquí está el código de la tabla:
CREATE TABLE excel
(
campo1 character varying(20),
campo2 character varying(20)
)
WITH (
OIDS=FALSE
);
ALTER TABLE excel OWNER TO postgres;

INSERT INTO excel (campo1, campo2) VALUES ('David', '0.0');
INSERT INTO excel (campo1, campo2) VALUES ('Jorge', '1.0');
INSERT INTO excel (campo1, campo2) VALUES ('Arturo', '2.0');
INSERT INTO excel (campo1, campo2) VALUES ('Sylvia', '3.0');
INSERT INTO excel (campo1, campo2) VALUES ('Carolina', '4.0');
INSERT INTO excel (campo1, campo2) VALUES ('Graciela', '5.0');
INSERT INTO excel (campo1, campo2) VALUES ('Fernando', '6.0');
INSERT INTO excel (campo1, campo2) VALUES ('Elena', '7.0');
INSERT INTO excel (campo1, campo2) VALUES ('Carlos', '8.0');
INSERT INTO excel (campo1, campo2) VALUES ('Daniela', '9.0');

El siguiente paso es el procedimiento almacenado hecho en "plpython":
CREATE OR REPLACE FUNCTION fescribirexcel() RETURNS text AS
$BODY$
from xlwt import Workbook
libro = Workbook()
hoja = libro.add_sheet('Informex')
datos = plpy.execute("SELECT * FROM excel")
fila = 0
for campo in datos:
hoja.write(fila,0,campo['campo1'])
hoja.write(fila,1,campo['campo2'])
fila = fila + 1
libro.save("C:/prueba.xls")
return "Funciona"
$BODY$
LANGUAGE 'plpythonu' VOLATILE;

El procedimiento "fescribirexcel()" hace lo siguiente:
  1. Llamar a la librería xlwt e importar el módulo Workbook.
  2. Asignar el nuevo Workbook a la variable "libro", esto significa que libro se convierte en un objeto "libro de Excel".
  3. Asignar a la variable "hoja" una nueva hoja con el nombre de "Informe".
  4. "datos" contendrá los datos obtenidos por medio de la consulta a la tabla "excel".
  5. "fila" guarda el número de fila donde se quiere guardar los datos.
  6. Se crea un bucle para recorrer los datos obtenidos por medio de la consulta.
  7. "hoja.write(fila,0,campo['campo1'])": Se asigna el valor de "campo['campo1']" a la fila "fila" columna "0".
  8. "hoja.write(fila,1,campo['campo2'])": Se asigna el valor de "campo['campo2']" a la fila "fila" columna "1".
  9. "fila" se le suma 1 para pasar a la siguiente fila, ( fila = fila + 1 ).
  10. Una vez finalizado el bucle se salva el nuevo libro en la ruta deseada, en este caso es: "libro.save("C:/prueba.xls")".
El último paso es llamar al procedimiento:
select fescribirexcel();

Links de las librerías:
  • xlrd-0.7.1.win32 – web: xlrd
  • xlwt-0.7.2.win32 – web: xlwt
  • xlutils-1.4.1.win32 – web: xlutils
Nota importante:
  1. Con este procedimiento: Hay que tener en cuenta que si el libro de Excel ya existe, éste será sustituido por completo con los datos nuevos.
  2. Este ejemplo se probó bajo Windows 7, por lo tanto se tiene que tener en cuenta los permisos de escritura; en el ejemplo expuesto, el nuevo documento se crea en la ruta "C:\" por mi configuración personal sobre esa ruta; si no tiene permisos de escritura en esa ruta entonces no va a funcionar el procedimiento.
  3. Si quiere cambiar la ruta a una carpeta en la cual tenga los permisos, sustituya la siguiente línea "libro.save("C:/prueba.xls")" por "libro.save("C:/RutaConLosPermisos/prueba.xls")" en el procedimiento almacenado con el nombre de "fescribirexcel()".
Un cordial saludo.
Firma: XDRTAS


1 comentario:

Nelson Lastra Delgado dijo...

hola esta muy buena esta forma de extraer datos desde una planilla de excel a un tabla de postgres

lo intente realizar pero me causo problemas y no puedo me gustaria poder contactarme contigo si puedes darme una ayuda con esto el error que me muestra es el siguiente :


ERROR: PL/Python: la función PL/Python «fexcel1» ha fallado
DETAIL: : plpy.execute espera una consulta o un plan

********** Error **********

ERROR: PL/Python: la función PL/Python «fexcel1» ha fallado
Estado SQL:XX000
Detalle:: plpy.execute espera una consulta o un plan

nose que me falta o que no hice bien

te dejo mi correo nelson.lastra@yahoo.es
facebook nelson lastra delgado

cualquier cosa me envias respuesta

saludos muy interesante tu trabajo

a todo esto soy desarrollador informatico y trabajo con jsp y postgres si te sirve algun material con estas herramientas no tengo problema en proporcionartelo saludos estimado.

desde chile