Blog de divulgación de Ciencia y Tecnología
How to

Cómo exportar a excel en Mirth Connect

Mirth Connect es una herramienta tan versátil que es muy frecuente darle usos que no son realmente los propósitos de la propia herramienta. No todo es HL7 v2 en Mirth. Pero es que la facilidad de desarrollo y robustez es una baza para tenerlo en cuenta ante cualquier mini-desarrollo, del tipo generar descargas de información para integrar en otros sistemas, envío de reportes, etc. Para tales propósitos, y teniendo en cuenta que es un formato no incluido en la herramienta pero de uso frecuente, veremos cómo exportar a excel en Mirth Connect.

En Mirth Connect existen varios formatos de exportación de documentos ya predefinidos por la herramienta, como RFT o PDF. Sin embargo, si queremos exportar a Excel tendremos dos opciones:

  • Generar ficheros .scv separados por comas, de forma programática utilizando la interfaz de Mirth Connect para ficheros de texto.
  • Utilizar una librería externa como APache POI HSSF para generarlos, también de forma programática.

No parece que podamos eludir el desarrollo, aunque sí, es un mini-desarrollo en Javascript dentro de un Transformer, por ejemplo.

Afortunadamente en este mundo de la interoperabilidad, y la informática en general, hay buenas personas que comparten su trabajo para que el resto podamos ahorrárnoslo. Esa es la base del código abierto. Y en este caso tenemos que Apache nos ha generado unas clases de interfaz con documentos Microsoft como Word, Excel e incluso PowerPoint.

Para ver cómo exportar a excel con Mirth Connect simularemos una situación con un caso práctico para descarga diaria de consumos desde unos dispensadores automáticos.

Obviaremos que se conoce cómo utilizar una librería externa en Mirth Connect e iremos al grano en el uso de esta en concreto.

Siempre me gusta simular un caso práctico de la vida real de un integrador, se ven las cosas con mas utilidad, y eso haremos.

Caso práctico: Descarga diaria de consumos de medicamentos.

En el Hospital X nos han solicitado que generemos una descarga diaria de los consumos de medicamentos dispensados a los pacientes, desde dispensadores automáticos de planta. Tienen una aplicación capaz de importar ficheros xls para incorporarlos a su fichero. Nuestros dispensadores automáticos no tienen tal opción, por lo que debemos desarrollar un proceso que se ejecute diariamente y genere esos ficheros en una ruta.

Será un proceso cron, una tarea programada, y generará un fichero excel 97 con las dispensaciones del día. El proveedor nos exige este formato, no admite csv ni xlsx.

1. Apache POI-HSSF y XSSF.

Apache POI es un proyecto de Apache Software Foundation para proporcionar bibliotecas con API de Java para lectura y escritura de ficheros con formatos de Microsoft. De hecho Microsoft pasó a colaborar con contribuciones en el desarrollo de este proyecto para potenciar y ampliar las versiones soportadas.

Por el nombre, Apache POI, no es fácil identificar el objetivo que pretenden. El nombre se debe a que viene de un proyecto inicial de Jakarta Project, llamado «Poor Obfuscation Implementation» que criticaba irónicamente la deficiente ofuscación de los ficheros de Microsoft.

POI admite los formatos de archivo ISO / IEC 29500: 2008 Office Open XML desde la versión 3.5, y soporta ficheros de distintas versiones de Microsoft Office de las aplicaciones PowerPoint, Excel y Word.

Para el caso que nos ocupa necesitaremos un interfaz con Excel en su versión XLS. Leyendo un poco la página de Apache POI identificamos claramente qué librerías necesitaremos descargar. En concreto y en la fecha que escribo este artículo la disponible es poi-bin-4.1.0-20190412.zip.

Descarga Apache  POI 4.1.0
Descarga Apache POI 4.1.0

Descomprimimos y buscamos la referencia. Tenemos la POI-XSSF/SXSSF para las versiones de xlsx, y la POI-HSSF para las versiones de Excel 97 y xls. Esta es la que necesitamos en nuestro caso.

