Fullmenu null

 

08 October 2017

El caso práctico en el cuál este script nos puede resultar muy útil es cuando por ejemplo existe la necesidad de extraer información de una base de datos para crear una serie de informes que nos solicita un cliente, como puede ser obtener información de unos determinados productos.

Muchos motores de bases de datos y/o herramientas son capaces de exportar esta información a fichero CSV (fichero delimitado por comas, punto y coma, pipes, etc) y posteriormente importarlo en un Excel.

Supongamos que disponemos de una tabla de productos donde entre otra información guardamos el código de producto y la descripción.

SKU DESCRIPTION

1

LAPICES

2

SACAPUNTAS

XXXXX

UN PRODUCTO SUPERCOTIZADO

Extraer esta información es trivial con una simple sentencia SQL:

select concat(sku,'|', description, '|') from products order by sku

y redirigir la salida de esta sentencia a un fichero para ser abierto con Excel.

Pero con este script nos evitamos todo el proceso de conversión, generando un Excel directamente:

@Grab('mysql:mysql-connector-java:5.1.6')// (1)
@Grab('net.sourceforge.jexcelapi:jxl:2.6.12')
@GrabConfig(systemClassLoader=true)

import jxl.*
import jxl.write.*
import groovy.sql.Sql

filename = "informe.xls"

sql = Sql.newInstance( "jdbc:mysql://localhost:3306/origen?jdbcCompliantTruncation=false",
        "user",
        "password",
        "com.mysql.jdbc.Driver")

workbook = Workbook.createWorkbook(new File(filename))

sheet = workbook.createSheet("productos", 0)

first=true
i=0
sql.eachRow("select sku, description from products order by sku") { row -> // (2)

  if( first ){
    sheet.addCell (new Label (0,i,"Sku"))
    sheet.addCell ( new Label (1,i,"Product") )  // (3)
    first=false
  }

  sheet.addCell( new Label (0,i+1,"$l.sku") )  // (4)
  sheet.addCell ( new Label (1,i+1,l.description) )
  i++
}
workbook.write()
workbook.close()
  1. Cargamos dependencias (MySQL y JExcel)

  2. Para cada registro que cumpla la query generamos una fila nueva

  3. Podemos generar cabeceras en la primera fila

  4. Ejemplo de cómo crear dos celdas de tipo texto, pero existen otros tipos como Date o Number


Script
@Grab('mysql:mysql-connector-java:5.1.6')// (1)
@Grab('net.sourceforge.jexcelapi:jxl:2.6.12')
@GrabConfig(systemClassLoader=true)

import jxl.*
import jxl.write.*
import groovy.sql.Sql

filename = "informe.xls"

sql = Sql.newInstance( "jdbc:mysql://localhost:3306/origen?jdbcCompliantTruncation=false",
        "user",
        "password",
        "com.mysql.jdbc.Driver")

workbook = Workbook.createWorkbook(new File(filename))

sheet = workbook.createSheet("productos", 0)

first=true
i=0
sql.eachRow("select sku, description from products order by sku") { row -> // (2)

  if( first ){
    sheet.addCell (new Label (0,i,"Sku"))
    sheet.addCell ( new Label (1,i,"Product") )  // (3)
    first=false
  }

  sheet.addCell( new Label (0,i+1,"$l.sku") )  // (4)
  sheet.addCell ( new Label (1,i+1,l.description) )
  i++
}
workbook.write()
workbook.close()