← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 3928: Added UseExisting,UseCaptrued,GenerateAggData options in TabularAnalysis; Fixed bug in TNHMIS XML...

 

------------------------------------------------------------
revno: 3928
committer: Bharath <chbharathk@xxxxxxxxx>
branch nick: dhis2
timestamp: Fri 2011-06-17 10:27:05 +0530
message:
  Added UseExisting,UseCaptrued,GenerateAggData options in TabularAnalysis; Fixed bug in TNHMIS XML Importing
modified:
  local/in/dhis-web-dashboard/src/main/java/org/hisp/dhis/dataanalyser/ta/action/GenerateTabularAnalysisResultAction.java
  local/in/dhis-web-dashboard/src/main/resources/org/hisp/dhis/dataanalyser/i18n_module.properties
  local/in/dhis-web-excelimport/src/main/java/org/hisp/dhis/excelimport/tcs/action/TCSXmlImportResultAction.java


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'local/in/dhis-web-dashboard/src/main/java/org/hisp/dhis/dataanalyser/ta/action/GenerateTabularAnalysisResultAction.java'
--- local/in/dhis-web-dashboard/src/main/java/org/hisp/dhis/dataanalyser/ta/action/GenerateTabularAnalysisResultAction.java	2011-05-27 11:25:15 +0000
+++ local/in/dhis-web-dashboard/src/main/java/org/hisp/dhis/dataanalyser/ta/action/GenerateTabularAnalysisResultAction.java	2011-06-17 04:57:05 +0000
@@ -37,7 +37,6 @@
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -52,6 +51,7 @@
 import jxl.format.Border;
 import jxl.format.BorderLineStyle;
 import jxl.format.Colour;
+import jxl.format.VerticalAlignment;
 import jxl.write.Label;
 import jxl.write.Number;
 import jxl.write.WritableCellFormat;
@@ -75,7 +75,6 @@
 import org.hisp.dhis.organisationunit.OrganisationUnitGroup;
 import org.hisp.dhis.organisationunit.OrganisationUnitGroupService;
 import org.hisp.dhis.organisationunit.OrganisationUnitService;
-import org.hisp.dhis.organisationunit.comparator.OrganisationUnitNameComparator;
 import org.hisp.dhis.period.DailyPeriodType;
 import org.hisp.dhis.period.MonthlyPeriodType;
 import org.hisp.dhis.period.Period;
@@ -305,6 +304,7 @@
     List<Indicator> indicatorList;
     List<String> serviceTypeList;
     Map<Integer, List<Integer>> periodMap;
+    
     // -------------------------------------------------------------------------
     // Action implementation
     // -------------------------------------------------------------------------
@@ -520,7 +520,6 @@
         // calling diffrent functions       
         if ( orgUnitSelListCB.equalsIgnoreCase( ORGUNITSELECTED ) )
         {
-            System.out.println( ORGUNITSELECTED + " Report Generation Start Time is : \t" + new Date() );
             if( aggData.equalsIgnoreCase( USECAPTUREDDATA ) && aggPeriodCB == null )
             {
                 System.out.println("Inside generateSelectedOrgUnitData_UseCapturedData_Periodwise method");
@@ -536,6 +535,21 @@
                 System.out.println("Inside generateSelectedOrgUnitData_GenerateAggregateData_AggPeriods method");
                 generateSelectedOrgUnitData_GenerateAggregateData_AggPeriods();
             }
+            else if( aggData.equalsIgnoreCase( GENERATEAGGDATA ) && aggPeriodCB == null )
+            {
+                System.out.println("Inside generateSelectedOrgUnitData_GenerateAggregateData_Periodwise method");
+                generateSelectedOrgUnitData_GenerateAggregateData_Periodwise();
+            }
+            else if( aggData.equalsIgnoreCase( USEEXISTINGAGGDATA ) && aggPeriodCB == null )
+            {
+                System.out.println("Inside generateSelectedOrgUnitData_UseExisting_Periodwise method");
+                generateSelectedOrgUnitData_UseExisting_Periodwise();
+            }
+            else if( aggData.equalsIgnoreCase( USEEXISTINGAGGDATA ) && aggPeriodCB != null )
+            {
+                System.out.println("Inside generateSelectedOrgUnitData_UseExisting_AggPeriods method");
+                generateSelectedOrgUnitData_UseExisting_AggPeriods();
+            }
             else
             {
                 generateOrgUnitSelected();
@@ -543,12 +557,44 @@
         }
         else if ( orgUnitSelListCB.equalsIgnoreCase( ORGUNITGRP ) )
         {
-            System.out.println( ORGUNITGRP + " Report Generation Start Time is : \t" + new Date() );
-            generateOrgUnitGroup();
+            if ( aggData.equalsIgnoreCase( USEEXISTINGAGGDATA ) && aggPeriodCB == null )
+            {
+                System.out.println("Inside generateOrgUnitGroupData_UseExisting_Periodwise method");
+                generateOrgUnitGroupData_UseExisting_Periodwise();
+            }
+            else if ( aggData.equalsIgnoreCase( USEEXISTINGAGGDATA ) && aggPeriodCB != null )
+            {
+                System.out.println("Inside generateOrgUnitGroupData_UseExisting_AggPeriods method");
+                generateOrgUnitGroupData_UseExisting_AggPeriods();
+            }
+            else if ( aggData.equalsIgnoreCase( GENERATEAGGDATA ) && aggPeriodCB == null )
+            {
+                System.out.println("Inside generateOrgUnitGroupData_GenerateAggregateData_Periodwise method");
+                generateOrgUnitGroupData_GenerateAggregateData_Periodwise();
+            }
+            else if ( aggData.equalsIgnoreCase( GENERATEAGGDATA ) && aggPeriodCB != null )
+            {
+                System.out.println("Inside generateOrgUnitGroupData_GenerateAggregateData_AggPeriods method");
+                generateOrgUnitGroupData_GenerateAggregateData_AggPeriods();
+            }
+            else if ( aggData.equalsIgnoreCase( USECAPTUREDDATA ) && aggPeriodCB == null )
+            {
+                System.out.println("Inside generateOrgUnitGroupData_UseCapturedData_Periodwise method");
+                generateOrgUnitGroupData_UseCapturedData_Periodwise();
+            }
+            else if ( aggData.equalsIgnoreCase( USECAPTUREDDATA ) && aggPeriodCB != null )
+            {
+                System.out.println("Inside generateOrgUnitGroupData_UseCapturedData_AggPeriods method");
+                generateOrgUnitGroupData_UseCapturedData_AggPeriods();
+            }
+            else
+            {
+                System.out.println( ORGUNITGRP + " Report Generation Start Time is : \t" + new Date() );
+                generateOrgUnitGroup();
+            }
         }
         else if ( orgUnitSelListCB.equalsIgnoreCase( ORGUNITLEVEL ) )
         {
-            System.out.println( ORGUNITLEVEL + " Report Generation Start Time is : \t" + new Date() );
             if ( aggData.equalsIgnoreCase( USEEXISTINGAGGDATA ) && aggPeriodCB == null )
             {
                 System.out.println("Inside generateOrgUnitLevelData_UseExisting_Periodwise method");
@@ -636,7 +682,7 @@
     }
 
     // -------------------------------------------------------------------------
-    // Method for getting Selected OrgUnit(s) data in Excel Sheet 
+    // Method for getting OrgUnit Level wise data in Excel Sheet 
     //     - UseCapturedData - Period Aggregation 
     // -------------------------------------------------------------------------
     public void generateOrgUnitLevelData_UseCapturedData_AggPeriods() throws Exception
@@ -857,7 +903,225 @@
         outputReportFile.deleteOnExit();
     }
 
-    
+    // -------------------------------------------------------------------------
+    // Method for getting OrgUnit Group wise data in Excel Sheet 
+    //     - UseCapturedData - Period Aggregation 
+    // -------------------------------------------------------------------------
+    public void generateOrgUnitGroupData_UseCapturedData_AggPeriods() throws Exception
+    {
+        int headerRow = 0;
+        int headerCol = 0;
+
+        String raFolderName = configurationService.getConfigurationByKey( Configuration_IN.KEY_REPORTFOLDER ).getValue();
+        String outputReportPath = System.getenv( "DHIS2_HOME" ) + File.separator + raFolderName + File.separator + "output" + File.separator + UUID.randomUUID().toString() + ".xls";
+        WritableWorkbook outputReportWorkbook = Workbook.createWorkbook( new File( outputReportPath ) );
+        WritableSheet sheet0 = outputReportWorkbook.createSheet( "TabularAnalysis", 0 );
+
+        sheet0.addCell( new Label( headerCol, headerRow, "Sl.No.", getCellFormat1() ) );
+
+        selOrgUnit = organisationUnitService.getOrganisationUnit( Integer.parseInt( orgUnitListCB.get( 0 ) ) );
+        selOUList = new ArrayList<OrganisationUnit>( organisationUnitService.getOrganisationUnitWithChildren( selOrgUnit.getId() ) );
+
+        OrganisationUnitGroup selOrgUnitGroup = organisationUnitGroupService.getOrganisationUnitGroup( orgUnitLevelCB );
+        List<OrganisationUnit> orgUnitList1 = new ArrayList<OrganisationUnit>( selOrgUnitGroup.getMembers() );
+
+        selOUList.retainAll( orgUnitList1 );
+        
+        int minOULevel = 1;
+        int maxOULevel = organisationUnitService.getNumberOfOrganisationalLevels();
+
+        int c1 = headerCol + 1;
+
+        for( int i = minOULevel; i <= maxOULevel; i++ )
+        {
+            sheet0.addCell( new Label( c1, headerRow, "Level- "+i, getCellFormat1() ) );
+            c1++;
+        }
+
+        Map<Integer, Integer> orgunitLevelMap = new HashMap<Integer, Integer>( reportService.getOrgunitLevelMap() );
+
+        /* Service Info */
+        Indicator selIndicator = new Indicator();
+        DataElement selDataElement = new DataElement();
+        DataElementCategoryOptionCombo selDecoc = new DataElementCategoryOptionCombo();
+        int flag = 0;
+
+        List<Integer> orgUnitIds = new ArrayList<Integer>( getIdentifiers(OrganisationUnit.class, selOUList ) );
+        orgUnitIdsByComma = getCommaDelimitedString( orgUnitIds );
+        
+        Map<String, String> aggDataMap = new HashMap<String, String>( reportService.getDataFromDataValueTableByPeriodAgg( orgUnitIdsByComma, dataElementIdsByComma, periodIdsByComma ) );
+    
+        /* Calculation Part */
+        int rowCount = 1;
+        int colCount = 0;
+        for( OrganisationUnit ou : selOUList )
+        {
+            System.out.println("Entered into orgunitloop :"+new Date());
+            sheet0.addCell( new Number( headerCol, headerRow + rowCount, rowCount, getCellFormat2() ) );
+            
+            Integer level = orgunitLevelMap.get( ou.getId() );
+            if( level == null )
+                level = organisationUnitService.getLevelOfOrganisationUnit( ou );
+            
+            colCount = 1 + level - minOULevel;
+            sheet0.addCell( new Label( colCount, headerRow + rowCount, ou.getName(), getCellFormat2() ) );
+
+            OrganisationUnit orgUnit = new OrganisationUnit();
+            orgUnit = ou;
+            int count1=1;
+            while( orgUnit.getParent() != null )
+            {
+                orgUnit = orgUnit.getParent();
+                sheet0.addCell( new Label( colCount-count1, headerRow + rowCount, orgUnit.getName(), getCellFormat2() ) );
+                count1++;
+            }
+
+            colCount = c1;
+            int deListCount = 0;
+            int indListCount = 0;
+            int serviceListCount = 0;
+            for( String serviceType : serviceTypeList )
+            {
+                String tempStr = "";
+                Double indValue = 0.0;
+                Double dataValue = 0.0;
+                
+                if ( serviceType.equalsIgnoreCase( "I" ) )
+                {
+                    Double numValue = 0.0;
+                    Double denValue = 0.0;
+
+                    flag = 1;
+                    selIndicator = indicatorList.get( indListCount );
+                    indListCount++;
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.addCell( new Label( colCount, headerRow, selIndicator.getName(), getCellFormat1() ) );
+                    }
+                    
+                    try
+                    {
+                        numValue = Double.parseDouble( getAggValByOrgUnit( selIndicator.getNumerator(), aggDataMap, ou.getId() ) );
+                    }
+                    catch( Exception e )
+                    {
+                    }
+                    
+                    try
+                    {
+                        denValue = Double.parseDouble( getAggValByOrgUnit( selIndicator.getDenominator(), aggDataMap, ou.getId() ) );
+                    }
+                    catch( Exception e )
+                    {
+                    }
+                    
+                    try
+                    {
+                        if( denValue != 0.0 )
+                        {
+                            indValue = ( numValue / denValue ) * selIndicator.getIndicatorType().getFactor();
+                        }
+                        else
+                        {
+                            indValue = 0.0;
+                        }
+                    }
+                    catch( Exception e )
+                    {
+                        indValue = 0.0;
+                    }
+                    
+                    indValue = Math.round( indValue * Math.pow( 10, 1 ) ) / Math.pow( 10, 1 );
+                }
+                else
+                {
+                    flag = 2;
+                    selDataElement = dataElementList.get( deListCount );
+                    deListCount++;
+                    if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                    {
+                        selDecoc = dataElementCategoryService.getDataElementCategoryOptionCombo( Integer.parseInt( selectedServices.get( serviceListCount ).split( ":" )[2] ) );
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow, selDataElement.getName() + "-" + selDecoc.getName(), getCellFormat1() ) );
+                        }
+                        
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            tempStr = aggDataMap.get( ou.getId()+":"+selDataElement.getId()+":"+selDecoc.getId() );
+                            if( tempStr != null )
+                            {
+                                try
+                                {
+                                    dataValue = Double.parseDouble( tempStr );
+                                }
+                                catch( Exception e )
+                                {
+                                    dataValue = 0.0;
+                                }
+                            }
+                        }
+                        else
+                        {
+                            dataValue = 0.0;
+                        }
+                    }
+                    else
+                    {
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow, selDataElement.getName(), getCellFormat1() ) );
+                        }
+                        List<DataElementCategoryOptionCombo> optionCombos = new ArrayList<DataElementCategoryOptionCombo>( selDataElement.getCategoryCombo().getOptionCombos() );
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            for( DataElementCategoryOptionCombo optionCombo : optionCombos )
+                            {
+                                tempStr = aggDataMap.get( ou.getId()+":"+selDataElement.getId()+":"+optionCombo.getId() );
+                                if( tempStr != null )
+                                {
+                                    try
+                                    {
+                                        dataValue += Double.parseDouble( tempStr );
+                                    }
+                                    catch( Exception e )
+                                    {
+                                    }
+                                }
+                            }
+                        }
+                        else
+                        {
+                            dataValue = 0.0;
+                        }
+                    }
+                }
+
+                if ( flag == 1 )
+                {
+                    sheet0.addCell( new Number( colCount, headerRow + rowCount, indValue, getCellFormat2() ) );
+                }
+                else
+                {
+                    sheet0.addCell( new Number( colCount, headerRow + rowCount, dataValue, getCellFormat2() ) );
+                }
+
+                colCount++;
+                serviceListCount++;
+            }// Service loop end
+            rowCount++;
+        }// Orgunit loop end
+        
+        outputReportWorkbook.write();
+        outputReportWorkbook.close();
+
+        fileName = "TabularAnalysis.xls";
+        File outputReportFile = new File( outputReportPath );
+        inputStream = new BufferedInputStream( new FileInputStream( outputReportFile ) );
+    
+        outputReportFile.deleteOnExit();
+    }
+
     // -------------------------------------------------------------------------
     // Method for getting Selected OrgUnit(s) data in Excel Sheet 
     //     - UseCapturedData - Period wise 
