public static ExcelTemplateDefinitionPart CreateInstance(ExcelTemplateDefinition excelTemplateDefinition, TemplateDefinitionPartType partType, ExcelInterop.Range firstRange, ExcelInterop.Range lastRange)
        {
            ExcelTemplateDefinitionPartFactory factory = new ExcelTemplateDefinitionPartFactory();

            return(factory.Execute(excelTemplateDefinition, partType, firstRange, lastRange));
        }
        /// <summary> Parse the template. Retrieve its components. </summary>
        private void ParseTemplate(ExcelTemplateDefinition excelTemplateDefinition, ref ExcelInterop.Worksheet worksheet, out ExcelTemplateDefinitionPart header, out ExcelTemplateDefinitionPart body, out ExcelTemplateDefinitionPart footer)
        {
            try
            {
                header = body = footer = null;

                int headerSize;
                int footerSize;
                RetrieveHeaderAndFooterSize(excelTemplateDefinition.DefinitionFirstCell, excelTemplateDefinition.DefinitionLastCell, excelTemplateDefinition.Orientation, out headerSize, out footerSize);

                ExcelInterop.Range firstRange = worksheet.Cells[excelTemplateDefinition.DefinitionFirstCell.Row + 1, excelTemplateDefinition.DefinitionFirstCell.Column + 1];
                ExcelInterop.Range lastRange  = worksheet.Cells[excelTemplateDefinition.DefinitionLastCell.Row, excelTemplateDefinition.DefinitionLastCell.Column - 1];

                int width  = lastRange.Column - firstRange.Column + 1;
                int height = lastRange.Row - firstRange.Row + 1;

                // Header
                /////////
                if (headerSize != 0)
                {
                    ExcelInterop.Range headerLastRange;
                    if (excelTemplateDefinition.Orientation == Etk.BindingTemplates.Definitions.Templates.Orientation.Horizontal)
                    {
                        headerLastRange = worksheet.Cells[firstRange.Row + height - 1, firstRange.Column + headerSize - 1];
                    }
                    else
                    {
                        headerLastRange = worksheet.Cells[firstRange.Row + headerSize - 1, lastRange.Column];
                    }
                    //string name = string.Format("{0}-{1}", excelTemplateDefinition.Name, "Header");
                    header          = ExcelTemplateDefinitionPartFactory.CreateInstance(excelTemplateDefinition, TemplateDefinitionPartType.Header, firstRange, headerLastRange);
                    headerLastRange = null;
                }

                // Footer
                /////////
                if (footerSize != 0)
                {
                    ExcelInterop.Range footerFirstRange;
                    if (excelTemplateDefinition.Orientation == Etk.BindingTemplates.Definitions.Templates.Orientation.Horizontal)
                    {
                        footerFirstRange = worksheet.Cells[lastRange.Row - height + 1, lastRange.Column - footerSize + 1];
                    }
                    else
                    {
                        footerFirstRange = worksheet.Cells[lastRange.Row - footerSize + 1, firstRange.Column];
                    }
                    //string name = string.Format("{0}-{1}", excelTemplateDefinition.Name, "Footer");
                    footer           = ExcelTemplateDefinitionPartFactory.CreateInstance(excelTemplateDefinition, TemplateDefinitionPartType.Footer, footerFirstRange, lastRange);
                    footerFirstRange = null;
                }

                // Body
                ///////
                ExcelInterop.Range bodyFirstRange;
                ExcelInterop.Range bodyLastRange;
                if (excelTemplateDefinition.Orientation == Orientation.Horizontal)
                {
                    bodyFirstRange = worksheet.Cells[firstRange.Row, firstRange.Column + headerSize];
                    bodyLastRange  = worksheet.Cells[lastRange.Row, lastRange.Column - footerSize];
                }
                else
                {
                    bodyFirstRange = worksheet.Cells[firstRange.Row + headerSize, firstRange.Column];
                    bodyLastRange  = worksheet.Cells[lastRange.Row - footerSize, lastRange.Column];
                }

                body           = ExcelTemplateDefinitionPartFactory.CreateInstance(excelTemplateDefinition, TemplateDefinitionPartType.Body, bodyFirstRange, bodyLastRange);
                bodyFirstRange = bodyLastRange = null;
            }
            catch (Exception ex)
            {
                throw new EtkException($"The parsing of template '{excelTemplateDefinition.Name}' in sheet '{worksheet.Name.EmptyIfNull()}' failed: {ex.Message}");
            }
        }