Mirth Custom Excel Reader
Hi Folks,
Today I’m gonna share a solution Mirth Custom Excel Reader which reads the excel file and get the contents in a string delimited text format.
For this we mainly using apache poi jar which is standard jar even used for java solutions for parsing excel files
Pre-requisites:
- MirthConnect : Above 3.3
- Custom Jars:
- dom4j-1.6.jar
- poi-3.9.jar
- poi-ooxml-3.8.jar
- poi-ooxml-schemas-3.7.jar
- xmlbeans-2.5.0.jar
Solution:
function ExtractExcelContent(fileDirectory, originalFilename, billingEntity) { logger.debug("len:"+originalFilename.split("_").length); var path = fileDirectory + '/' + originalFilename; // Call file with path var fileF = new java.io.File(path); var inputstream = new java.io.FileInputStream(fileF); // String Builder for excelData var excelData = new java.lang.StringBuilder(); var workBook = new org.apache.poi.ss.usermodel.WorkbookFactory.create(inputstream); var dataFormatter = new org.apache.poi.ss.usermodel.DataFormatter(); // Create Empty String separator var sep = ""; var sep2 = ""; // Create ArrayList() var excelheaders = new java.util.ArrayList(); var get_Entity = ''; var get_Number = ''; var exitExcelReader = ''; var isEAIserviceNotification = false; var r = org.apache.poi.ss.usermodel.Row; var cell = org.apache.poi.ss.usermodel.Cell; var sheet = Packages.org.apache.poi.ss.usermodel.Sheet; try { var evaluator = workBook.getCreationHelper().createFormulaEvaluator(); var cr = ""; // Loop Through the number of Excel Sheets available for (var i = 0; i < workBook.getNumberOfSheets(); i++) { // Call [poi.ss.usermodel.Sheet] class // Get the sheet starting from (0,1,2,3...) sheet = workBook.getSheetAt(i); var rowStart = Math.min(4, sheet.getFirstRowNum()); var rowEnd = Math.max(1400, sheet.getLastRowNum()); for (var rowNum = rowStart; rowNum < rowEnd; rowNum++) { var j = 0; r = sheet.getRow(rowNum); if (r == null) { // This whole row is empty // Handle it as needed continue; } var lastColumn = Math.max(r.getLastCellNum(), 20); for (var cn = 0; cn 4 && r.getCell(3)!=null && r.getCell(3)>0) { logger.debug("inside if"); // The spreadsheet is empty in this cell /* if (cell.getRowIndex() == 4) { excelheaders.add(cell.toString()); }*/ sep2 = "#:~"; // Append "" empty space excelData.append(sep); // Append column headers excelData.append(excelheaders.get(j)); excelData.append(sep2); excelData.append(''); sep = "|"; } else if(cell != null ) { logger.debug("inside else"); // Do something useful with the cell's contents // Start getting the content of the cell from 5th cell preparedBy = sheet.getRow(5).getCell(0).toString(); //if (cell != null){ if (sheet.getRow(cell.getRowIndex()).getCell(11) != null && cell.getRowIndex() > 4) { get_Entity = sheet.getRow(cell.getRowIndex()).getCell(11).toString(); } // Get the RowIndex and add that to cell if (cell.getRowIndex() == 4 ) { excelheaders.add(cell.toString()); } // check if the content is equal to the content in LINE:67 if (cell.getRowIndex() > 4 && cell.getRow().getCell(3) > 0 && cell.getColumnIndex() 4) { get_Number = dataFormatter.formatCellValue(cell); } } else if (cell != null){ cr = new org.apache.poi.ss.util.CellReference(cell.toString()); row = sheet.getRow(cr.getRow()); cell = row.getCell(cr.getCol()); excelData.append(CheckData(dataFormatter.formatCellValue(cell))); } sep = "|"; if (cell.getColumnIndex() == 20) { excelData.append("\n"); sep = ""; } } else if (cell.getRowIndex() > 4 && cell.getRow().getCell(3) > 0 && cell.getColumnIndex() <= 20) { exitExcelReader = true; break; } } j++; // increment 'j' counter value } } } channelMap.put('Entity', get_Entity); channelMap.put('Number', get_Number); // File Archive Funtionality Start var currentDate = com.mirth.connect.server.userutil.DateUtil.getCurrentDate('YYYYMMdd'); var extension = originalFilename.split('//.') var archivePath = 'ArchivePath'//your path channelMap.put('archivePath', archivePath); var sourceFileWithPath = fileDirectory + "\\" + originalFilename; var imageBytes = FileUtil.readBytes(sourceFileWithPath); var encodedValue = FileUtil.encode(imageBytes); //Archive source message FileUtil.write(archivePath, false, imageBytes); logger.debug(archivePath + ' was backedup successfully '); // File Archive Funtionality End // Delete Source File Functionality Start var del = new java.io.File(sourceFileWithPath); del['delete'](); logger.debug(sourceFileWithPath + ' was deleted from source successfully ') } catch (e) { logger.debug("catch Block : " + e); getErrorMailContent(" file did not process successfully"); } finally { //workBook.close(); inputstream.close(); channelMap.put('isEAIServiceNotification', isEAIserviceNotification); } function CheckData (StringValue) { var d = StringValue; if(StringValue!=undefined){ if(isNaN(StringValue)){ return d; }else{ var x = StringValue.toString().split('\\.'); if(x[1]=='0'){ d = x[0]; } } } return d; }
Above code traverses through each cell and fetches data via row wise and convert them to a delimited text.
I hope this solution helps you guys if you ever get a excel file as a input.
Feel free to comment and explore the code