@@ -1143,11 +1407,9 @@
         outputReportFile.deleteOnExit();
     }
 
-    
     // -------------------------------------------------------------------------
     // Methods for getting OrgUnitSelected wise List in Excel Sheet
     // -------------------------------------------------------------------------
-
     public void generateOrgUnitSelected()
         throws Exception
     {
@@ -1541,7 +1803,6 @@
     // -------------------------------------------------------------------------
     // Methods for getting OrgUnitGroup wise List in Excel Sheet
     // -------------------------------------------------------------------------
-
     public void generateOrgUnitGroup()
         throws Exception
     {
@@ -1569,20 +1830,9 @@
 
         selOUList.retainAll( orgUnitList1 );
 
-        //Collections.sort( selOUList, new OrganisationUnitNameComparator() );
-        // displayPropertyHandler.handle( selOUList );
-
         int minOULevel = 1;
         int maxOULevel = organisationUnitService.getNumberOfOrganisationalLevels();
         
-        
-        /*
-        if ( orgUnitLevelCB != null )
-        {
-            minOULevel = organisationUnitService.getLevelOfOrganisationUnit( selOrgUnit );
-        }
-        */
-        
         int c1 = headerCol + 1;
 
         for( int i = minOULevel; i <= maxOULevel; i++ )
@@ -1599,11 +1849,6 @@
         {
             sheet0.addCell( new Number( headerCol, headerRow + 1 + rowCount, rowCount, getCellFormat2() ) );
             colCount = 1 + organisationUnitService.getLevelOfOrganisationUnit( ou ) - minOULevel;
-            // System.out.println(colCount + " : " + minOULevel + " : " +
-            // organisationUnitService.getLevelOfOrganisationUnit( ou ));
-
-            // sheet0.mergeCells( colCount, headerRow+1+rowCount, colCount,
-            // headerRow+1+rowCount+ouChildCountMap.get( ou ));
             sheet0.addCell( new Label( colCount, rowCount + 1, ou.getName(), getCellFormat2() ) );
             
             OrganisationUnit orgUnit = new OrganisationUnit();
@@ -1615,16 +1860,7 @@
                 sheet0.addCell( new Label( colCount-count1, rowCount + 1, orgUnit.getName(), getCellFormat2() ) );
                 count1++;
             }
-            
-            
-            /*
-             * 
-             * OrganisationUnit parentOu = ou; for(int i =
-             * maxOuLevel-minOULevel+1; i >= minOULevel-1; i-- ) {
-             * 
-             * { parentOu = parentOu.getParent(); sheet0.addCell( new Label( i,
-             * headerRow+rowCount, parentOu.getName(), getCellFormat2() ) ); } }
-             */
+
             /* Service Info */
             Indicator selIndicator = new Indicator();
             DataElement selDataElement = new DataElement();
@@ -1922,7 +2158,6 @@
 
     }
 
-
     // -------------------------------------------------------------------------
     // Method for getting OrgUnit Level wise data in Excel Sheet 
     //     - UseCapturedData - Period wise 
@@ -2239,6 +2474,317 @@
         outputReportFile.deleteOnExit();
     }
 
+    // -------------------------------------------------------------------------
+    // Method for getting OrgUnit Group wise data in Excel Sheet 
+    //     - UseCapturedData - Period wise 
+    // -------------------------------------------------------------------------
+    public void generateOrgUnitGroupData_UseCapturedData_Periodwise() throws Exception
+    {
+        int startRow = 0;
+        int headerRow = 0;
+        int headerCol = 0;
+
+        String raFolderName = configurationService.getConfigurationByKey( Configuration_IN.KEY_REPORTFOLDER ).getValue();
+        String outputReportPath = System.getenv( "DHIS2_HOME" ) + File.separator + raFolderName + File.separator + "output" + File.separator + UUID.randomUUID().toString() + ".xls";
+        WritableWorkbook outputReportWorkbook = Workbook.createWorkbook( new File( outputReportPath ) );
+        WritableSheet sheet0 = outputReportWorkbook.createSheet( "TabularAnalysis", 0 );
+
+        sheet0.mergeCells( headerCol, headerRow, headerCol, headerRow + 1 );
+        sheet0.addCell( new Label( headerCol, headerRow, "Sl.No.", getCellFormat1() ) );
+
+        selOrgUnit = organisationUnitService.getOrganisationUnit( Integer.parseInt( orgUnitListCB.get( 0 ) ) );
+        selOUList = new ArrayList<OrganisationUnit>( organisationUnitService.getOrganisationUnitWithChildren( selOrgUnit.getId() ) );
+        
+        OrganisationUnitGroup selOrgUnitGroup = organisationUnitGroupService.getOrganisationUnitGroup( orgUnitLevelCB );
+        List<OrganisationUnit> orgUnitList1 = new ArrayList<OrganisationUnit>( selOrgUnitGroup.getMembers() );
+
+        selOUList.retainAll( orgUnitList1 );
+
+        int minOULevel = 1;
+        int maxOULevel = organisationUnitService.getNumberOfOrganisationalLevels();
+        int c1 = headerCol + 1;
+
+        for( int i = minOULevel; i <= maxOULevel; i++ )
+        {
+            sheet0.mergeCells( c1, headerRow, c1, headerRow + 1 );
+            sheet0.addCell( new Label( c1, headerRow, "Level- "+i, getCellFormat1() ) );
+            c1++;
+        }
+
+        Map<Integer, Integer> orgunitLevelMap = new HashMap<Integer, Integer>( reportService.getOrgunitLevelMap() );
+    
+        /* Service Info */
+        Indicator selIndicator = new Indicator();
+        DataElement selDataElement = new DataElement();
+        DataElementCategoryOptionCombo selDecoc = new DataElementCategoryOptionCombo();
+        int flag = 0;
+
+        List<Integer> orgUnitIds = new ArrayList<Integer>( getIdentifiers(OrganisationUnit.class, selOUList ) );
+        orgUnitIdsByComma = getCommaDelimitedString( orgUnitIds );
+        
+        Map<String, String> aggDataMap = new HashMap<String, String>( reportService.getDataFromDataValueTable( orgUnitIdsByComma, dataElementIdsByComma, periodIdsByComma ) );
+    
+        /* Calculation Part */
+        int rowCount = 1;
+        int colCount = 0;
+        for( OrganisationUnit ou : selOUList )
+        {
+            System.out.println("Entered into orgunitloop :"+new Date());
+            sheet0.addCell( new Number( headerCol, headerRow + 1 + rowCount, rowCount, getCellFormat2() ) );
+            
+            Integer level = orgunitLevelMap.get( ou.getId() );
+            if( level == null )
+                level = organisationUnitService.getLevelOfOrganisationUnit( ou );
+            
+            colCount = 1 + level - minOULevel;
+            sheet0.addCell( new Label( colCount, headerRow + 1 + rowCount, ou.getName(), getCellFormat2() ) );
+            
+            OrganisationUnit orgUnit = new OrganisationUnit();
+            orgUnit = ou;
+            int count1=1;
+            while( orgUnit.getParent() != null )
+            {
+                orgUnit = orgUnit.getParent();
+                sheet0.addCell( new Label( colCount-count1, headerRow + rowCount + 1, orgUnit.getName(), getCellFormat2() ) );
+                count1++;
+            }
+
+            colCount = c1;
+            int deListCount = 0;
+            int indListCount = 0;
+            int serviceListCount = 0;
+            for( String serviceType : serviceTypeList )
+            {
+                if ( serviceType.equalsIgnoreCase( "I" ) )
+                {
+                    flag = 1;
+                    selIndicator = indicatorList.get( indListCount );
+                    indListCount++;
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                        sheet0.addCell( new Label( colCount, startRow, selIndicator.getName(), getCellFormat1() ) );
+                    }
+                }
+                else
+                {
+                    flag = 2;
+                    selDataElement = dataElementList.get( deListCount );
+                    deListCount++;
+                    if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                    {
+                        selDecoc = dataElementCategoryService.getDataElementCategoryOptionCombo( Integer.parseInt( selectedServices.get( serviceListCount ).split( ":" )[2] ) );
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                            sheet0.addCell( new Label( colCount, startRow, selDataElement.getName() + "-" + selDecoc.getName(), getCellFormat1() ) );
+                        }
+                    }
+                    else
+                    {
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                            sheet0.addCell( new Label( colCount, startRow, selDataElement.getName(), getCellFormat1() ) );
+                        }
+                    }
+                }
+
+                int periodCount = 0;
+                for ( Date sDate : selStartPeriodList )
+                {
+                    Date eDate = selEndPeriodList.get( periodCount );
+                
+                    Collection<Integer> periodIds = new ArrayList<Integer>( periodMap.get( periodCount ) );
+                    System.out.println( periodIds );
+
+                    double pwdvAggValue = 0.0;
+                    double pwdAggIndValue = 0.0;
+
+                    String tempStr = "";
+                    if ( flag == 1 )
+                    {
+                        Double numValue = 0.0;
+                        Double denValue = 0.0;
+                        Double indValue = 0.0;
+                        for( Integer periodId : periodIds )
+                        {
+                            try
+                            {
+                                numValue += Double.parseDouble( getAggVal( selIndicator.getNumerator(), aggDataMap, ou.getId(), periodId ) );
+                            }
+                            catch( Exception e )
+                            {
+                            }
+                            
+                            try
+                            {
+                                denValue += Double.parseDouble( getAggVal( selIndicator.getDenominator(), aggDataMap, ou.getId(), periodId ) );
+                            }
+                            catch( Exception e )
+                            {
+                            }
+                        }
+                        
+                        try
+                        {
+                            if( denValue != 0.0 )
+                            {
+                                indValue = ( numValue / denValue ) * selIndicator.getIndicatorType().getFactor();
+                            }
+                            else
+                            {
+                                indValue = 0.0;
+                            }
+                        }
+                        catch( Exception e )
+                        {
+                            indValue = 0.0;
+                        }
+
+                        pwdAggIndValue = indValue;
+                        pwdAggIndValue = Math.round( pwdAggIndValue * Math.pow( 10, 1 ) ) / Math.pow( 10, 1 );
+                        tempStr = "" + pwdAggIndValue;
+                    }
+                    else if ( flag == 2 )
+                    {
+                        if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                        {
+                            if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                            {
+                                for( Integer periodId : periodIds )
+                                {
+                                    tempStr = aggDataMap.get( ou.getId()+":"+selDataElement.getId()+":"+selDecoc.getId()+":"+periodId );
+                                    if( tempStr != null )
+                                    {
+                                        try
+                                        {
+                                            pwdvAggValue += Double.parseDouble( tempStr );
+                                        }
+                                        catch( Exception e )
+                                        {
+                                        }
+                                    }
+                                }
+                                tempStr = "" + (int) pwdvAggValue;
+                            }
+                            else
+                            {
+                                PeriodType periodType = periodService.getPeriodTypeByName( periodTypeLB );
+                                Period tempPeriod = periodService.getPeriod( sDate, eDate, periodType );
+                                if ( tempPeriod != null )
+                                {
+                                    DataValue dataValue = dataValueService.getDataValue( ou, selDataElement, tempPeriod, selDecoc );
+
+                                    if ( dataValue != null && dataValue.getValue() != null )
+                                    {
+                                        tempStr = dataValue.getValue();
+                                    }
+                                    else
+                                    {
+                                        tempStr = " ";
+                                    }
+                                }
+                                else
+                                {
+                                    tempStr = " ";
+                                }
+                            }
+                        }
+                        else
+                        {
+                            List<DataElementCategoryOptionCombo> optionCombos = new ArrayList<DataElementCategoryOptionCombo>( selDataElement.getCategoryCombo().getOptionCombos() );
+
+                            if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                            {
+                                for( DataElementCategoryOptionCombo optionCombo : optionCombos )
+                                {
+                                    for( Integer periodId : periodIds )
+                                    {
+                                        tempStr = aggDataMap.get( ou.getId()+":"+selDataElement.getId()+":"+optionCombo.getId()+":"+periodId );
+                                        if( tempStr != null )
+                                        {
+                                            try
+                                            {
+                                                pwdvAggValue += Double.parseDouble( tempStr );
+                                            }
+                                            catch( Exception e )
+                                            {
+                                            }
+                                        }
+                                    }
+                                }
+                                tempStr = "" + (int) pwdvAggValue;
+                            }
+                            else
+                            {
+                                Iterator<DataElementCategoryOptionCombo> optionComboIterator = optionCombos.iterator();
+                                while ( optionComboIterator.hasNext() )
+                                {
+                                    DataElementCategoryOptionCombo decoc1 = (DataElementCategoryOptionCombo) optionComboIterator.next();
+
+                                    PeriodType periodType = periodService.getPeriodTypeByName( periodTypeLB );
+                                    Period tempPeriod = periodService.getPeriod( sDate, eDate, periodType );
+                                    if( tempPeriod != null )
+                                    {
+                                        DataValue dataValue = dataValueService.getDataValue( ou, selDataElement, tempPeriod, decoc1 );
+
+                                        if ( dataValue != null )
+                                        {
+                                            tempStr += dataValue.getValue() + " : ";
+                                        }
+                                        else
+                                        {
+                                            tempStr = "  ";
+                                        }
+                                    }
+                                    else
+                                    {
+                                        tempStr = " ";
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.addCell( new Label( colCount, startRow + 1, periodNames.get( periodCount ), getCellFormat1() ) );
+                    }
+
+                    if ( flag == 1 )
+                    {
+                        sheet0.addCell( new Number( colCount, headerRow + 1 + rowCount, pwdAggIndValue, getCellFormat2() ) );
+                    }
+                    else
+                    {
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            sheet0.addCell( new Number( colCount, headerRow + 1 + rowCount, (int) pwdvAggValue, getCellFormat2() ) );
+                        }
+                        else
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow + 1 + rowCount, tempStr, getCellFormat2() ) );
+                        }
+                    }
+
+                    colCount++;
+                    periodCount++;
+                }// Period Loop
+                serviceListCount++;
+            }// Service loop end
+            rowCount++;
+        }// Orgunit loop end
+        
+        outputReportWorkbook.write();
+        outputReportWorkbook.close();
+
+        fileName = "TabularAnalysis.xls";
+        File outputReportFile = new File( outputReportPath );
+        inputStream = new BufferedInputStream( new FileInputStream( outputReportFile ) );
+    
+        outputReportFile.deleteOnExit();
+    }
 
     // -------------------------------------------------------------------------
     // Method for getting Selected OrgUnit(s) data in Excel Sheet 
