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.

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.

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:
- Lectura de base de datos de los registros de dispensación.
- Creación de fichero excel diario.
- Insertar una fila por cada registro obtenido en el paso 1.
- 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:

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:

8 ideas sobre “Cómo exportar a excel en Mirth Connect”
Hola. Si quisiera exportar desde Mirth Connect a RTF ¿Tengo que usar la libreria POI o hay otra forma mas simple?
Gracias de antemano.
Muy buena explicación.
Una vez tienes el objeto libro, ¿como lo tratas para obtener el fichero?
¿Hay que pasarlo a base64?
Creo que no has adjuntado el contenido completo del transformer como indicas en el post.
Muchas grácias.
Ya he encontrador como hacerlo.
Hay que convertir el objeto «libro» a byteArray para poder grabarlo en un fichero, enviarlo por correo o lo que sea que queramos hacer con el.
Para eso podemos utilizar la classe ByteArrayOutputStream. Como pertenece a java.io no es necesario importar ninguna custom-lib.
El codigo del transformer podria quedar así:
var llibre = new Packages.org.apache.poi.hssf.usermodel.HSSFWorkbook();
var full = llibre.createSheet();
var fila = full.createRow(0);
var cella = fila.createCell(0).setCellValue(«Col1»);
cella = fila.createCell(1).setCellValue(«Col2»);
cella = fila.createCell(2).setCellValue(«Col3»);
var i = 1;
for each(registre in msg[‘result’])
{
var fila = full.createRow(i++);
cella = fila.createCell(0).setCellValue(registre[‘col1t’].toString());
cella = fila.createCell(1).setCellValue(registre[‘col2’].toString());
cella = fila.createCell(2).setCellValue(registre[‘col3’].toString());
}
var baos= new Packages.java.io.ByteArrayOutputStream;
llibre.write(baos);
// Generar un adjunt dins el canal
var x=addAttachment(baos.toByteArray(), «application/vnd.ms-excel»,true);
// Guardar dins un map per a posterior ús
channelMap.put(‘fitxer’,baos.toByteArray());
Hola Carles,
Disculpa la tardanza en responder.
Debía ocurrir algún problema con el snippet, pero a mi se me muestra el código completo del paso del transformer. He probado desde anónimo por si se hubiese quedado en privado, pero se ve, así que sería algún problema puntual con el snippet.
Un saludo.
Hola Carles, y gracias por la aportación.
Lo que hice en este ejemplo fue guardarlo directamente como stream de bytes, con la clásica FileOutputStream.
En el trasnformer aparece así (por favor dime si sigues sin poder ver el code snippet) :
var fichero = new java.io.FileOutputStream(channelMap.get(‘NombreFichero’));
libro.write(fichero);
fichero.close();
Hola Julian,
Lo bueno de Mirth es que puedes utilizar cualquier librería Java, no tiene que ser POI, pero esta de Apache es bastante sencilla y está bien documentada. Te dejo el enlace de la doc de Apache POI a documentos de Word.
De cualquier manera, si quieres manejar RTF estás de suerte, porque no necesitas ninguna librería, Mirth Connect ya tiene un exportador nativo de documento RTF.
Simplemente, en tu canal añade un Destination de tipo Document Writer, y en el selector Document Type, marca RTF como tipo. Luego utiliza la plantilla, puedes usar HTML, para formatear el documento. Así de fácil.
Un saludo,
Hola!!
Se que la entrada tiene algunos años ya.. pero alguien ha realizado algo similar en WORD pero en lectura?
Tengo que conseguir leer un documento docx, para poder llegar a una información dentro de unas tablas… he visto que con POI se supone que debería llegar, pero encuentro poco docu al respecto…
Gracias!
se puede hacer el caso contrario??.. tener un excel y leer los datos para hacer insert luego en una BD??.. de antemano muchas gracias por todos sus aportes!!.. un saludo