private DIExcel GenerateDSDWorksheet(DIExcel ReportExcel, int SheetIndex, SDMXApi_2_0.Message.StructureType CompleteStructure)
    {
        int i, j;
        IWorksheet DSDWorkSheet = null;
        int rowindex = 0;
        string Language, AttributeImportance;
        Language = string.Empty;
        AttributeImportance = string.Empty;

        try
        {
            // Language = CompleteStructure.Concepts.Concept[0].Name[0].lang;
            if (CompleteStructure.Concepts.Concept.Count > 0)
            {
                Language = CompleteStructure.Concepts.Concept[0].Name[0].lang;
            }
            else if (CompleteStructure.Concepts.ConceptScheme.Count > 0)
            {
                Language = CompleteStructure.Concepts.ConceptScheme[0].Name[0].lang;
            }

            DSDWorkSheet = ReportExcel.GetWorksheet(0);
            ReportExcel.RenameWorkSheet(0, "DSD");
            rowindex = rowindex + 1;
            this.WriteValueInCell(ReportExcel, "Data Structure Definition", rowindex, 1, 14, true, 30, 0, 0);
            rowindex = rowindex + 2;

            //Binding Dimensions
            this.WriteValueInCell(ReportExcel, "Dimensions", rowindex, 1, 12, true, 30, 0, 0);
            rowindex = rowindex + 2;
            if (CompleteStructure.Concepts.Concept.Count > 0)
            {
                for (i = 0; i < CompleteStructure.KeyFamilies[0].Components.Dimension.Count; i++)
                {
                    for (j = 0; j < CompleteStructure.Concepts.Concept.Count; j++)
                    {
                        if (CompleteStructure.Concepts.Concept[j].id == CompleteStructure.KeyFamilies[0].Components.Dimension[i].conceptRef)
                        {
                            this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.Concept[j].Name, Language), rowindex, 1, 10, false, 30, 0, 0);
                            this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.Concept[j].Description, Language), rowindex, 2, 10, false, 250, 0, 0);
                            rowindex = rowindex + 1;
                            break;
                        }
                    }

                }
            }
            else if (CompleteStructure.Concepts.ConceptScheme.Count > 0)
            {
                for (i = 0; i < CompleteStructure.KeyFamilies[0].Components.Dimension.Count; i++)
                {
                    for (j = 0; j < CompleteStructure.Concepts.ConceptScheme.Count; j++)
                    {
                        for (int k = 0; k < CompleteStructure.Concepts.ConceptScheme[j].Concept.Count; k++)
                        {
                            if (CompleteStructure.Concepts.ConceptScheme[j].Concept[k].id == CompleteStructure.KeyFamilies[0].Components.Dimension[i].conceptRef)
                            {
                                this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.ConceptScheme[j].Concept[k].Name, Language), rowindex, 1, 10, false, 30, 0, 0);
                                this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.ConceptScheme[j].Concept[k].Description, Language), rowindex, 2, 10, false, 250, 0, 0);
                                rowindex = rowindex + 1;
                                break;
                            }
                        }

                    }

                }
            }

            //Binding Time Dimension

            if (CompleteStructure.Concepts.Concept.Count > 0)
            {
                for (j = 0; j < CompleteStructure.Concepts.Concept.Count; j++)
                {
                    if (CompleteStructure.Concepts.Concept[j].id == CompleteStructure.KeyFamilies[0].Components.TimeDimension.conceptRef)
                    {
                        this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.Concept[j].Name, Language), rowindex, 1, 10, false, 30, 0, 0);
                        this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.Concept[j].Description, Language), rowindex, 2, 10, false, 250, 0, 0);
                        rowindex = rowindex + 1;
                        break;
                    }
                }
            }

            else if (CompleteStructure.Concepts.ConceptScheme.Count > 0)
            {
                for (j = 0; j < CompleteStructure.Concepts.ConceptScheme.Count; j++)
                {
                    for (int k = 0; k < CompleteStructure.Concepts.ConceptScheme[j].Concept.Count; k++)
                    {
                        if (CompleteStructure.Concepts.ConceptScheme[j].Concept[k].id == CompleteStructure.KeyFamilies[0].Components.TimeDimension.conceptRef)
                        {
                            this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.ConceptScheme[j].Concept[k].Name, Language), rowindex, 1, 10, false, 30, 0, 0);
                            this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.ConceptScheme[j].Concept[k].Description, Language), rowindex, 2, 10, false, 250, 0, 0);
                            rowindex = rowindex + 1;
                            break;
                        }
                    }
                }
            }

            rowindex = rowindex + 2;

            //Binding Attributes

            this.WriteValueInCell(ReportExcel, "Attributes", rowindex, 1, 12, true, 30, 0, 0);
            rowindex = rowindex + 2;

            if (CompleteStructure.Concepts.Concept.Count > 0)
            {
                for (i = 0; i < CompleteStructure.KeyFamilies[0].Components.Attribute.Count; i++)
                {
                    for (j = 0; j < CompleteStructure.Concepts.Concept.Count; j++)
                    {
                        if (CompleteStructure.Concepts.Concept[j].id == CompleteStructure.KeyFamilies[0].Components.Attribute[i].conceptRef)
                        {
                            this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.Concept[j].Name, Language), rowindex, 1, 10, false, 30, 0, 0);
                            this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.Concept[j].Description, Language), rowindex, 2, 10, false, 250, 0, 0);
                            rowindex = rowindex + 1;
                            this.WriteValueInCell(ReportExcel, "Attachment Level : " + CompleteStructure.KeyFamilies[0].Components.Attribute[i].attachmentLevel, rowindex, 1, 10, false, 30, 0, 0);

                            if (CompleteStructure.KeyFamilies[0].Components.Attribute[i].assignmentStatus == SDMXApi_2_0.Structure.AssignmentStatusType.Mandatory)
                            {
                                AttributeImportance = "Mandatory : " + "Yes";
                            }
                            else
                            {
                                AttributeImportance = "Mandatory : " + "No";
                            }
                            this.WriteValueInCell(ReportExcel, AttributeImportance, rowindex, 2, 10, false, 30, 0, 0);
                            rowindex = rowindex + 2;

                            break;
                        }
                    }

                }
            }
            else if (CompleteStructure.Concepts.ConceptScheme.Count > 0)
            {
                for (i = 0; i < CompleteStructure.KeyFamilies[0].Components.Attribute.Count; i++)
                {
                    for (j = 0; j < CompleteStructure.Concepts.ConceptScheme.Count; j++)
                    {
                        for (int k = 0; k < CompleteStructure.Concepts.ConceptScheme[j].Concept.Count; k++)
                        {
                            if (CompleteStructure.Concepts.ConceptScheme[j].Concept[k].id == CompleteStructure.KeyFamilies[0].Components.Attribute[i].conceptRef)
                            {
                                this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.ConceptScheme[j].Concept[k].Name, Language), rowindex, 1, 10, false, 30, 0, 0);
                                this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.ConceptScheme[j].Concept[k].Description, Language), rowindex, 2, 10, false, 250, 0, 0);
                                rowindex = rowindex + 1;
                                this.WriteValueInCell(ReportExcel, "Attachment Level : " + CompleteStructure.KeyFamilies[0].Components.Attribute[i].attachmentLevel, rowindex, 1, 10, false, 30, 0, 0);

                                if (CompleteStructure.KeyFamilies[0].Components.Attribute[i].assignmentStatus == SDMXApi_2_0.Structure.AssignmentStatusType.Mandatory)
                                {
                                    AttributeImportance = "Mandatory : " + "Yes";
                                }
                                else
                                {
                                    AttributeImportance = "Mandatory : " + "No";
                                }
                                this.WriteValueInCell(ReportExcel, AttributeImportance, rowindex, 2, 10, false, 30, 0, 0);
                                rowindex = rowindex + 2;

                                break;
                            }
                        }

                    }

                }
            }

            rowindex = rowindex + 1;

            //Binding Measure
            this.WriteValueInCell(ReportExcel, "Measure", rowindex, 1, 12, true, 30, 0, 0);

            rowindex = rowindex + 1;
            if (CompleteStructure.Concepts.Concept.Count > 0)
            {
                for (j = 0; j < CompleteStructure.Concepts.Concept.Count; j++)
                {
                    if (CompleteStructure.Concepts.Concept[j].id == CompleteStructure.KeyFamilies[0].Components.PrimaryMeasure.conceptRef)
                    {
                        this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.Concept[j].Name, Language), rowindex, 1, 10, false, 30, 0, 0);
                        this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.Concept[j].Description, Language), rowindex, 2, 10, false, 250, 0, 0);
                        rowindex = rowindex + 1;
                        break;
                    }
                }
            }
            else if (CompleteStructure.Concepts.ConceptScheme.Count > 0)
            {
                for (j = 0; j < CompleteStructure.Concepts.ConceptScheme.Count; j++)
                {
                    if (CompleteStructure.Concepts.ConceptScheme[j].id == CompleteStructure.KeyFamilies[0].Components.PrimaryMeasure.conceptSchemeRef)
                    {
                        for (int k = 0; k < CompleteStructure.Concepts.ConceptScheme[j].Concept.Count; k++)
                        {
                            if (CompleteStructure.Concepts.ConceptScheme[j].Concept[k].id == CompleteStructure.KeyFamilies[0].Components.PrimaryMeasure.conceptRef)
                            {
                                this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.ConceptScheme[j].Concept[k].Name, Language), rowindex, 1, 10, false, 30, 0, 0);
                                this.WriteValueInCell(ReportExcel, GetLangSpecificValueFor_Version_2_0(CompleteStructure.Concepts.ConceptScheme[j].Concept[k].Description, Language), rowindex, 2, 10, false, 250, 0, 0);
                                rowindex = rowindex + 1;
                                break;
                            }
                        }
                    }
                }
            }

        }
        catch (Exception ex)
        {
            Global.CreateExceptionString(ex, null);
            throw ex;
        }
        finally
        {
        }

        return ReportExcel;
    }
    private DIExcel GenerateDimensionAndAttributesComparison(string hlngcodedb,SDMXObjectModel.Message.StructureType DSD1, SDMXObjectModel.Message.StructureType DSD2, DIExcel ReportExcel, Dictionary<string, string> dictMappedIndicators, List<String> ListOfMissingDimensions, List<String> AdditionalDSD1DimensionList, Dictionary<string, string> dictMappedAttributes, List<String> ListOfMissingAttributes, List<String> AdditionalDSD1AttributeList)
    {
        int rowindex = 0;
        string DimensionName = string.Empty;
        string AttributeName = string.Empty;
        int SNo;
        SDMXObjectModel.Structure.DataStructureComponentsType DSD1DSComponents;
        SDMXObjectModel.Structure.DataStructureComponentsType DSD2DSComponents;
        SDMXObjectModel.Structure.StructuresType ConceptsObjDSD1;
        SDMXObjectModel.Structure.StructuresType ConceptsObjDSD2;
        IWorksheet WorkbookSheet = null;

        try
        {
            DSD1DSComponents = (SDMXObjectModel.Structure.DataStructureComponentsType)(DSD1.Structures.DataStructures[0].Item);
            DSD2DSComponents = (SDMXObjectModel.Structure.DataStructureComponentsType)(DSD2.Structures.DataStructures[0].Item);

            ConceptsObjDSD1 = DSD1.Structures;
            ConceptsObjDSD2 = DSD2.Structures;

            ReportExcel.RenameWorkSheet(0, "Dimensions");
            // Writing into Dimensions Worksheet

            // Writing Matched Dimensions that exist in both DSD1 and DSD2
            rowindex = rowindex + 1;
            WorkbookSheet = ReportExcel.GetWorksheet(0);
            this.WriteValueInCell(ReportExcel, "Matched Dimensions", rowindex, 1, 14, true, 10, 0, 0);
            WorkbookSheet.Cells[rowindex, 1, rowindex, 2].Merge();
            rowindex = rowindex + 2;
            this.WriteValueInCell(ReportExcel, "S.No.", rowindex, 1, 12, true, 10, 0, 0);
            this.WriteValueInCell(ReportExcel, "ID", rowindex, 2, 12, true, 60, 0, 0);
            this.WriteValueInCell(ReportExcel, "Name", rowindex,3, 12, true, 70, 0, 0);
            rowindex = rowindex + 1;
            SNo = 0;
            foreach (string MatchedDimension in dictMappedIndicators.Keys)
            {
                if(!(AdditionalDSD1DimensionList.Contains(MatchedDimension)))
                {
                    SNo = SNo + 1;
                    this.WriteValueInCell(ReportExcel, SNo.ToString(), rowindex, 1, 10, false, 10, 0, 0);
                    DimensionName = string.Empty;
                    DimensionName = GetLanguageBasedConceptNameFromConceptScheme(ConceptsObjDSD1, MatchedDimension, hlngcodedb);
                    this.WriteValueInCell(ReportExcel, MatchedDimension, rowindex, 2, 10, false, 60, 0, 0);
                    if (DimensionName != string.Empty)
                    {
                        this.WriteValueInCell(ReportExcel,DimensionName, rowindex, 3, 10, false, 70, 0, 0);
                    }

                    rowindex = rowindex + 1;
                }

            }

            // Writing Missing Dimensions that exist in DSD2 but not in DSD1

            rowindex = rowindex + 2;
            this.WriteValueInCell(ReportExcel, "Missing Dimensions", rowindex, 1, 14, true, 10, 0, 0);
            WorkbookSheet.Cells[rowindex, 1, rowindex, 2].Merge();
            rowindex = rowindex + 2;
            this.WriteValueInCell(ReportExcel, "S.No.", rowindex, 1, 12, true, 10, 0, 0);
            this.WriteValueInCell(ReportExcel, "ID", rowindex, 2, 12, true, 60, 0, 0);
            this.WriteValueInCell(ReportExcel, "Name", rowindex, 3, 12, true, 70, 0, 0);
            rowindex = rowindex + 1;

            SNo = 0;
            foreach (string MissingDimension in ListOfMissingDimensions)
            {
                SNo = SNo + 1;
                this.WriteValueInCell(ReportExcel, SNo.ToString(), rowindex, 1, 10, false, 10, 0, 0);
                DimensionName = string.Empty;
                DimensionName = GetLanguageBasedConceptNameFromConceptScheme(ConceptsObjDSD2, MissingDimension, hlngcodedb);
                this.WriteValueInCell(ReportExcel, MissingDimension, rowindex, 2, 10, false, 60, 0, 0);
                if (DimensionName != string.Empty)
                {
                    this.WriteValueInCell(ReportExcel, DimensionName, rowindex, 3, 10, false, 70, 0, 0);
                }
                rowindex = rowindex + 1;

            }

            // Writing Additional Dimensions that exist in DSD1 but not in DSD2

            rowindex = rowindex + 2;
            this.WriteValueInCell(ReportExcel, "Additional Dimensions", rowindex, 1, 14, true, 10, 0, 0);
            WorkbookSheet.Cells[rowindex, 1, rowindex, 2].Merge();
            rowindex = rowindex + 2;
            this.WriteValueInCell(ReportExcel, "S.No.", rowindex, 1, 12, true, 10, 0, 0);
            this.WriteValueInCell(ReportExcel, "ID", rowindex, 2, 12, true, 60, 0, 0);
            this.WriteValueInCell(ReportExcel, "Name", rowindex, 3, 12, true, 70, 0, 0);
            rowindex = rowindex + 1;

            SNo = 0;
            foreach (string AdditionalDimension in AdditionalDSD1DimensionList)
            {
                SNo = SNo + 1;
                this.WriteValueInCell(ReportExcel, SNo.ToString(), rowindex, 1, 10, false, 10, 0, 0);
                DimensionName = string.Empty;
                DimensionName = GetLanguageBasedConceptNameFromConceptScheme(ConceptsObjDSD1, AdditionalDimension, hlngcodedb);
                this.WriteValueInCell(ReportExcel, AdditionalDimension, rowindex, 2, 10, false, 60, 0, 0);
                if (DimensionName != string.Empty)
                {
                    this.WriteValueInCell(ReportExcel, DimensionName, rowindex, 3, 10, false, 70, 0, 0);
                }

                rowindex = rowindex + 1;

            }

            // Writing into Attributes Worksheet

            ReportExcel.InsertWorkSheet("Attributes");
            WorkbookSheet = ReportExcel.GetWorksheet(1);
            // Writing Matched Attributes that exist in both DSD1 and DSD2

            rowindex = 1;
            this.WriteValueInCell(ReportExcel, "Matched Attributes", rowindex, 1, 14, true, 10, 0, 1);
            WorkbookSheet.Cells[rowindex, 1, rowindex, 2].Merge();
            rowindex = rowindex + 2;
            this.WriteValueInCell(ReportExcel, "S.No.", rowindex, 1, 12, true, 10, 0,1);
            this.WriteValueInCell(ReportExcel, "ID", rowindex, 2, 12, true, 60, 0, 1);
            this.WriteValueInCell(ReportExcel, "Name", rowindex, 3, 12, true, 70, 0, 1);
            rowindex = rowindex + 1;

            SNo = 0;
            foreach (string MatchedAttribute in dictMappedAttributes.Keys)
            {
                if (!(AdditionalDSD1AttributeList.Contains(MatchedAttribute)))
                {
                    SNo = SNo + 1;
                    this.WriteValueInCell(ReportExcel, SNo.ToString(), rowindex, 1, 10, false,10, 0, 1);
                    AttributeName = string.Empty;
                    AttributeName = GetLanguageBasedConceptNameFromConceptScheme(ConceptsObjDSD1, MatchedAttribute, hlngcodedb);
                    this.WriteValueInCell(ReportExcel, MatchedAttribute, rowindex, 2, 10, false, 60, 0, 1);
                    if (AttributeName != string.Empty)
                    {
                        this.WriteValueInCell(ReportExcel, AttributeName, rowindex, 3, 10, false, 70, 0, 1);
                    }
                    rowindex = rowindex + 1;
                }
            }

            // Writing Missing Attributes that exist in DSD2 but not in DSD1
            rowindex = rowindex + 2;
            this.WriteValueInCell(ReportExcel, "Missing Attributes", rowindex, 1, 14, true, 10, 0, 1);
            WorkbookSheet.Cells[rowindex, 1, rowindex, 2].Merge();
            rowindex = rowindex + 2;
            this.WriteValueInCell(ReportExcel, "S.No.", rowindex, 1, 12, true, 10, 0, 1);
            this.WriteValueInCell(ReportExcel, "ID", rowindex, 2, 12, true, 60, 0,1);
            this.WriteValueInCell(ReportExcel, "Name", rowindex, 3, 12, true, 70, 0, 1);
            rowindex = rowindex + 1;

            SNo = 0;
            foreach (string MissingAttribute in ListOfMissingAttributes)
            {
                SNo = SNo + 1;
                this.WriteValueInCell(ReportExcel, SNo.ToString(), rowindex, 1, 10, false, 10, 0, 1);
                AttributeName = string.Empty;
                AttributeName = GetLanguageBasedConceptNameFromConceptScheme(ConceptsObjDSD2, MissingAttribute, hlngcodedb);
                this.WriteValueInCell(ReportExcel, MissingAttribute, rowindex, 2, 10, false, 60, 0, 1);
                if (AttributeName != string.Empty)
                {
                    this.WriteValueInCell(ReportExcel, AttributeName, rowindex, 3, 10, false, 70, 0, 1);
                }
                rowindex = rowindex + 1;
            }

            // Writing Additional Attributes that exist in DSD1 but not in DSD2

            rowindex = rowindex + 2;
            this.WriteValueInCell(ReportExcel, "Additional Attributes", rowindex, 1, 14, true, 10, 0, 1);
            WorkbookSheet.Cells[rowindex, 1, rowindex, 2].Merge();
            rowindex = rowindex + 2;
            this.WriteValueInCell(ReportExcel, "S.No.", rowindex, 1, 12, true, 10, 0, 1);
            this.WriteValueInCell(ReportExcel, "ID", rowindex, 2, 12, true, 60, 0, 1);
            this.WriteValueInCell(ReportExcel, "Name", rowindex, 3, 12, true, 70, 0, 1);
            rowindex = rowindex + 1;

            SNo = 0;
            foreach (string AdditionalAttribute in AdditionalDSD1AttributeList)
            {
                SNo = SNo + 1;
                this.WriteValueInCell(ReportExcel, SNo.ToString(), rowindex, 1, 10, false, 10, 0, 1);
                AttributeName = string.Empty;
                AttributeName = GetLanguageBasedConceptNameFromConceptScheme(ConceptsObjDSD1, AdditionalAttribute, hlngcodedb);
                this.WriteValueInCell(ReportExcel, AdditionalAttribute, rowindex, 2, 10, false, 60, 0, 1);
                if (AttributeName != string.Empty)
                {
                    this.WriteValueInCell(ReportExcel, AttributeName, rowindex, 3, 10, false, 70, 0, 1);
                }
                rowindex = rowindex + 1;
            }

        }
        catch (Exception ex)
        {
            Global.CreateExceptionString(ex, null);
            throw ex;

        }
        finally
        {

        }

        return ReportExcel;
    }