@@ -2432,7 +2978,6 @@
         outputReportFile.deleteOnExit();
     }
 
-    
     // -------------------------------------------------------------------------
     // Method for getting Selected OrgUnit(s) data in Excel Sheet 
     //     - GenerateAggregatedData - Aggregation of Periods 
@@ -2625,7 +3170,6 @@
         outputReportFile.deleteOnExit();    
     }
 
-    
     // -------------------------------------------------------------------------
     // Method for getting OrgUnit Level wise data in Excel Sheet 
     //     - GenerateAggregatedData - Aggregation of Periods 
@@ -2851,6 +3395,225 @@
     }
 
     // -------------------------------------------------------------------------
+    // Method for getting OrgUnit Group wise data in Excel Sheet 
+    //     - GenerateAggregatedData - Aggregation of Periods 
+    // -------------------------------------------------------------------------
+    public void generateOrgUnitGroupData_GenerateAggregateData_AggPeriods() throws Exception
+    {
+        int headerRow = 0;
+        int headerCol = 0;
+
+        String raFolderName = configurationService.getConfigurationByKey( Configuration_IN.KEY_REPORTFOLDER ).getValue();
+        String outputReportPath = System.getenv( "DHIS2_HOME" ) + File.separator + raFolderName + File.separator + "output" + File.separator + UUID.randomUUID().toString() + ".xls";
+        WritableWorkbook outputReportWorkbook = Workbook.createWorkbook( new File( outputReportPath ) );
+        WritableSheet sheet0 = outputReportWorkbook.createSheet( "TabularAnalysis", 0 );
+
+        sheet0.addCell( new Label( headerCol, headerRow, "Sl.No.", getCellFormat1() ) );
+
+        selOrgUnit = organisationUnitService.getOrganisationUnit( Integer.parseInt( orgUnitListCB.get( 0 ) ) );
+        selOUList = new ArrayList<OrganisationUnit>( organisationUnitService.getOrganisationUnitWithChildren( selOrgUnit.getId() ) );
+
+        OrganisationUnitGroup selOrgUnitGroup = organisationUnitGroupService.getOrganisationUnitGroup( orgUnitLevelCB );
+        List<OrganisationUnit> orgUnitList1 = new ArrayList<OrganisationUnit>( selOrgUnitGroup.getMembers() );
+
+        selOUList.retainAll( orgUnitList1 );
+        
+        int minOULevel = 1;
+        int maxOULevel = organisationUnitService.getNumberOfOrganisationalLevels();
+
+        int c1 = headerCol + 1;
+
+        for( int i = minOULevel; i <= maxOULevel; i++ )
+        {
+            sheet0.addCell( new Label( c1, headerRow, "Level- "+i, getCellFormat1() ) );
+            c1++;
+        }
+
+        Map<Integer, Integer> orgunitLevelMap = new HashMap<Integer, Integer>( reportService.getOrgunitLevelMap() );
+
+        /* Service Info */
+        Indicator selIndicator = new Indicator();
+        DataElement selDataElement = new DataElement();
+        DataElementCategoryOptionCombo selDecoc = new DataElementCategoryOptionCombo();
+        int flag = 0;
+
+        /* Calculation Part */
+        int rowCount = 1;
+        int colCount = 0;
+        for( OrganisationUnit ou : selOUList )
+        {
+            System.out.println("Entered into orgunitloop :"+new Date());
+            sheet0.addCell( new Number( headerCol, headerRow + rowCount, rowCount, getCellFormat2() ) );
+            
+            Integer level = orgunitLevelMap.get( ou.getId() );
+            if( level == null )
+                level = organisationUnitService.getLevelOfOrganisationUnit( ou );
+            
+            colCount = 1 + level - minOULevel;
+            sheet0.addCell( new Label( colCount, headerRow + rowCount, ou.getName(), getCellFormat2() ) );
+
+            OrganisationUnit orgUnit = new OrganisationUnit();
+            orgUnit = ou;
+            int count1=1;
+            while( orgUnit.getParent() != null )
+            {
+                orgUnit = orgUnit.getParent();
+                sheet0.addCell( new Label( colCount-count1, headerRow + rowCount, orgUnit.getName(), getCellFormat2() ) );
+                count1++;
+            }
+
+            List<OrganisationUnit> ouChildList = new ArrayList<OrganisationUnit>( organisationUnitService.getOrganisationUnitWithChildren( ou.getId() ) );
+            List<Integer> orgUnitIds = new ArrayList<Integer>( getIdentifiers(OrganisationUnit.class, ouChildList ) );
+            orgUnitIdsByComma = getCommaDelimitedString( orgUnitIds );
+            Map<String, String> aggDataMap = new HashMap<String, String>( reportService.getAggDataFromDataValueTable( orgUnitIdsByComma, dataElementIdsByComma, periodIdsByComma ) );
+            
+            colCount = c1;
+            int deListCount = 0;
+            int indListCount = 0;
+            int serviceListCount = 0;
+            for( String serviceType : serviceTypeList )
+            {
+                String tempStr = "";
+                Double indValue = 0.0;
+                Double dataValue = 0.0;
+                
+                if ( serviceType.equalsIgnoreCase( "I" ) )
+                {
+                    Double numValue = 0.0;
+                    Double denValue = 0.0;
+
+                    flag = 1;
+                    selIndicator = indicatorList.get( indListCount );
+                    indListCount++;
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.addCell( new Label( colCount, headerRow, selIndicator.getName(), getCellFormat1() ) );
+                    }
+                    
+                    try
+                    {
+                        numValue = Double.parseDouble( reportService.getAggVal( selIndicator.getNumerator(), aggDataMap ) );
+                    }
+                    catch( Exception e )
+                    {
+                    }
+                    
+                    try
+                    {
+                        denValue = Double.parseDouble( reportService.getAggVal( selIndicator.getDenominator(), aggDataMap ) );
+                    }
+                    catch( Exception e )
+                    {
+                    }
+                    
+                    try
+                    {
+                        if( denValue != 0.0 )
+                        {
+                            indValue = ( numValue / denValue ) * selIndicator.getIndicatorType().getFactor();
+                        }
+                        else
+                        {
+                            indValue = 0.0;
+                        }
+                    }
+                    catch( Exception e )
+                    {
+                        indValue = 0.0;
+                    }
+                    
+                    indValue = Math.round( indValue * Math.pow( 10, 1 ) ) / Math.pow( 10, 1 );
+                }
+                else
+                {
+                    flag = 2;
+                    selDataElement = dataElementList.get( deListCount );
+                    deListCount++;
+                    if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                    {
+                        selDecoc = dataElementCategoryService.getDataElementCategoryOptionCombo( Integer.parseInt( selectedServices.get( serviceListCount ).split( ":" )[2] ) );
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow, selDataElement.getName() + "-" + selDecoc.getName(), getCellFormat1() ) );
+                        }
+                        
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            tempStr = aggDataMap.get( selDataElement.getId()+"."+selDecoc.getId() );
+                            if( tempStr != null )
+                            {
+                                try
+                                {
+                                    dataValue = Double.parseDouble( tempStr );
+                                }
+                                catch( Exception e )
+                                {
+                                    dataValue = 0.0;
+                                }
+                            }
+                        }
+                        else
+                        {
+                            dataValue = 0.0;
+                        }
+                    }
+                    else
+                    {
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow, selDataElement.getName(), getCellFormat1() ) );
+                        }
+                        List<DataElementCategoryOptionCombo> optionCombos = new ArrayList<DataElementCategoryOptionCombo>( selDataElement.getCategoryCombo().getOptionCombos() );
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            for( DataElementCategoryOptionCombo optionCombo : optionCombos )
+                            {
+                                tempStr = aggDataMap.get( selDataElement.getId()+"."+optionCombo.getId() );
+                                if( tempStr != null )
+                                {
+                                    try
+                                    {
+                                        dataValue += Double.parseDouble( tempStr );
+                                    }
+                                    catch( Exception e )
+                                    {
+                                    }
+                                }
+                            }
+                        }
+                        else
+                        {
+                            dataValue = 0.0;
+                        }
+                    }
+                }
+
+                if ( flag == 1 )
+                {
+                    sheet0.addCell( new Number( colCount, headerRow + rowCount, indValue, getCellFormat2() ) );
+                }
+                else
+                {
+                    sheet0.addCell( new Number( colCount, headerRow + rowCount, dataValue, getCellFormat2() ) );
+                }
+
+                colCount++;
+                serviceListCount++;
+            }// Service loop end
+            rowCount++;
+        }// Orgunit loop end
+        
+        outputReportWorkbook.write();
+        outputReportWorkbook.close();
+
+        fileName = "TabularAnalysis.xls";
+        File outputReportFile = new File( outputReportPath );
+        inputStream = new BufferedInputStream( new FileInputStream( outputReportFile ) );
+    
+        outputReportFile.deleteOnExit();    
+    }
+    
+    // -------------------------------------------------------------------------
     // Method for getting OrgUnit Level wise data in Excel Sheet 
     //     - GenerateAggregatedData - Periodwise 
     // -------------------------------------------------------------------------
