Autoxls

autoxls es una herramienta de linea de comandos para automatizar las generación de archivos Excel 2003 a partir de resultados obtenidos de consultas a bases de datos. Esta basada en el uso de la excelente librería XlsxWriter, consultar la completa documentación de esta librería para más detalle.

Empecemos

Antes que nada, necesitaremos:

Con Git instalado, desde la línea de comando y con una carpeta dónde alojaremos este proyecto, por ejemplo c:\proyectos, simplemente:

c:\> c: 
c:\> cd \proyectos 
c:\> git clone <url del repositorio>
c:\> cd <carpeta del repositorio>

Instalación de Python

Para desarrollo de la herramienta es necesario, en primer término, descargar un interprete Python. xls2table ha sido desarrollado con la versión 3.6, no es mala idea usar esta versión, sin embargo debiera funcionar perfectamente bien con cualquier versión de la rama 3x.

Importante: Si bien solo detallamos el procedimiento para entornos Windows, el proyecto es totalmente compatible con Linux

Se descarga y se instala en el sistema el interprete Python deseado. A partir de ahora trabajaremos en una terminal de Windows (cmd.exe). Para verificar la correcta instalación, en particular que el interprete este en el PATH del sistemas, simplemente corremos python --version, la salida deberá coincidir con la versión instalada

Es conveniente pero no mandatorio hacer upgrade de la herramienta pip: python -m pip install --upgrade pip

Instalación de Virtualenv

Virutalenv. Es la herramienta estándar para crear entornos “aislados” de Python. En nuestro ejemplo xls2table, requiere de Python 3x y de varios “paquetes” adicionales de versiones específicas. Para no tener conflictos de desarrollo lo que haremos mediante esta herramienta es crear un “entorno virtual” en una carpeta del proyecto (que llamaremos venv), dónde una vez “activado” dicho entorno podremos instalarle los paquetes que requiere el proyecto. Este “entorno virtual” contendrá una copia completa de Python y los paquetes mencionados, al activarlo se modifica el PATH al python.exe que ahora apuntará a nuestra carpeta del entorno y nuestras propias librerías, evitando cualquier tipo de conflicto con un entorno Python ya existente. La instalación de virtualenv se hará mediante:

c:\..\> pip install virtualenv

Creación y activación del entorno virtual

La creación de nuestro entorno virtual se realizará mediante el comando:

C:\..\>  virtualenv venv --clear --prompt=[autoxls] --no-wheel

Para “activar” el entorno simplemente hay que correr el script de activación que se encontrará en la carpeta .\venv\Scripts (en linux sería ./venv/bin)

C:\..\>  .\venv\Scripts\activate.bat
[autoxls] C:\..\> 

Como se puede notar se ha cambiado el prompt con la indicación del entorno virtual activo, esto es importante para no confundir entornos si trabajamos con múltiples proyecto Python al mismo tiempo.

Instalación de requerimientos

Mencionábamos que este proyecto requiere varios paquetes adicionales, la lista completa está definida en el archivo requirements.txt para instalarlos en nuestro entorno virtual, simplemente:

[autoxls] C:\..\> pip install -r requirements.txt

Desarrollo

Si todos los pasos anteriores fueron exitosos, podríamos verificar si la aplicación funciona correctamente mediante:

[autoxls] C:\..\> python autoxls.py
uso: autoxls [-h] [-v] [-o "path"] [-n <level>] [-l file] [-f "archivo"]
             [-k {'key':'value','key':'value'}] [-s] [-d]
             ["archivo"]
autoxls: error: debe indicar el archivo de input (--inputfile)

La ejecución sin parámetros arrojará la ayuda de la aplicación. A partir de aquí podríamos empezar con la etapa de desarrollo.

Generación del paquete para deploy

Para distribuir la aplicación en entornos Windows nos apoyaremos en Pyinstaller, un modulo, instalado junto a los requerimientos, que nos permite crear una carpeta de distribución de la aplicación totalmente portable. Simplemente deberemos ejecutar el archivo windist.bat, al finalizar el procesos deberías contar con una carpeta en .\dist\autoxls la cual será una instalación totalmente portable de la herramienta, no haría falta nada más que copiar la misma al equipo o servidor desde dónde deseamos ejecutarla.

Documentación

Características principales

Antes de empezar

Para comenzar, antes de probar la ejecución de esta herramienta, es necesario escribir un archivo de definición de la exportación a realizar. Este no es más que un archivo en formato JSON, que describe datos, archivos, planillas y formatos de la exportación. Nota: para validar el formato del mismo: JSON Editor Online.

