package gw.rating.rtm.excel uses gw.api.locale.DisplayKey uses gw.api.util.DisplayableException uses gw.rating.rtm.domain.ErrorCollector uses gw.rating.rtm.domain.RateTablePopulator uses gw.rating.rtm.domain.table.RateTableModel uses gw.rating.rtm.valueprovider.ValueProviderVisitor uses org.apache.poi.ss.usermodel.Row uses org.apache.poi.xssf.usermodel.XSSFSheet class ExcelSheetPopulator implements RateTablePopulator { var _spreadsheet : XSSFSheet as Worksheet var numRowsToRemove: int as readonly RowOffset construct(spreadsheet: XSSFSheet) { if (spreadsheet == null) throw "Spreadsheet can not be null" _spreadsheet = spreadsheet numRowsToRemove = ExcelHeader.RATE_TABLE_HEADER_END_ROW } override function populate(model : RateTableModel, errorCollector: ErrorCollector) : RateTableModel { var rows = _spreadsheet.rowIterator().toList() removeHeaderRow(rows) process(rows, model, errorCollector) return model } override function refresh(model : RateTableModel) { } override function startInEditMode() : boolean { return true } function isCompatibleTable(rateTable : RateTable) : boolean { var rateTableDef = rateTable.Definition var nonDisplayCells = 0 var cellIndex = 0 for (column in rateTableDef.AllColumns) { var row = _spreadsheet.getRow(numRowsToRemove) if (row == null) {//This might happen if the spreadsheet does not have expected content continue } //compare non-display columns to the column definitions. var cell = row.getCell(cellIndex) while (cell.CellComment.String as String == DisplayKey.get("Web.Rating.Export.DisplayOnly")) { cellIndex++ cell = row.getCell(cellIndex) } if ((cell.StringCellValue == null) or (not cell.StringCellValue.containsIgnoreCase(column.LocalizedColumnLabel))) { return false } //only the number of unmodifiable columns that are checked need to be tracked nonDisplayCells++ cellIndex++ } //if the number of columns in the spreadsheet (excluding display columns) match the number of columns in the table definition return nonDisplayCells == rateTableDef.AllColumns.length } private function process(rows : List, model : RateTableModel, errorCollector: ErrorCollector) { rows.each( \ row -> { var tableRow = model.addEmptyRow() var visitor = new ImportVisitor(errorCollector, row, model.ValueProviderRepository) var valueProviderVisitor = new ValueProviderVisitor(errorCollector, model.ValueProviderRepository, visitor) tableRow.accept(valueProviderVisitor) }) if (errorCollector.getErrorCount() > 0) { throw new DisplayableException(errorCollector.getErrorSummary()) } } private function removeHeaderRow(rows : List) { if (rows.Empty) return // remove all rows before the rate table in the worksheet for (ExcelHeader.RATE_TABLE_HEADER_START_ROW.. numRowsToRemove) { rows.remove(ExcelHeader.RATE_TABLE_HEADER_START_ROW) } } /* * Number of Rate Factor Rows in the excel sheet */ property get NumberOfRateFactorRows() : int { return _spreadsheet.LastRowNum - RowOffset } }