@@ -3165,7 +3928,603 @@
         outputReportFile.deleteOnExit();
     }
     
-
+    // -------------------------------------------------------------------------
+    // Method for getting OrgUnit Group wise data in Excel Sheet 
+    //     - GenerateAggregatedData - Periodwise 
+    // -------------------------------------------------------------------------
+    public void generateOrgUnitGroupData_GenerateAggregateData_Periodwise() throws Exception
+    {
+        int startRow = 0;
+        int headerRow = 0;
+        int headerCol = 0;
+
+        String raFolderName = configurationService.getConfigurationByKey( Configuration_IN.KEY_REPORTFOLDER ).getValue();
+        String outputReportPath = System.getenv( "DHIS2_HOME" ) + File.separator + raFolderName + File.separator + "output" + File.separator + UUID.randomUUID().toString() + ".xls";
+        WritableWorkbook outputReportWorkbook = Workbook.createWorkbook( new File( outputReportPath ) );
+        WritableSheet sheet0 = outputReportWorkbook.createSheet( "TabularAnalysis", 0 );
+
+        sheet0.mergeCells( headerCol, headerRow, headerCol, headerRow + 1 );
+        sheet0.addCell( new Label( headerCol, headerRow, "Sl.No.", getCellFormat1() ) );
+
+        selOrgUnit = organisationUnitService.getOrganisationUnit( Integer.parseInt( orgUnitListCB.get( 0 ) ) );
+        selOUList = new ArrayList<OrganisationUnit>( organisationUnitService.getOrganisationUnitWithChildren( selOrgUnit.getId() ) );
+
+        OrganisationUnitGroup selOrgUnitGroup = organisationUnitGroupService.getOrganisationUnitGroup( orgUnitLevelCB );
+        List<OrganisationUnit> orgUnitList1 = new ArrayList<OrganisationUnit>( selOrgUnitGroup.getMembers() );
+
+        selOUList.retainAll( orgUnitList1 );
+
+        int minOULevel = 1;
+        int maxOULevel = organisationUnitService.getNumberOfOrganisationalLevels();
+
+        int c1 = headerCol + 1;
+
+        for( int i = minOULevel; i <= maxOULevel; i++ )
+        {
+            sheet0.mergeCells( c1, headerRow, c1, headerRow + 1 );
+            sheet0.addCell( new Label( c1, headerRow, "Level- "+i, getCellFormat1() ) );
+            c1++;
+        }
+
+        Map<Integer, Integer> orgunitLevelMap = new HashMap<Integer, Integer>( reportService.getOrgunitLevelMap() );
+
+        /* Service Info */
+        Indicator selIndicator = new Indicator();
+        DataElement selDataElement = new DataElement();
+        DataElementCategoryOptionCombo selDecoc = new DataElementCategoryOptionCombo();
+        int flag = 0;
+
+        /* Calculation Part */
+        int rowCount = 1;
+        int colCount = 0;
+        for( OrganisationUnit ou : selOUList )
+        {
+            System.out.println( ou.getName() +" : "+ new Date());
+            sheet0.addCell( new Number( headerCol, headerRow + 1 + rowCount, rowCount, getCellFormat2() ) );
+            
+            Integer level = orgunitLevelMap.get( ou.getId() );
+            if( level == null )
+                level = organisationUnitService.getLevelOfOrganisationUnit( ou );
+            
+            colCount = 1 + level - minOULevel;
+            sheet0.addCell( new Label( colCount, headerRow + 1 + rowCount, ou.getName(), getCellFormat2() ) );
+            
+            OrganisationUnit orgUnit = new OrganisationUnit();
+            orgUnit = ou;
+            int count1=1;
+            while( orgUnit.getParent() != null )
+            {
+                orgUnit = orgUnit.getParent();
+                sheet0.addCell( new Label( colCount-count1, headerRow + rowCount + 1, orgUnit.getName(), getCellFormat2() ) );
+                count1++;
+            }
+
+            List<OrganisationUnit> ouChildList = new ArrayList<OrganisationUnit>( organisationUnitService.getOrganisationUnitWithChildren( ou.getId() ) );
+            List<Integer> orgUnitIds = new ArrayList<Integer>( getIdentifiers(OrganisationUnit.class, ouChildList ) );
+            orgUnitIdsByComma = getCommaDelimitedString( orgUnitIds );
+            Map<String, String> aggDataMap = new HashMap<String, String>( reportService.getAggDataFromDataValueTableByDeAndPeriodwise( orgUnitIdsByComma, dataElementIdsByComma, periodIdsByComma ) );
+            
+            colCount = c1;
+            int deListCount = 0;
+            int indListCount = 0;
+            int serviceListCount = 0;
+            for( String serviceType : serviceTypeList )
+            {
+                if ( serviceType.equalsIgnoreCase( "I" ) )
+                {
+                    flag = 1;
+                    selIndicator = indicatorList.get( indListCount );
+                    indListCount++;
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                        sheet0.addCell( new Label( colCount, startRow, selIndicator.getName(), getCellFormat1() ) );
+                    }
+                }
+                else
+                {
+                    flag = 2;
+                    selDataElement = dataElementList.get( deListCount );
+                    deListCount++;
+                    if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                    {
+                        selDecoc = dataElementCategoryService.getDataElementCategoryOptionCombo( Integer.parseInt( selectedServices.get( serviceListCount ).split( ":" )[2] ) );
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                            sheet0.addCell( new Label( colCount, startRow, selDataElement.getName() + "-" + selDecoc.getName(), getCellFormat1() ) );
+                        }
+                    }
+                    else
+                    {
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                            sheet0.addCell( new Label( colCount, startRow, selDataElement.getName(), getCellFormat1() ) );
+                        }
+                    }
+                }
+
+                int periodCount = 0;
+                for ( Date sDate : selStartPeriodList )
+                {
+                    Date eDate = selEndPeriodList.get( periodCount );
+                
+                    Collection<Integer> periodIds = new ArrayList<Integer>( periodMap.get( periodCount ) );
+
+                    double pwdvAggValue = 0.0;
+                    double pwdAggIndValue = 0.0;
+
+                    String tempStr = "";
+                    if ( flag == 1 )
+                    {
+                        Double numValue = 0.0;
+                        Double denValue = 0.0;
+                        Double indValue = 0.0;
+                        for( Integer periodId : periodIds )
+                        {
+                            try
+                            {
+                                numValue += Double.parseDouble( getAggValByPeriod( selIndicator.getNumerator(), aggDataMap, periodId ) );
+                            }
+                            catch( Exception e )
+                            {
+                            }
+                            
+                            try
+                            {
+                                denValue += Double.parseDouble( getAggValByPeriod( selIndicator.getDenominator(), aggDataMap, periodId ) );
+                            }
+                            catch( Exception e )
+                            {
+                            }
+                        }
+                        
+                        try
+                        {
+                            if( denValue != 0.0 )
+                            {
+                                indValue = ( numValue / denValue ) * selIndicator.getIndicatorType().getFactor();
+                            }
+                            else
+                            {
+                                indValue = 0.0;
+                            }
+                        }
+                        catch( Exception e )
+                        {
+                            indValue = 0.0;
+                        }
+
+                        pwdAggIndValue = indValue;
+                        pwdAggIndValue = Math.round( pwdAggIndValue * Math.pow( 10, 1 ) ) / Math.pow( 10, 1 );
+                        tempStr = "" + pwdAggIndValue;
+                    }
+                    else if ( flag == 2 )
+                    {
+                        if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                        {
+                            if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                            {
+                                for( Integer periodId : periodIds )
+                                {
+                                    tempStr = aggDataMap.get( selDataElement.getId()+":"+selDecoc.getId()+":"+periodId );
+                                    if( tempStr != null )
+                                    {
+                                        try
+                                        {
+                                            pwdvAggValue += Double.parseDouble( tempStr );
+                                        }
+                                        catch( Exception e )
+                                        {
+                                        }
+                                    }
+                                }
+                                tempStr = "" + (int) pwdvAggValue;
+                            }
+                            else
+                            {
+                                PeriodType periodType = periodService.getPeriodTypeByName( periodTypeLB );
+                                Period tempPeriod = periodService.getPeriod( sDate, eDate, periodType );
+                                if ( tempPeriod != null )
+                                {
+                                    DataValue dataValue = dataValueService.getDataValue( ou, selDataElement, tempPeriod, selDecoc );
+
+                                    if ( dataValue != null && dataValue.getValue() != null )
+                                    {
+                                        tempStr = dataValue.getValue();
+                                    }
+                                    else
+                                    {
+                                        tempStr = " ";
+                                    }
+                                }
+                                else
+                                {
+                                    tempStr = " ";
+                                }
+                            }
+                        }
+                        else
+                        {
+                            List<DataElementCategoryOptionCombo> optionCombos = new ArrayList<DataElementCategoryOptionCombo>( selDataElement.getCategoryCombo().getOptionCombos() );
+
+                            if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                            {
+                                for( DataElementCategoryOptionCombo optionCombo : optionCombos )
+                                {
+                                    for( Integer periodId : periodIds )
+                                    {
+                                        tempStr = aggDataMap.get( selDataElement.getId()+":"+optionCombo.getId()+":"+periodId );
+                                        if( tempStr != null )
+                                        {
+                                            try
+                                            {
+                                                pwdvAggValue += Double.parseDouble( tempStr );
+                                            }
+                                            catch( Exception e )
+                                            {
+                                            }
+                                        }
+                                    }
+                                }
+                                tempStr = "" + (int) pwdvAggValue;
+                            }
+                            else
+                            {
+                                Iterator<DataElementCategoryOptionCombo> optionComboIterator = optionCombos.iterator();
+                                while ( optionComboIterator.hasNext() )
+                                {
+                                    DataElementCategoryOptionCombo decoc1 = (DataElementCategoryOptionCombo) optionComboIterator.next();
+
+                                    PeriodType periodType = periodService.getPeriodTypeByName( periodTypeLB );
+                                    Period tempPeriod = periodService.getPeriod( sDate, eDate, periodType );
+                                    if( tempPeriod != null )
+                                    {
+                                        DataValue dataValue = dataValueService.getDataValue( ou, selDataElement, tempPeriod, decoc1 );
+
+                                        if ( dataValue != null )
+                                        {
+                                            tempStr += dataValue.getValue() + " : ";
+                                        }
+                                        else
+                                        {
+                                            tempStr = "  ";
+                                        }
+                                    }
+                                    else
+                                    {
+                                        tempStr = " ";
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.addCell( new Label( colCount, startRow + 1, periodNames.get( periodCount ), getCellFormat1() ) );
+                    }
+
+                    if ( flag == 1 )
+                    {
+                        sheet0.addCell( new Number( colCount, headerRow + 1 + rowCount, pwdAggIndValue, getCellFormat2() ) );
+                    }
+                    else
+                    {
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            sheet0.addCell( new Number( colCount, headerRow + 1 + rowCount, (int) pwdvAggValue, getCellFormat2() ) );
+                        }
+                        else
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow + 1 + rowCount, tempStr, getCellFormat2() ) );
+                        }
+                    }
+
+                    colCount++;
+                    periodCount++;
+                }// Period Loop
+                serviceListCount++;
+            }// Service loop end
+            rowCount++;
+        }// Orgunit loop end
+        
+        outputReportWorkbook.write();
+        outputReportWorkbook.close();
+
+        fileName = "TabularAnalysis.xls";
+        File outputReportFile = new File( outputReportPath );
+        inputStream = new BufferedInputStream( new FileInputStream( outputReportFile ) );
+    
+        outputReportFile.deleteOnExit();
+    }
+
+    // -------------------------------------------------------------------------
+    // Method for getting Selected OrgUnit data in Excel Sheet 
+    //     - GenerateAggregatedData - Periodwise 
+    // -------------------------------------------------------------------------
+    public void generateSelectedOrgUnitData_GenerateAggregateData_Periodwise() throws Exception
+    {
+        int startRow = 0;
+        int headerRow = 0;
+        int headerCol = 0;
+
+        String raFolderName = configurationService.getConfigurationByKey( Configuration_IN.KEY_REPORTFOLDER ).getValue();
+        String outputReportPath = System.getenv( "DHIS2_HOME" ) + File.separator + raFolderName + File.separator + "output" + File.separator + UUID.randomUUID().toString() + ".xls";
+        WritableWorkbook outputReportWorkbook = Workbook.createWorkbook( new File( outputReportPath ) );
+        WritableSheet sheet0 = outputReportWorkbook.createSheet( "TabularAnalysis", 0 );
+
+        sheet0.mergeCells( headerCol, headerRow, headerCol, headerRow + 1 );
+        sheet0.addCell( new Label( headerCol, headerRow, "Sl.No.", getCellFormat1() ) );
+
+        for ( String ouStr : orgUnitListCB )
+        {
+            OrganisationUnit ou = organisationUnitService.getOrganisationUnit( Integer.parseInt( ouStr ) );
+            selOUList.add( ou );
+        }
+
+        int c1 = headerCol + 1;
+        sheet0.mergeCells( c1, headerRow, c1, headerRow + 1 );
+        sheet0.addCell( new Label( c1, headerRow, "Facility", getCellFormat1() ) );
+        c1++;
+        
+        /* Service Info */
+        Indicator selIndicator = new Indicator();
+        DataElement selDataElement = new DataElement();
+        DataElementCategoryOptionCombo selDecoc = new DataElementCategoryOptionCombo();
+        int flag = 0;
+
+        /* Calculation Part */
+        int rowCount = 1;
+        int colCount = 0;
+        for( OrganisationUnit ou : selOUList )
+        {
+            System.out.println( ou.getName() +" : "+ new Date());
+            sheet0.addCell( new Number( headerCol, headerRow + 1 + rowCount, rowCount, getCellFormat2() ) );
+            sheet0.addCell( new Label( 1, rowCount + 1, ou.getName(), getCellFormat2() ) );
+
+            List<OrganisationUnit> ouChildList = new ArrayList<OrganisationUnit>( organisationUnitService.getOrganisationUnitWithChildren( ou.getId() ) );
+            List<Integer> orgUnitIds = new ArrayList<Integer>( getIdentifiers(OrganisationUnit.class, ouChildList ) );
+            orgUnitIdsByComma = getCommaDelimitedString( orgUnitIds );
+            Map<String, String> aggDataMap = new HashMap<String, String>( reportService.getAggDataFromDataValueTableByDeAndPeriodwise( orgUnitIdsByComma, dataElementIdsByComma, periodIdsByComma ) );
+            
+            colCount = c1;
+            int deListCount = 0;
+            int indListCount = 0;
+            int serviceListCount = 0;
+            for( String serviceType : serviceTypeList )
+            {
+                if ( serviceType.equalsIgnoreCase( "I" ) )
+                {
+                    flag = 1;
+                    selIndicator = indicatorList.get( indListCount );
+                    indListCount++;
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                        sheet0.addCell( new Label( colCount, startRow, selIndicator.getName(), getCellFormat1() ) );
+                    }
+                }
+                else
+                {
+                    flag = 2;
+                    selDataElement = dataElementList.get( deListCount );
+                    deListCount++;
+                    if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                    {
+                        selDecoc = dataElementCategoryService.getDataElementCategoryOptionCombo( Integer.parseInt( selectedServices.get( serviceListCount ).split( ":" )[2] ) );
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                            sheet0.addCell( new Label( colCount, startRow, selDataElement.getName() + "-" + selDecoc.getName(), getCellFormat1() ) );
+                        }
+                    }
+                    else
+                    {
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                            sheet0.addCell( new Label( colCount, startRow, selDataElement.getName(), getCellFormat1() ) );
+                        }
+                    }
+                }
+
+                int periodCount = 0;
+                for ( Date sDate : selStartPeriodList )
+                {
+                    Date eDate = selEndPeriodList.get( periodCount );
+                
+                    Collection<Integer> periodIds = new ArrayList<Integer>( periodMap.get( periodCount ) );
+
+                    double pwdvAggValue = 0.0;
+                    double pwdAggIndValue = 0.0;
+
+                    String tempStr = "";
+                    if ( flag == 1 )
+                    {
+                        Double numValue = 0.0;
+                        Double denValue = 0.0;
+                        Double indValue = 0.0;
+                        for( Integer periodId : periodIds )
+                        {
+                            try
+                            {
+                                numValue += Double.parseDouble( getAggValByPeriod( selIndicator.getNumerator(), aggDataMap, periodId ) );
+                            }
+                            catch( Exception e )
+                            {
+                            }
+                            
+                            try
+                            {
+                                denValue += Double.parseDouble( getAggValByPeriod( selIndicator.getDenominator(), aggDataMap, periodId ) );
+                            }
+                            catch( Exception e )
+                            {
+                            }
+                        }
+                        
+                        try
+                        {
+                            if( denValue != 0.0 )
+                            {
+                                indValue = ( numValue / denValue ) * selIndicator.getIndicatorType().getFactor();
+                            }
+                            else
+                            {
+                                indValue = 0.0;
+                            }
+                        }
+                        catch( Exception e )
+                        {
+                            indValue = 0.0;
+                        }
+
+                        pwdAggIndValue = indValue;
+                        pwdAggIndValue = Math.round( pwdAggIndValue * Math.pow( 10, 1 ) ) / Math.pow( 10, 1 );
+                        tempStr = "" + pwdAggIndValue;
+                    }
+                    else if ( flag == 2 )
+                    {
+                        if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                        {
+                            if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                            {
+                                for( Integer periodId : periodIds )
+                                {
+                                    tempStr = aggDataMap.get( selDataElement.getId()+":"+selDecoc.getId()+":"+periodId );
+                                    if( tempStr != null )
+                                    {
+                                        try
+                                        {
+                                            pwdvAggValue += Double.parseDouble( tempStr );
+                                        }
+                                        catch( Exception e )
+                                        {
+                                        }
+                                    }
+                                }
+                                tempStr = "" + (int) pwdvAggValue;
+                            }
+                            else
+                            {
+                                PeriodType periodType = periodService.getPeriodTypeByName( periodTypeLB );
+                                Period tempPeriod = periodService.getPeriod( sDate, eDate, periodType );
+                                if ( tempPeriod != null )
+                                {
+                                    DataValue dataValue = dataValueService.getDataValue( ou, selDataElement, tempPeriod, selDecoc );
+
+                                    if ( dataValue != null && dataValue.getValue() != null )
+                                    {
+                                        tempStr = dataValue.getValue();
+                                    }
+                                    else
+                                    {
+                                        tempStr = " ";
+                                    }
+                                }
+                                else
+                                {
+                                    tempStr = " ";
+                                }
+                            }
+                        }
+                        else
+                        {
+                            List<DataElementCategoryOptionCombo> optionCombos = new ArrayList<DataElementCategoryOptionCombo>( selDataElement.getCategoryCombo().getOptionCombos() );
+
+                            if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                            {
+                                for( DataElementCategoryOptionCombo optionCombo : optionCombos )
+                                {
+                                    for( Integer periodId : periodIds )
+                                    {
+                                        tempStr = aggDataMap.get( selDataElement.getId()+":"+optionCombo.getId()+":"+periodId );
+                                        if( tempStr != null )
+                                        {
+                                            try
+                                            {
+                                                pwdvAggValue += Double.parseDouble( tempStr );
+                                            }
+                                            catch( Exception e )
+                                            {
+                                            }
+                                        }
+                                    }
+                                }
+                                tempStr = "" + (int) pwdvAggValue;
+                            }
+                            else
+                            {
+                                Iterator<DataElementCategoryOptionCombo> optionComboIterator = optionCombos.iterator();
+                                while ( optionComboIterator.hasNext() )
+                                {
+                                    DataElementCategoryOptionCombo decoc1 = (DataElementCategoryOptionCombo) optionComboIterator.next();
+
+                                    PeriodType periodType = periodService.getPeriodTypeByName( periodTypeLB );
+                                    Period tempPeriod = periodService.getPeriod( sDate, eDate, periodType );
+                                    if( tempPeriod != null )
+                                    {
+                                        DataValue dataValue = dataValueService.getDataValue( ou, selDataElement, tempPeriod, decoc1 );
+
+                                        if ( dataValue != null )
+                                        {
+                                            tempStr += dataValue.getValue() + " : ";
+                                        }
+                                        else
+                                        {
+                                            tempStr = "  ";
+                                        }
+                                    }
+                                    else
+                                    {
+                                        tempStr = " ";
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.addCell( new Label( colCount, startRow + 1, periodNames.get( periodCount ), getCellFormat1() ) );
+                    }
+
+                    if ( flag == 1 )
+                    {
+                        sheet0.addCell( new Number( colCount, headerRow + 1 + rowCount, pwdAggIndValue, getCellFormat2() ) );
+                    }
+                    else
+                    {
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            sheet0.addCell( new Number( colCount, headerRow + 1 + rowCount, (int) pwdvAggValue, getCellFormat2() ) );
+                        }
+                        else
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow + 1 + rowCount, tempStr, getCellFormat2() ) );
+                        }
+                    }
+
+                    colCount++;
+                    periodCount++;
+                }// Period Loop
+                serviceListCount++;
+            }// Service loop end
+            rowCount++;
+        }// Orgunit loop end
+        
+        outputReportWorkbook.write();
+        outputReportWorkbook.close();
+
+        fileName = "TabularAnalysis.xls";
+        File outputReportFile = new File( outputReportPath );
+        inputStream = new BufferedInputStream( new FileInputStream( outputReportFile ) );
+    
+        outputReportFile.deleteOnExit();
+    }
+    
     // -------------------------------------------------------------------------
     // Method for getting OrgUnit Level wise data in Excel Sheet 
     //     - UseExistingData - Periodwise 