2. Importar recursos en Mirth Connect

Una vez que sabemos qué ficheros debemos utilizar, como con cualquier uso de librería externa en Mirth Connect, la colocamos en la ruta de recursos de Mirth y actualizamos los recursos disponibles.

Recordando un poco, en la sección Settings, pestaña Resources, pulsando el botón Reload Resource nos cargará lo que esté en la ruta Custom-lib, por ejemplo.

Cargar Recursos en Mirth de la biblioteca POI
Cargar Recursos en Mirth de la biblioteca POI

3. Clases de Apache POI-HSSF necesarias

Una vez cargados los recursos, tenemos disponible las clases de APache PO-HSSF para comenzar a desarrollar.

Para trabajar con archivos de tipo xls de Excel deberemos usar las siguientes clases:

  • HSSFWorkbook: Crearemos una instancia de HSSFWorkbook para crear el libro excel.
  • HSSFSheet: Cada hoja excel (Sheet) se corresponderá con una instancia de HSSFSheet.
  • HSSFRow : En cada hoja (HSSFSheet) se podrán acceder a las filas HSSFRow, y en cada fila se podrá crear una celda con CreateCell.
  • HSSFCell: La instancia representa una celda de una fila concreta.

El método setCellValue nos permite establecer el valor de una celda, y se trata de un método sobrecargado con los tipos boolean, Calendar, Date, double, RichTextString y String.

Si quisiéramos añadir estilos a las celdas para que la excel sea mas legible, también tendríamos la opción con el método setCellStyle.

Incluso el API de Apache-POI nos permite insertar fórmulas excel en las celdas, con el método setCellFormula.

4. Desarrollo en Mirth Connect utilizando Apache POI-HSSF

Para exportar a excel en Mirth Connect desarrollaremos un nuevo canal que realizará las siguientes acciones:

  1. Lectura de base de datos de los registros de dispensación.
  2. Creación de fichero excel diario.
  3. Insertar una fila por cada registro obtenido en el paso 1.
  4. Insertar cada valor de celda por cada campo obtenido en el paso 1.

Nuestro canal Mirth tendrá en el Source una interfaz con base de datos en SQL Server, que recuperará con una select bastante simple las dispensaciones realizadas en el día, en forma de lote. Es decir, no hay que olvidar marcar la opción Aggregate Results, para que nos devuelva una línea por cada registro, sino un xml con todas las líneas devueltas agregadas:

Source Connector POI
Source Connector para exportar excel POI

Añadiremos un Transformer de tipo Javascript en Source. Se podría plantear de otras formas quizás mas elegantes, en el Destination, pero para ilustrar el ejemplo nos basta así. En el Transformer incluiremos el código que creará una excel nueva. Luego creará una hoja, y una fila en dicha hoja con la cabecera.

Código Javascript en el Source Transformer

Para empezar a desarrollar el código, lo primero que haremos será crear el libro excel instanciando HSSFWorkbook:

var libro = new Packages.org.apache.poi.hssf.usermodel.HSSFWorkbook();   

Hay que recordar que para utilizar las clases de una librería externa en Mirth Connect hay que indicar toda la ruta de los Packages.

Sin entrar a mas detalle, controlaremos todas las excepciones que puedan dar encerrando todo el código del transformer en un bloque try catch.

El siguiente paso será crear una hoja en el libro:

var hoja = libro.createSheet();

Y luego crearemos una fila para la cabecera. El índice de la primera fila comienza en 0:

 var fila = hoja.createRow(0);

Y ahora pondremos los textos de la fila cabecera de la tabla:

