public void execute(NewRowEvent newRowEvent){
		String[] formattedResults = new String[finalReportColumnCount];
		Object[] nonFormattedResults = new Object[finalReportColumnCount];
		Object[] previousRowGrpValues = getPreviousRowOfGroupingValues();
		
		Object valueForCurrentColumn = null; 
		
		boolean groupChanged = true;
		
		//handle the grouping columns first
		IGroupColumn currentGrpCol = null; 
		for(int i=0; i<finalReportGroupCount; i++){
			currentGrpCol = groupCols.get(i);
			valueForCurrentColumn = currentGrpCol.getValue(newRowEvent);
			nonFormattedResults[i] = valueForCurrentColumn;
			
			if(	currentGrpCol.showDuplicates() 
				|| previousRowGrpValues == null 
				|| !valueForCurrentColumn.equals(previousRowGrpValues[i])){
				formattedResults[i] = currentGrpCol.getFormattedValue(valueForCurrentColumn);
			}else{
				formattedResults[i] = IReportOutput.WHITESPACE;
				groupChanged = false;
			}
		}
		
		//then handle the data columns
		for(int i=0; i<dataColumns.size(); i++){
			if(dataColumns.get(i) instanceof SecondProcessVarianceColumn && groupChanged){
				dataColumns.get(i).getCalculator().init();
			}
			valueForCurrentColumn = dataColumns.get(i).getValue(newRowEvent);
			nonFormattedResults[finalReportGroupCount+i] = valueForCurrentColumn;
			formattedResults[finalReportGroupCount+i] = dataColumns.get(i).getFormattedValue(valueForCurrentColumn, newRowEvent);
		}
		
		getContext().set(ContextKeys.CONTEXT_KEY_COMPUTED_CELL_VALUES, nonFormattedResults);
		getContext().set(ContextKeys.CONTEXT_KEY_FORMATTED_CELL_VALUES, formattedResults);
	}