@@ -3486,6 +4845,606 @@
         outputReportFile.deleteOnExit();
     }
 
+    // -------------------------------------------------------------------------
+    // Method for getting OrgUnit Group wise data in Excel Sheet 
+    //     - UseExistingData - Periodwise 
+    // -------------------------------------------------------------------------
+    public void generateOrgUnitGroupData_UseExisting_Periodwise() throws Exception
+    {
+        int startRow = 0;
+        int headerRow = 0;
+        int headerCol = 0;
+
+        String raFolderName = configurationService.getConfigurationByKey( Configuration_IN.KEY_REPORTFOLDER ).getValue();
+        String outputReportPath = System.getenv( "DHIS2_HOME" ) + File.separator + raFolderName + File.separator + "output" + File.separator + UUID.randomUUID().toString() + ".xls";
+        WritableWorkbook outputReportWorkbook = Workbook.createWorkbook( new File( outputReportPath ) );
+        WritableSheet sheet0 = outputReportWorkbook.createSheet( "TabularAnalysis", 0 );
+
+        sheet0.mergeCells( headerCol, headerRow, headerCol, headerRow + 1 );
+        sheet0.addCell( new Label( headerCol, headerRow, "Sl.No.", getCellFormat1() ) );
+
+        selOrgUnit = organisationUnitService.getOrganisationUnit( Integer.parseInt( orgUnitListCB.get( 0 ) ) );
+        selOUList = new ArrayList<OrganisationUnit>( organisationUnitService.getOrganisationUnitWithChildren( selOrgUnit.getId() ) );
+        OrganisationUnitGroup selOrgUnitGroup = organisationUnitGroupService.getOrganisationUnitGroup( orgUnitLevelCB );
+        List<OrganisationUnit> orgUnitList1 = new ArrayList<OrganisationUnit>( selOrgUnitGroup.getMembers() );
+        selOUList.retainAll( orgUnitList1 );
+        
+        int minOULevel = 1;
+        int maxOULevel = organisationUnitService.getNumberOfOrganisationalLevels();
+
+        int c1 = headerCol + 1;
+
+        for( int i = minOULevel; i <= maxOULevel; i++ )
+        {
+            sheet0.mergeCells( c1, headerRow, c1, headerRow + 1 );
+            sheet0.addCell( new Label( c1, headerRow, "Level- "+i, getCellFormat1() ) );
+            c1++;
+        }
+
+        Map<Integer, Integer> orgunitLevelMap = new HashMap<Integer, Integer>( reportService.getOrgunitLevelMap() );
+    
+        /* Service Info */
+        Indicator selIndicator = new Indicator();
+        DataElement selDataElement = new DataElement();
+        DataElementCategoryOptionCombo selDecoc = new DataElementCategoryOptionCombo();
+        int flag = 0;
+
+        List<Integer> orgUnitIds = new ArrayList<Integer>( getIdentifiers(OrganisationUnit.class, selOUList ) );
+        orgUnitIdsByComma = getCommaDelimitedString( orgUnitIds );
+        
+        System.out.println( "Before getting aggdatamap "+new Date() );
+        Map<String, String> aggDataMap = new HashMap<String, String>( reportService.getResultDataValueFromAggregateTable( orgUnitIdsByComma, dataElementIdsByComma, periodIdsByComma ) );
+        System.out.println( "Before getting aggdatamap "+new Date() );
+    
+        /* Calculation Part */
+        int rowCount = 1;
+        int colCount = 0;
+        for( OrganisationUnit ou : selOUList )
+        {
+            System.out.println("Entered into orgunitloop :"+new Date());
+            sheet0.addCell( new Number( headerCol, headerRow + 1 + rowCount, rowCount, getCellFormat2() ) );
+            
+            Integer level = orgunitLevelMap.get( ou.getId() );
+            if( level == null )
+                level = organisationUnitService.getLevelOfOrganisationUnit( ou );
+            
+            colCount = 1 + level - minOULevel;
+            sheet0.addCell( new Label( colCount, headerRow + 1 + rowCount, ou.getName(), getCellFormat2() ) );
+            
+            OrganisationUnit orgUnit = new OrganisationUnit();
+            orgUnit = ou;
+            int count1=1;
+            while( orgUnit.getParent() != null )
+            {
+                orgUnit = orgUnit.getParent();
+                sheet0.addCell( new Label( colCount-count1, rowCount + 1, orgUnit.getName(), getCellFormat2() ) );
+                count1++;
+            }
+
+            colCount = c1;
+            int deListCount = 0;
+            int indListCount = 0;
+            int serviceListCount = 0;
+            for( String serviceType : serviceTypeList )
+            {
+                if ( serviceType.equalsIgnoreCase( "I" ) )
+                {
+                    flag = 1;
+                    selIndicator = indicatorList.get( indListCount );
+                    indListCount++;
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                        sheet0.addCell( new Label( colCount, startRow, selIndicator.getName(), getCellFormat1() ) );
+                    }
+                }
+                else
+                {
+                    flag = 2;
+                    selDataElement = dataElementList.get( deListCount );
+                    deListCount++;
+                    if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                    {
+                        selDecoc = dataElementCategoryService.getDataElementCategoryOptionCombo( Integer.parseInt( selectedServices.get( serviceListCount ).split( ":" )[2] ) );
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                            sheet0.addCell( new Label( colCount, startRow, selDataElement.getName() + "-" + selDecoc.getName(), getCellFormat1() ) );
+                        }
+                    }
+                    else
+                    {
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                            sheet0.addCell( new Label( colCount, startRow, selDataElement.getName(), getCellFormat1() ) );
+                        }
+                    }
+                }
+
+                int periodCount = 0;
+                for ( Date sDate : selStartPeriodList )
+                {
+                    Date eDate = selEndPeriodList.get( periodCount );
+                
+                    Collection<Integer> periodIds = new ArrayList<Integer>( periodMap.get( periodCount ) );
+                    System.out.println( periodIds );
+
+                    double pwdvAggValue = 0.0;
+                    double pwdAggIndValue = 0.0;
+
+                    String tempStr = "";
+                    if ( flag == 1 )
+                    {
+                        Double numValue = 0.0;
+                        Double denValue = 0.0;
+                        Double indValue = 0.0;
+                        for( Integer periodId : periodIds )
+                        {
+                            try
+                            {
+                                numValue += Double.parseDouble( getAggVal( selIndicator.getNumerator(), aggDataMap, ou.getId(), periodId ) );
+                            }
+                            catch( Exception e )
+                            {
+                            }
+                            
+                            try
+                            {
+                                denValue += Double.parseDouble( getAggVal( selIndicator.getDenominator(), aggDataMap, ou.getId(), periodId ) );
+                            }
+                            catch( Exception e )
+                            {
+                            }
+                        }
+                        
+                        try
+                        {
+                            if( denValue != 0.0 )
+                            {
+                                indValue = ( numValue / denValue ) * selIndicator.getIndicatorType().getFactor();
+                            }
+                            else
+                            {
+                                indValue = 0.0;
+                            }
+                        }
+                        catch( Exception e )
+                        {
+                            indValue = 0.0;
+                        }
+
+                        pwdAggIndValue = indValue;
+                        pwdAggIndValue = Math.round( pwdAggIndValue * Math.pow( 10, 1 ) ) / Math.pow( 10, 1 );
+                        tempStr = "" + pwdAggIndValue;
+                    }
+                    else if ( flag == 2 )
+                    {
+                        if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                        {
+                            if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                            {
+                                for( Integer periodId : periodIds )
+                                {
+                                    tempStr = aggDataMap.get( ou.getId()+":"+selDataElement.getId()+":"+selDecoc.getId()+":"+periodId );
+                                    if( tempStr != null )
+                                    {
+                                        try
+                                        {
+                                            pwdvAggValue += Double.parseDouble( tempStr );
+                                        }
+                                        catch( Exception e )
+                                        {
+                                        }
+                                    }
+                                }
+                                tempStr = "" + (int) pwdvAggValue;
+                            }
+                            else
+                            {
+                                PeriodType periodType = periodService.getPeriodTypeByName( periodTypeLB );
+                                Period tempPeriod = periodService.getPeriod( sDate, eDate, periodType );
+                                if ( tempPeriod != null )
+                                {
+                                    DataValue dataValue = dataValueService.getDataValue( ou, selDataElement, tempPeriod, selDecoc );
+
+                                    if ( dataValue != null && dataValue.getValue() != null )
+                                    {
+                                        tempStr = dataValue.getValue();
+                                    }
+                                    else
+                                    {
+                                        tempStr = " ";
+                                    }
+                                }
+                                else
+                                {
+                                    tempStr = " ";
+                                }
+                            }
+                        }
+                        else
+                        {
+                            List<DataElementCategoryOptionCombo> optionCombos = new ArrayList<DataElementCategoryOptionCombo>( selDataElement.getCategoryCombo().getOptionCombos() );
+
+                            if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                            {
+                                for( DataElementCategoryOptionCombo optionCombo : optionCombos )
+                                {
+                                    for( Integer periodId : periodIds )
+                                    {
+                                        tempStr = aggDataMap.get( ou.getId()+":"+selDataElement.getId()+":"+optionCombo.getId()+":"+periodId );
+                                        if( tempStr != null )
+                                        {
+                                            try
+                                            {
+                                                pwdvAggValue += Double.parseDouble( tempStr );
+                                            }
+                                            catch( Exception e )
+                                            {
+                                            }
+                                        }
+                                    }
+                                }
+                                tempStr = "" + (int) pwdvAggValue;
+                            }
+                            else
+                            {
+                                Iterator<DataElementCategoryOptionCombo> optionComboIterator = optionCombos.iterator();
+                                while ( optionComboIterator.hasNext() )
+                                {
+                                    DataElementCategoryOptionCombo decoc1 = (DataElementCategoryOptionCombo) optionComboIterator.next();
+
+                                    PeriodType periodType = periodService.getPeriodTypeByName( periodTypeLB );
+                                    Period tempPeriod = periodService.getPeriod( sDate, eDate, periodType );
+                                    if( tempPeriod != null )
+                                    {
+                                        DataValue dataValue = dataValueService.getDataValue( ou, selDataElement, tempPeriod, decoc1 );
+
+                                        if ( dataValue != null )
+                                        {
+                                            tempStr += dataValue.getValue() + " : ";
+                                        }
+                                        else
+                                        {
+                                            tempStr = "  ";
+                                        }
+                                    }
+                                    else
+                                    {
+                                        tempStr = " ";
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.addCell( new Label( colCount, startRow + 1, periodNames.get( periodCount ), getCellFormat1() ) );
+                    }
+
+                    if ( flag == 1 )
+                    {
+                        sheet0.addCell( new Number( colCount, headerRow + 1 + rowCount, pwdAggIndValue, getCellFormat2() ) );
+                    }
+                    else
+                    {
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            sheet0.addCell( new Number( colCount, headerRow + 1 + rowCount, (int) pwdvAggValue, getCellFormat2() ) );
+                        }
+                        else
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow + 1 + rowCount, tempStr, getCellFormat2() ) );
+                        }
+                    }
+
+                    colCount++;
+                    periodCount++;
+                }// Period Loop
+                serviceListCount++;
+            }// Service loop end
+            rowCount++;
+        }// Orgunit loop end
+        
+        outputReportWorkbook.write();
+        outputReportWorkbook.close();
+
+        fileName = "TabularAnalysis.xls";
+        File outputReportFile = new File( outputReportPath );
+        inputStream = new BufferedInputStream( new FileInputStream( outputReportFile ) );
+    
+        outputReportFile.deleteOnExit();
+    }
+    
+    // -------------------------------------------------------------------------
+    // Method for getting Selected OrgUnit Data in Excel Sheet 
+    //     - UseExistingData - Periodwise 
+    // -------------------------------------------------------------------------
+    public void generateSelectedOrgUnitData_UseExisting_Periodwise() throws Exception
+    {
+        int startRow = 0;
+        int headerRow = 0;
+        int headerCol = 0;
+
+        String raFolderName = configurationService.getConfigurationByKey( Configuration_IN.KEY_REPORTFOLDER ).getValue();
+        String outputReportPath = System.getenv( "DHIS2_HOME" ) + File.separator + raFolderName + File.separator + "output" + File.separator + UUID.randomUUID().toString() + ".xls";
+        WritableWorkbook outputReportWorkbook = Workbook.createWorkbook( new File( outputReportPath ) );
+        WritableSheet sheet0 = outputReportWorkbook.createSheet( "TabularAnalysis", 0 );
+
+        sheet0.mergeCells( headerCol, headerRow, headerCol, headerRow + 1 );
+        sheet0.addCell( new Label( headerCol, headerRow, "Sl.No.", getCellFormat1() ) );
+
+        for ( String ouStr : orgUnitListCB )
+        {
+            OrganisationUnit ou = organisationUnitService.getOrganisationUnit( Integer.parseInt( ouStr ) );
+            selOUList.add( ou );
+        }
+
+        int c1 = headerCol + 1;
+        sheet0.mergeCells( c1, headerRow, c1, headerRow + 1 );
+        sheet0.addCell( new Label( c1, headerRow, "Facility", getCellFormat1() ) );
+        c1++;
+
+        /* Service Info */
+        Indicator selIndicator = new Indicator();
+        DataElement selDataElement = new DataElement();
+        DataElementCategoryOptionCombo selDecoc = new DataElementCategoryOptionCombo();
+        int flag = 0;
+
+        List<Integer> orgUnitIds = new ArrayList<Integer>( getIdentifiers(OrganisationUnit.class, selOUList ) );
+        orgUnitIdsByComma = getCommaDelimitedString( orgUnitIds );
+        
+        System.out.println( "Before getting aggdatamap "+new Date() );
+        Map<String, String> aggDataMap = new HashMap<String, String>( reportService.getResultDataValueFromAggregateTable( orgUnitIdsByComma, dataElementIdsByComma, periodIdsByComma ) );
+        System.out.println( "Before getting aggdatamap "+new Date() );
+    
+        /* Calculation Part */
+        int rowCount = 1;
+        int colCount = 0;
+        for( OrganisationUnit ou : selOUList )
+        {
+            System.out.println(ou.getName() + " : " +new Date());
+            sheet0.addCell( new Number( headerCol, headerRow + 1 + rowCount, rowCount, getCellFormat2() ) );
+            sheet0.addCell( new Label( 1, rowCount + 1, ou.getName(), getCellFormat2() ) );
+            
+            colCount = c1;
+            int deListCount = 0;
+            int indListCount = 0;
+            int serviceListCount = 0;
+            for( String serviceType : serviceTypeList )
+            {
+                if ( serviceType.equalsIgnoreCase( "I" ) )
+                {
+                    flag = 1;
+                    selIndicator = indicatorList.get( indListCount );
+                    indListCount++;
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                        sheet0.addCell( new Label( colCount, startRow, selIndicator.getName(), getCellFormat1() ) );
+                    }
+                }
+                else
+                {
+                    flag = 2;
+                    selDataElement = dataElementList.get( deListCount );
+                    deListCount++;
+                    if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                    {
+                        selDecoc = dataElementCategoryService.getDataElementCategoryOptionCombo( Integer.parseInt( selectedServices.get( serviceListCount ).split( ":" )[2] ) );
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                            sheet0.addCell( new Label( colCount, startRow, selDataElement.getName() + "-" + selDecoc.getName(), getCellFormat1() ) );
+                        }
+                    }
+                    else
+                    {
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.mergeCells( colCount, startRow, colCount + selStartPeriodList.size() - 1, startRow );
+                            sheet0.addCell( new Label( colCount, startRow, selDataElement.getName(), getCellFormat1() ) );
+                        }
+                    }
+                }
+
+                int periodCount = 0;
+                for ( Date sDate : selStartPeriodList )
+                {
+                    Date eDate = selEndPeriodList.get( periodCount );
+                
+                    Collection<Integer> periodIds = new ArrayList<Integer>( periodMap.get( periodCount ) );
+                    System.out.println( periodIds );
+
+                    double pwdvAggValue = 0.0;
+                    double pwdAggIndValue = 0.0;
+
+                    String tempStr = "";
+                    if ( flag == 1 )
+                    {
+                        Double numValue = 0.0;
+                        Double denValue = 0.0;
+                        Double indValue = 0.0;
+                        for( Integer periodId : periodIds )
+                        {
+                            try
+                            {
+                                numValue += Double.parseDouble( getAggVal( selIndicator.getNumerator(), aggDataMap, ou.getId(), periodId ) );
+                            }
+                            catch( Exception e )
+                            {
+                            }
+                            
+                            try
+                            {
+                                denValue += Double.parseDouble( getAggVal( selIndicator.getDenominator(), aggDataMap, ou.getId(), periodId ) );
+                            }
+                            catch( Exception e )
+                            {
+                            }
+                        }
+                        
+                        try
+                        {
+                            if( denValue != 0.0 )
+                            {
+                                indValue = ( numValue / denValue ) * selIndicator.getIndicatorType().getFactor();
+                            }
+                            else
+                            {
+                                indValue = 0.0;
+                            }
+                        }
+                        catch( Exception e )
+                        {
+                            indValue = 0.0;
+                        }
+
+                        pwdAggIndValue = indValue;
+                        pwdAggIndValue = Math.round( pwdAggIndValue * Math.pow( 10, 1 ) ) / Math.pow( 10, 1 );
+                        tempStr = "" + pwdAggIndValue;
+                    }
+                    else if ( flag == 2 )
+                    {
+                        if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                        {
+                            if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                            {
+                                for( Integer periodId : periodIds )
+                                {
+                                    tempStr = aggDataMap.get( ou.getId()+":"+selDataElement.getId()+":"+selDecoc.getId()+":"+periodId );
+                                    if( tempStr != null )
+                                    {
+                                        try
+                                        {
+                                            pwdvAggValue += Double.parseDouble( tempStr );
+                                        }
+                                        catch( Exception e )
+                                        {
+                                        }
+                                    }
+                                }
+                                tempStr = "" + (int) pwdvAggValue;
+                            }
+                            else
+                            {
+                                PeriodType periodType = periodService.getPeriodTypeByName( periodTypeLB );
+                                Period tempPeriod = periodService.getPeriod( sDate, eDate, periodType );
+                                if ( tempPeriod != null )
+                                {
+                                    DataValue dataValue = dataValueService.getDataValue( ou, selDataElement, tempPeriod, selDecoc );
+
+                                    if ( dataValue != null && dataValue.getValue() != null )
+                                    {
+                                        tempStr = dataValue.getValue();
+                                    }
+                                    else
+                                    {
+                                        tempStr = " ";
+                                    }
+                                }
+                                else
+                                {
+                                    tempStr = " ";
+                                }
+                            }
+                        }
+                        else
+                        {
+                            List<DataElementCategoryOptionCombo> optionCombos = new ArrayList<DataElementCategoryOptionCombo>( selDataElement.getCategoryCombo().getOptionCombos() );
+
+                            if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                            {
+                                for( DataElementCategoryOptionCombo optionCombo : optionCombos )
+                                {
+                                    for( Integer periodId : periodIds )
+                                    {
+                                        tempStr = aggDataMap.get( ou.getId()+":"+selDataElement.getId()+":"+optionCombo.getId()+":"+periodId );
+                                        if( tempStr != null )
+                                        {
+                                            try
+                                            {
+                                                pwdvAggValue += Double.parseDouble( tempStr );
+                                            }
+                                            catch( Exception e )
+                                            {
+                                            }
+                                        }
+                                    }
+                                }
+                                tempStr = "" + (int) pwdvAggValue;
+                            }
+                            else
+                            {
+                                Iterator<DataElementCategoryOptionCombo> optionComboIterator = optionCombos.iterator();
+                                while ( optionComboIterator.hasNext() )
+                                {
+                                    DataElementCategoryOptionCombo decoc1 = (DataElementCategoryOptionCombo) optionComboIterator.next();
+
+                                    PeriodType periodType = periodService.getPeriodTypeByName( periodTypeLB );
+                                    Period tempPeriod = periodService.getPeriod( sDate, eDate, periodType );
+                                    if( tempPeriod != null )
+                                    {
+                                        DataValue dataValue = dataValueService.getDataValue( ou, selDataElement, tempPeriod, decoc1 );
+
+                                        if ( dataValue != null )
+                                        {
+                                            tempStr += dataValue.getValue() + " : ";
+                                        }
+                                        else
+                                        {
+                                            tempStr = "  ";
+                                        }
+                                    }
+                                    else
+                                    {
+                                        tempStr = " ";
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.addCell( new Label( colCount, startRow + 1, periodNames.get( periodCount ), getCellFormat1() ) );
+                    }
+
+                    if ( flag == 1 )
+                    {
+                        sheet0.addCell( new Number( colCount, headerRow + 1 + rowCount, pwdAggIndValue, getCellFormat2() ) );
+                    }
+                    else
+                    {
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            sheet0.addCell( new Number( colCount, headerRow + 1 + rowCount, (int) pwdvAggValue, getCellFormat2() ) );
+                        }
+                        else
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow + 1 + rowCount, tempStr, getCellFormat2() ) );
+                        }
+                    }
+
+                    colCount++;
+                    periodCount++;
+                }// Period Loop
+                serviceListCount++;
+            }// Service loop end
+            rowCount++;
+        }// Orgunit loop end
+        
+        outputReportWorkbook.write();
+        outputReportWorkbook.close();
+
+        fileName = "TabularAnalysis.xls";
+        File outputReportFile = new File( outputReportPath );
+        inputStream = new BufferedInputStream( new FileInputStream( outputReportFile ) );
+    
+        outputReportFile.deleteOnExit();
+    }
     
     // -------------------------------------------------------------------------
     // Method for getting OrgUnit Level wise data in Excel Sheet 