var celda = fila.createCell(0).setCellValue("Fecha");
celda = fila.createCell(1).setCellValue("NHC");
celda = fila.createCell(2).setCellValue("Nombre y Apellidos");
celda = fila.createCell(3).setCellValue("CódigoNacional");
celda = fila.createCell(4).setCellValue("Descripcion Medicamento");
celda = fila.createCell(5).setCellValue("Unidades");
celda = fila.createCell(6).setCellValue("Orden");
celda = fila.createCell(7).setCellValue("PMF");
celda = fila.createCell(8).setCellValue("Precio Unitario");

Posteriormente añadirá una fila por cada registro obtenido en el Source, insertando en cada celda correspondiente los valores recogidos desde la base de datos.

var i = 1; 
for each(registro in msg['result'])
{			
   var fila = hoja.createRow(i++);
   celda = fila.createCell(0).setCellValue(registro['fecha'].toString());
   celda = fila.createCell(1).setCellValue(registro['nhc'].toString());
...			
}

El contenido completo del Transformer será algo así:

// Author: Jose Ramon Pascual  Fecha: 03/03/2019
// Descripcion: 
// Ejemplo de cómo exportar a excel en Mirth Connect utilizando el API Apache POI
// Código correspondiente a Transformer en Source 

try {
        
        // Se crea el libro excel class HSSFWorkbook 
        var libro = new Packages.org.apache.poi.hssf.usermodel.HSSFWorkbook();          

        // Se crea una hoja dentro del libro class HSSFSheet 
        var hoja = libro.createSheet();

        // Se crea una fila dentro de la hoja class HSSFRow 
        var fila = hoja.createRow(0);
        
       // Celda 0 Cabecera de la hoja
        // Se crean celdas dentro de la fila class HSSFCell 
        
        var celda = fila.createCell(0).setCellValue("Fecha");
           celda = fila.createCell(1).setCellValue("NHC");
        celda = fila.createCell(2).setCellValue("Nombre y Apellidos");
        celda = fila.createCell(3).setCellValue("CódigoNacional");
        celda = fila.createCell(4).setCellValue("Descripcion Medicamento");
        celda = fila.createCell(5).setCellValue("Unidades");
        celda = fila.createCell(6).setCellValue("Orden");
        celda = fila.createCell(7).setCellValue("PMF");
        celda = fila.createCell(8).setCellValue("Precio Unitario");
        
        // Insertar los datos de cada fila desde la lectura de BD
        var i = 1; // Insertar todas las filas leidas desde BD
        for each(registro in msg['result'])
        {            
           var fila = hoja.createRow(i++);
           celda = fila.createCell(0).setCellValue(registro['fecha'].toString());
               celda = fila.createCell(1).setCellValue(registro['nhc'].toString());
            celda = fila.createCell(2).setCellValue(registro['paciente'].toString());
            celda = fila.createCell(3).setCellValue(registro['cn'].toString());
            celda = fila.createCell(4).setCellValue(registro['descripcion'].toString());
            celda = fila.createCell(5).setCellValue(registro['cantidadunidades'].toString());
            celda = fila.createCell(6).setCellValue(registro['orden'].toString());
            celda = fila.createCell(7).setCellValue(registro['pmf'].toString());
            celda = fila.createCell(8).setCellValue(registro['costeunitario'].toString());            
        }
        channelMap.put('NombreFichero',configurationMap.get('ruta') + "Dispensador_" + DateUtil.getCurrentDate('yyyyMMdd') + ".xls");
         var fichero = new java.io.FileOutputStream(channelMap.get('NombreFichero'));
          libro.write(fichero);
          fichero.close();

}
catch (e) {
    // Aquí procesaremos la excepcion segun nos interese.
    // Para este ejemplo no procede mas que pasar la descripcion
    channelMap.put('error_descripcion' , "Error en Source Transformer Paso 0: " + e);
}

Este canal generará ficheros excel de dispensaciones diarias como este ejemplo:

Tabla Ejemplo excel en Mirth
Tabla Ejemplo excel en Mirth

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

8 ideas sobre “Cómo exportar a excel en Mirth Connect”

Follow by Email
LinkedIn
Share
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Ver
Privacidad