Este archivo definirá los siguientes elementos:

Nota: Para referencia de las definiciones, ver la documentación del módulo XlsxWriter

Construcción de la cadena Dsn según datasource

Primeros pasos

Para entender el funcionamiento de esta herramienta, vamos a imaginar el siguiente escenario: Tenemos un servidor SQL Server y deseamos de forma automatizada generar un informe a una determinada hora de los procesos corriendo en el mismo. Para esto contamos con un clásico stored procedure llamado sp_who2, usando autoxls resulta muy fácil hacer esto. El primer paso es generar la definición del proceso de exportación de datos, esto lo haremos escribiendo un archivo JSON similar a este:

{
  "datasources": {
    "data" : {
      "data_connect_str" : "DRIVER={SQL Server};SERVER=<<server>>;DATABASE=master;UID=<<user>>;PWD=<<passw>>",
      "data_query" : "EXEC sp_who2"
    }
  },
  "files": [
    {
      "filename": "sp_who2 on <<server>>_<<Now>>.xlsx",
      "sheets": [
        {
          "name": "sp_who2 on <<server>>",
          "default_row_height" : 11.5 ,
          "objects": {
            "text": [
              { "text" : "Resultado del sp_who ejecutado el <<Now>> en <<server>>", "format" : "encabezado_titulo", "at" : "B2" }
            ],
            "text_rows": [
              { "text" : [null,null,null,null,null], "format" : "encabezado_titulo", "at" : "C2" }
            ],
            "datagrid": [
              {
                "source" : {"datasource": "data","recordset_index" : 1},
                "at" : "B3",
                "header_format": "encabezado",
                "header_height": 25,
                "freeze_header" : true,
                "alternate_colors": ["color_impar","color_par"],
                "datacols" : [
                        [ 1, "SPID"            , 8   , "int"          , null ],
                        [ 2, "Status"          , 20  , "default"      , null ],
                        [ 3, "Login"           , 16  , "default"      , null ],
                        [ 4, "HostName"        , 12  , "default"      , null ],
                        [11, "ProgramName"     , 60  , "default"      , null ],
                        [ 8, "CpuTime"         , 12  , "number"       , "cpu" ]

                ],
                "autofilter_column_range" : [1,6],
                "subtotals" : [
                  {"at" : "END", "format" : "subtotal_int", "total_function" : "2" , "cols_num" : [1] },
                  {"at" : "END", "format" : "subtotal", "total_function" : "9" , "cols_num" : [6] }
                ]
              }
            ]
          }
        }
      ]  
    }
  ],
  "formats": {
      "default_font":      { "font_name" : "Verdana", "font_size" : 8, "num_format" : "", "valign" : "top" },
      "right":             { "align" : "right" },
      "left":              { "align" : "left" },
      "bold":              { "bold" : "True" },
      "color":             { "bg_color": "#C6EFCE" },
      "color_impar":       { "bg_color": "#A6EFCE" },
      "color_par":         { "bg_color": "#C6EFCE" },
      "int_fmt":           { "num_format" : "#,##0" },
      "number2_fmt":       { "num_format" : "#,##0.00" },
      "default":           [ "default_font", "left" ] ,
      "encabezado_titulo": [ "default_font", "bold", "color"],
      "encabezado":        [ "default_font", "bold", "color", { "bottom" : 1, "bottom_color" : "#0000FF", "text_wrap": "True", "valign": "top" }],
      "subtotal_int":      [ "default_font", "right", "bold", "int_fmt" ],
      "subtotal":          [ "default_font", "right", "bold", "number2_fmt" ],
      "number":            [ "default_font", "right", "number2_fmt" ],
      "int":               [ "default_font", "right", "int_fmt" ],
      "numero_rojo":       [ "number2_fmt", { "bg_color": "#FF0000", "font_color": "#FFFFFF"}]
  },
  "conditional": { 
    "cpu" : [
        {"type": "cell", "criteria": ">", "value": 2000, "format" : "numero_rojo" }
        ]
    }
}

Lo llamaremos export.json pero puede ser cualquier nombre. Para generar el Excel a partir de la anterior definición, deberemos además establecer los keywords del proceso:

Hay dos formas de hacer esto, mediante un archivo de keywords, que llamaremos keywords.json, pero puede ser cualquier nombre, un texto Ascii estándar con el siguiente formato:

{ 	
	"server" 			: "servidor",
	"user" 				: "miusuario",
	"passw"				: "micontraseña"
}

En cuyo caso ejecutaríamos así la herramienta así:

autoxls export.json -f keywords.json

O bien, se puede definir los “keywords” por línea de comando sin necesidad de preconfiguraralos en un archivo así:

autoxls export.json -k "{'server': 'servidor', 'user': 'miusuario', 'passw': 'micontraseña'}"

Opciones de impresión

Para el objeto sheet se puede definir el nodo hijo, print que configura varias opciones para el manejo de la impresión de la planilla:

"print": {
  "landscape": false,
  "paper": 9,
  "margins": [0.7,0.7,0.75,0.75],
  "header": ["&C&A",],
  "footer": ["&L&F &R&P de &N",],
  "grid": true,
  "area": ["FR","FC","ER","EC"],
  "scale": 70,
  "fit_to_pages": [0, 1],
  "center_horizontally": false,
  "center_vertically": false
},
Index Paper format Paper size
0 Printer default Printer default
1 Letter 8 1/2 x 11 in
2 Letter Small 8 1/2 x 11 in
3 Tabloid 11 x 17 in
4 Ledger 17 x 11 in
5 Legal 8 1/2 x 14 in
6 Statement 5 1/2 x 8 1/2 in
7 Executive 7 1/4 x 10 1/2 in
8 A3 297 x 420 mm
9 A4 210 x 297 mm
10 A4 Small 210 x 297 mm
11 A5 148 x 210 mm
12 B4 250 x 354 mm
13 B5 182 x 257 mm
14 Folio 8 1/2 x 13 in
15 Quarto 215 x 275 mm
16 10x14 in
17 11x17 in
18 Note 8 1/2 x 11 in
19 Envelope 9 3 7/8 x 8 7/8
20 Envelope 10 10 4 1/8 x 9 1/2
21 Envelope 11 4 1/2 x 10 3/8
22 Envelope 12 4 3/4 x 11
23 Envelope 14 5 x 11 1/2
24 C size sheet
25 D size sheet
26 E size sheet
27 Envelope DL 110 x 220 mm
28 Envelope C3 324 x 458 mm
29 Envelope C4 229 x 324 mm
30 Envelope C5 162 x 229 mm
31 Envelope C6 114 x 162 mm
32 Envelope C65 114 x 229 mm
33 Envelope B4 250 x 353 mm
34 Envelope B5 176 x 250 mm
35 Envelope B6 176 x 125 mm
36 Envelope 110 x 230 mm
37 Monarch 3.875 x 7.5 in
38 Envelope 3 5/8 x 6 1/2 in
39 Fanfold 14 7/8 x 11 in
40 German Std Fanfold 8 1/2 x 12 in
41 German Legal Fanfold 8 1/2 x 13 in

(*) no todos estos valores estarán disponibles siempre, ya que dependen de la impresora

Ejecución


uso: autoxls [-h] [-v] [-o "path"] [-n <level>] [-l file] [-f "archivo"]
             [-k '{key:value,key:value}'] [-s]
             ["archivo"]

Generación automatizada de archivos Excel (v0.9)
2014, 2015, 2016 Patricio Moracho <pmoracho@gmal.com>

argumentos posicionales:
  "archivo"                               Archivo de entrada (JSON)

argumentos opcionales:
  -h, --help                              mostrar esta ayuda y salir
  -v, --version                           show program's version number and exit
  -o "path", --outputpath "path"          Carpeta de salida dónde se almacenaran las planillas
  -n <level>, --loglevel <level>          Nivel de log (default: ninguno)
  -l file, --logfile file                 Archivo de log
  -f "archivo", --keywordfile "archivo"   Archivo de keywords del procesos
  -k '{key:value,key:value}', --keywords '{key:value,key:value}'
                                          Keywords del procesos
  -s, --start-excel                       Abrir automáticamente las planillas generadas
  -d, --drop-config-files                 Eliminar el archivo de input y eventualmente el de keywords

Niveles de log

Utilizar el parámetro -n o --loglevel para indicar el nivel de información que mostrará la herramienta. Por defecto el nivel es NONE, que no mustra ninguna información.

Nível Detalle
NONE No motrar ninguna información
DEBUG Información detallada, tipicamente análisis y debug
INFO Confirmación visual de lo esperado
WARNING Información de los eventos no esperados, pero aún la herramienta puede continuar
ERROR Errores, alguna funcionalidad no se puede completar
CRITICAL Errores serios, el programa no puede continuar

Notas para el desarrollador:

Change Log:

Version 1.0.2 - 2019-05-03

Version 1.0.1 - 2019-03-29

Version 1.0.1 - 2017-01-01