@@ -3713,6 +5672,421 @@
         outputReportFile.deleteOnExit();    
     }
 
+    // -------------------------------------------------------------------------
+    // Method for getting OrgUnit Group wise data in Excel Sheet 
+    //     - UseExistingData - Aggregation of Periods
+    // -------------------------------------------------------------------------
+    public void generateOrgUnitGroupData_UseExisting_AggPeriods() throws Exception
+    {
+        int headerRow = 0;
+        int headerCol = 0;
+
+        String raFolderName = configurationService.getConfigurationByKey( Configuration_IN.KEY_REPORTFOLDER ).getValue();
+        String outputReportPath = System.getenv( "DHIS2_HOME" ) + File.separator + raFolderName + File.separator + "output" + File.separator + UUID.randomUUID().toString() + ".xls";
+        WritableWorkbook outputReportWorkbook = Workbook.createWorkbook( new File( outputReportPath ) );
+        WritableSheet sheet0 = outputReportWorkbook.createSheet( "TabularAnalysis", 0 );
+
+        sheet0.addCell( new Label( headerCol, headerRow, "Sl.No.", getCellFormat1() ) );
+
+        selOrgUnit = organisationUnitService.getOrganisationUnit( Integer.parseInt( orgUnitListCB.get( 0 ) ) );
+        selOUList = new ArrayList<OrganisationUnit>( organisationUnitService.getOrganisationUnitWithChildren( selOrgUnit.getId() ) );
+
+        OrganisationUnitGroup selOrgUnitGroup = organisationUnitGroupService.getOrganisationUnitGroup( orgUnitLevelCB );
+        List<OrganisationUnit> orgUnitList1 = new ArrayList<OrganisationUnit>( selOrgUnitGroup.getMembers() );
+
+        selOUList.retainAll( orgUnitList1 );
+
+        int minOULevel = 1;
+        int maxOULevel = organisationUnitService.getNumberOfOrganisationalLevels();
+
+        int c1 = headerCol + 1;
+
+        for( int i = minOULevel; i <= maxOULevel; i++ )
+        {
+            sheet0.addCell( new Label( c1, headerRow, "Level- "+i, getCellFormat1() ) );
+            c1++;
+        }
+
+        Map<Integer, Integer> orgunitLevelMap = new HashMap<Integer, Integer>( reportService.getOrgunitLevelMap() );
+
+
+        /* Service Info */
+        Indicator selIndicator = new Indicator();
+        DataElement selDataElement = new DataElement();
+        DataElementCategoryOptionCombo selDecoc = new DataElementCategoryOptionCombo();
+        int flag = 0;
+
+        List<Integer> orgUnitIds = new ArrayList<Integer>( getIdentifiers(OrganisationUnit.class, selOUList ) );
+        orgUnitIdsByComma = getCommaDelimitedString( orgUnitIds );
+        
+        System.out.println( "Before getting aggdatamap "+new Date() );
+        Map<String, String> aggDataMap = new HashMap<String, String>( reportService.getResultDataValueFromAggregateTableByPeriodAgg( orgUnitIdsByComma, dataElementIdsByComma, periodIdsByComma ) );
+        System.out.println( "After getting aggdatamap "+new Date() );
+    
+        /* Calculation Part */
+        int rowCount = 1;
+        int colCount = 0;
+        for( OrganisationUnit ou : selOUList )
+        {
+            System.out.println("Entered into orgunitloop :"+new Date());
+            sheet0.addCell( new Number( headerCol, headerRow + rowCount, rowCount, getCellFormat2() ) );
+            
+            Integer level = orgunitLevelMap.get( ou.getId() );
+            if( level == null )
+                level = organisationUnitService.getLevelOfOrganisationUnit( ou );
+            
+            colCount = 1 + level - minOULevel;
+            sheet0.addCell( new Label( colCount, headerRow + rowCount, ou.getName(), getCellFormat2() ) );
+            
+            OrganisationUnit orgUnit = new OrganisationUnit();
+            orgUnit = ou;
+            int count1=1;
+            while( orgUnit.getParent() != null )
+            {
+                orgUnit = orgUnit.getParent();
+                sheet0.addCell( new Label( colCount-count1, headerRow + rowCount, orgUnit.getName(), getCellFormat2() ) );
+                count1++;
+            }
+
+            colCount = c1;
+            int deListCount = 0;
+            int indListCount = 0;
+            int serviceListCount = 0;
+            for( String serviceType : serviceTypeList )
+            {
+                String tempStr = "";
+                Double indValue = 0.0;
+                Double dataValue = 0.0;
+                
+                if ( serviceType.equalsIgnoreCase( "I" ) )
+                {
+                    Double numValue = 0.0;
+                    Double denValue = 0.0;
+
+                    flag = 1;
+                    selIndicator = indicatorList.get( indListCount );
+                    indListCount++;
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.addCell( new Label( colCount, headerRow, selIndicator.getName(), getCellFormat1() ) );
+                    }
+                    
+                    try
+                    {
+                        numValue = Double.parseDouble( getAggValByOrgUnit( selIndicator.getNumerator(), aggDataMap, ou.getId() ) );
+                    }
+                    catch( Exception e )
+                    {
+                    }
+                    
+                    try
+                    {
+                        denValue = Double.parseDouble( getAggValByOrgUnit( selIndicator.getDenominator(), aggDataMap, ou.getId() ) );
+                    }
+                    catch( Exception e )
+                    {
+                    }
+                    
+                    try
+                    {
+                        if( denValue != 0.0 )
+                        {
+                            indValue = ( numValue / denValue ) * selIndicator.getIndicatorType().getFactor();
+                        }
+                        else
+                        {
+                            indValue = 0.0;
+                        }
+                    }
+                    catch( Exception e )
+                    {
+                        indValue = 0.0;
+                    }
+                    
+                    indValue = Math.round( indValue * Math.pow( 10, 1 ) ) / Math.pow( 10, 1 );
+                }
+                else
+                {
+                    flag = 2;
+                    selDataElement = dataElementList.get( deListCount );
+                    deListCount++;
+                    if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                    {
+                        selDecoc = dataElementCategoryService.getDataElementCategoryOptionCombo( Integer.parseInt( selectedServices.get( serviceListCount ).split( ":" )[2] ) );
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow, selDataElement.getName() + "-" + selDecoc.getName(), getCellFormat1() ) );
+                        }
+                        
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            tempStr = aggDataMap.get( ou.getId()+":"+selDataElement.getId()+":"+selDecoc.getId() );
+                            if( tempStr != null )
+                            {
+                                try
+                                {
+                                    dataValue = Double.parseDouble( tempStr );
+                                }
+                                catch( Exception e )
+                                {
+                                    dataValue = 0.0;
+                                }
+                            }
+                        }
+                        else
+                        {
+                            dataValue = 0.0;
+                        }
+                    }
+                    else
+                    {
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow, selDataElement.getName(), getCellFormat1() ) );
+                        }
+                        List<DataElementCategoryOptionCombo> optionCombos = new ArrayList<DataElementCategoryOptionCombo>( selDataElement.getCategoryCombo().getOptionCombos() );
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            for( DataElementCategoryOptionCombo optionCombo : optionCombos )
+                            {
+                                tempStr = aggDataMap.get( ou.getId()+":"+selDataElement.getId()+":"+optionCombo.getId() );
+                                if( tempStr != null )
+                                {
+                                    try
+                                    {
+                                        dataValue += Double.parseDouble( tempStr );
+                                    }
+                                    catch( Exception e )
+                                    {
+                                    }
+                                }
+                            }
+                        }
+                        else
+                        {
+                            dataValue = 0.0;
+                        }
+                    }
+                }
+
+                if ( flag == 1 )
+                {
+                    sheet0.addCell( new Number( colCount, headerRow + rowCount, indValue, getCellFormat2() ) );
+                }
+                else
+                {
+                    sheet0.addCell( new Number( colCount, headerRow + rowCount, dataValue, getCellFormat2() ) );
+                }
+
+                colCount++;
+                serviceListCount++;
+            }// Service loop end
+            rowCount++;
+        }// Orgunit loop end
+        
+        outputReportWorkbook.write();
+        outputReportWorkbook.close();
+
+        fileName = "TabularAnalysis.xls";
+        File outputReportFile = new File( outputReportPath );
+        inputStream = new BufferedInputStream( new FileInputStream( outputReportFile ) );
+    
+        outputReportFile.deleteOnExit();    
+    }
+    
+    // -------------------------------------------------------------------------
+    // Method for getting Selected OrgUnit data in Excel Sheet 
+    //     - UseExistingData - Aggregation of Periods
+    // -------------------------------------------------------------------------
+    public void generateSelectedOrgUnitData_UseExisting_AggPeriods() throws Exception
+    {
+        int headerRow = 0;
+        int headerCol = 0;
+
+        String raFolderName = configurationService.getConfigurationByKey( Configuration_IN.KEY_REPORTFOLDER ).getValue();
+        String outputReportPath = System.getenv( "DHIS2_HOME" ) + File.separator + raFolderName + File.separator + "output" + File.separator + UUID.randomUUID().toString() + ".xls";
+        WritableWorkbook outputReportWorkbook = Workbook.createWorkbook( new File( outputReportPath ) );
+        WritableSheet sheet0 = outputReportWorkbook.createSheet( "TabularAnalysis", 0 );
+
+        sheet0.addCell( new Label( headerCol, headerRow, "Sl.No.", getCellFormat1() ) );
+        
+        for ( String ouStr : orgUnitListCB )
+        {
+            OrganisationUnit ou = organisationUnitService.getOrganisationUnit( Integer.parseInt( ouStr ) );
+            selOUList.add( ou );
+        }
+
+        int c1 = headerCol + 1;
+        sheet0.addCell( new Label( c1, headerRow, "Facility", getCellFormat1() ) );
+        c1++;
+
+        /* Service Info */
+        Indicator selIndicator = new Indicator();
+        DataElement selDataElement = new DataElement();
+        DataElementCategoryOptionCombo selDecoc = new DataElementCategoryOptionCombo();
+        int flag = 0;
+
+        List<Integer> orgUnitIds = new ArrayList<Integer>( getIdentifiers(OrganisationUnit.class, selOUList ) );
+        orgUnitIdsByComma = getCommaDelimitedString( orgUnitIds );
+        
+        System.out.println( "Before getting aggdatamap "+new Date() );
+        Map<String, String> aggDataMap = new HashMap<String, String>( reportService.getResultDataValueFromAggregateTableByPeriodAgg( orgUnitIdsByComma, dataElementIdsByComma, periodIdsByComma ) );
+        System.out.println( "After getting aggdatamap "+new Date() );
+    
+        /* Calculation Part */
+        int rowCount = 1;
+        int colCount = 0;
+        for( OrganisationUnit ou : selOUList )
+        {
+            System.out.println("Entered into orgunitloop :"+new Date());
+            sheet0.addCell( new Number( headerCol, headerRow + rowCount, rowCount, getCellFormat2() ) );
+            sheet0.addCell( new Label( headerCol+1, headerRow + rowCount, ou.getName(), getCellFormat2() ) );
+
+            colCount = c1;
+            int deListCount = 0;
+            int indListCount = 0;
+            int serviceListCount = 0;
+            for( String serviceType : serviceTypeList )
+            {
+                String tempStr = "";
+                Double indValue = 0.0;
+                Double dataValue = 0.0;
+                
+                if ( serviceType.equalsIgnoreCase( "I" ) )
+                {
+                    Double numValue = 0.0;
+                    Double denValue = 0.0;
+
+                    flag = 1;
+                    selIndicator = indicatorList.get( indListCount );
+                    indListCount++;
+                    if ( rowCount == 1 )
+                    {
+                        sheet0.addCell( new Label( colCount, headerRow, selIndicator.getName(), getCellFormat1() ) );
+                    }
+                    
+                    try
+                    {
+                        numValue = Double.parseDouble( getAggValByOrgUnit( selIndicator.getNumerator(), aggDataMap, ou.getId() ) );
+                    }
+                    catch( Exception e )
+                    {
+                    }
+                    
+                    try
+                    {
+                        denValue = Double.parseDouble( getAggValByOrgUnit( selIndicator.getDenominator(), aggDataMap, ou.getId() ) );
+                    }
+                    catch( Exception e )
+                    {
+                    }
+                    
+                    try
+                    {
+                        if( denValue != 0.0 )
+                        {
+                            indValue = ( numValue / denValue ) * selIndicator.getIndicatorType().getFactor();
+                        }
+                        else
+                        {
+                            indValue = 0.0;
+                        }
+                    }
+                    catch( Exception e )
+                    {
+                        indValue = 0.0;
+                    }
+                    
+                    indValue = Math.round( indValue * Math.pow( 10, 1 ) ) / Math.pow( 10, 1 );
+                }
+                else
+                {
+                    flag = 2;
+                    selDataElement = dataElementList.get( deListCount );
+                    deListCount++;
+                    if ( deSelection.equalsIgnoreCase( "optioncombo" ) )
+                    {
+                        selDecoc = dataElementCategoryService.getDataElementCategoryOptionCombo( Integer.parseInt( selectedServices.get( serviceListCount ).split( ":" )[2] ) );
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow, selDataElement.getName() + "-" + selDecoc.getName(), getCellFormat1() ) );
+                        }
+                        
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            tempStr = aggDataMap.get( ou.getId()+":"+selDataElement.getId()+":"+selDecoc.getId() );
+                            if( tempStr != null )
+                            {
+                                try
+                                {
+                                    dataValue = Double.parseDouble( tempStr );
+                                }
+                                catch( Exception e )
+                                {
+                                    dataValue = 0.0;
+                                }
+                            }
+                        }
+                        else
+                        {
+                            dataValue = 0.0;
+                        }
+                    }
+                    else
+                    {
+                        if ( rowCount == 1 )
+                        {
+                            sheet0.addCell( new Label( colCount, headerRow, selDataElement.getName(), getCellFormat1() ) );
+                        }
+                        List<DataElementCategoryOptionCombo> optionCombos = new ArrayList<DataElementCategoryOptionCombo>( selDataElement.getCategoryCombo().getOptionCombos() );
+                        if ( selDataElement.getType().equalsIgnoreCase( DataElement.VALUE_TYPE_INT ) )
+                        {
+                            for( DataElementCategoryOptionCombo optionCombo : optionCombos )
+                            {
+                                tempStr = aggDataMap.get( ou.getId()+":"+selDataElement.getId()+":"+optionCombo.getId() );
+                                if( tempStr != null )
+                                {
+                                    try
+                                    {
+                                        dataValue += Double.parseDouble( tempStr );
+                                    }
+                                    catch( Exception e )
+                                    {
+                                    }
+                                }
+                            }
+                        }
+                        else
+                        {
+                            dataValue = 0.0;
+                        }
+                    }
+                }
+
+                if ( flag == 1 )
+                {
+                    sheet0.addCell( new Number( colCount, headerRow + rowCount, indValue, getCellFormat2() ) );
+                }
+                else
+                {
+                    sheet0.addCell( new Number( colCount, headerRow + rowCount, dataValue, getCellFormat2() ) );
+                }
+
+                colCount++;
+                serviceListCount++;
+            }// Service loop end
+            rowCount++;
+        }// Orgunit loop end
+        
+        outputReportWorkbook.write();
+        outputReportWorkbook.close();
+
+        fileName = "TabularAnalysis.xls";
+        File outputReportFile = new File( outputReportPath );
+        inputStream = new BufferedInputStream( new FileInputStream( outputReportFile ) );
+    
+        outputReportFile.deleteOnExit();    
+    }
     
     // -------------------------------------------------------------------------
     // Method for getting OrgUnit Level wise List in Excel Sheet
@@ -3925,24 +6299,6 @@
                                             }
                                         }
                                     }
-                                    
-                                    /*
-                                    Map<String, String> aggDeMap = new HashMap<String, String>();
-                                    aggDeMap.putAll( reportService.getResultDataValueFromAggregateTable( ou.getId(), ""+selDataElement.getId(), periodIdsByComma ) );
-                                    tempStr = aggDeMap.get(selDataElement.getId()+"."+selDecoc.getId());
-                                    
-                                    if( tempStr != null )
-                                    {
-                                        try
-                                        {
-                                            tempAggVal = Double.parseDouble( tempStr );
-                                        }
-                                        catch( Exception e )
-                                        {
-                                            tempAggVal = null;
-                                        }
-                                    }
-                                    */
                                 }
 
                                 if ( tempAggVal == null )
@@ -4023,25 +6379,6 @@
                                     }
                                     pwdvAggValue += tempAggVal;
                                     System.out.println( ou.getName()+" : "+selDataElement.getName()+" : "+pwdvAggValue );
-                                    /*
-                                    Map<String, String> aggDeMap = new HashMap<String, String>();
-                                        System.out.println(ou.getId()+ " : " + selDataElement.getName() + periodIdsByComma );
-                                        aggDeMap.putAll( reportService.getResultDataValueFromAggregateTable( ou.getId(), ""+selDataElement.getId(), periodIdsByComma ) );
-                                        for( String aggDe : aggDeMap.keySet() )
-                                        {
-                                                String temp = aggDeMap.get( aggDe );
-                                                try
-                                                {
-                                                        tempAggVal = Double.parseDouble( temp );
-                                                }
-                                                catch( Exception e )
-                                                {
-                                                        tempAggVal = 0.0;
-                                                }
-                                                pwdvAggValue += tempAggVal;
-                                        }
-                                        */
-
                                 }
 
                                 tempStr = "" + (int) pwdvAggValue;
@@ -4178,6 +6515,7 @@
         wCellformat.setBorder( Border.ALL, BorderLineStyle.THIN );
         wCellformat.setAlignment( Alignment.CENTRE );
         wCellformat.setBackground( Colour.GRAY_25 );
+        wCellformat.setVerticalAlignment( VerticalAlignment.CENTRE );
         wCellformat.setWrap( true );
 
         return wCellformat;
@@ -4189,6 +6527,7 @@
 
         wCellformat.setBorder( Border.ALL, BorderLineStyle.THIN );
         wCellformat.setAlignment( Alignment.CENTRE );
+        wCellformat.setVerticalAlignment( VerticalAlignment.CENTRE );
         wCellformat.setWrap( true );
 
         return wCellformat;
@@ -4356,6 +6695,5 @@
             throw new RuntimeException( "Illegal DataElement id", ex );
         }
     }
-
     
 }// class end

=== modified file 'local/in/dhis-web-dashboard/src/main/resources/org/hisp/dhis/dataanalyser/i18n_module.properties'
--- local/in/dhis-web-dashboard/src/main/resources/org/hisp/dhis/dataanalyser/i18n_module.properties	2011-06-15 06:01:50 +0000
+++ local/in/dhis-web-dashboard/src/main/resources/org/hisp/dhis/dataanalyser/i18n_module.properties	2011-06-17 04:57:05 +0000
@@ -64,6 +64,9 @@
 ta_tabular_analyser = Tabular Analyser
 ta_generatereport = Generate Report
 ta_selected_servicelist = Selected DataElement/Indicator List :  
+generate_agg_data = Generate Aggregate Data
+use_captured_data = Use Captured Data
+use_existing_agg_data = Use Existing Aggregated Data
 
 #-------View Chart---------------------------#
 

=== modified file 'local/in/dhis-web-excelimport/src/main/java/org/hisp/dhis/excelimport/tcs/action/TCSXmlImportResultAction.java'
--- local/in/dhis-web-excelimport/src/main/java/org/hisp/dhis/excelimport/tcs/action/TCSXmlImportResultAction.java	2011-04-15 11:42:21 +0000
+++ local/in/dhis-web-excelimport/src/main/java/org/hisp/dhis/excelimport/tcs/action/TCSXmlImportResultAction.java	2011-06-17 04:57:05 +0000
@@ -141,6 +141,8 @@
     int insertCount = 0;
     int updateCount = 0;
     int facilityCount = 0;
+    int importFacilityCount = 0;
+    String missingFacilities = "";
 
     // -------------------------------------------------------------------------
     // Action implementation
@@ -165,9 +167,11 @@
             if( importTCSData() !=0 )
             {
                 message += "<br>Importing has been done successfully for the file : "+ fileName;
-                message += "<br>Total number of Facilities that are imported : "+ facilityCount;
+                message += "<br>Total number of Facilities for Importing : "+ facilityCount;
+                message += "<br>Total number of Facilities that are Imported : "+ importFacilityCount;
                 message += "<br>Total new records that are imported : "+insertCount;
                 message += "<br>Total records that are updated : "+updateCount;
+                message += "<br>Missing Facilities in DHIS : "+missingFacilities;
             }
         }
         catch( Exception e )
@@ -220,12 +224,26 @@
             
             String orgUnitCode = tcsDataValue.getOrgunitCode();
             Integer orgUnitId = getOrgUnitIdByCode( orgUnitCode );
-            
+
+            if( orgUnitId == null )
+            {
+                if( !facilityCode.equals( orgUnitCode ) )
+                {
+                        facilityCode = orgUnitCode;
+                    facilityCount++;
+                        missingFacilities += orgUnitCode+", ";
+                }
+                
+                continue;
+            }
+
             if( !facilityCode.equals( orgUnitCode ) )
             {
                 facilityCode = orgUnitCode;
                 facilityCount++;
+                importFacilityCount++;
             }
+
             
             String tcsPeriod = tcsDataValue.getTscPeriod();
             String selMonth = monthMap.get( tcsPeriod.split( "-" )[0] );