private void SortData(SPTypes SPType)
 {
     try
     {
         // Sort table
         table = table.AsEnumerable().OrderBy(c => c[1]).CopyToDataTable();
         // Search for main components
         DataTable mainTable   = null;
         DataTable commonTable = null;
         if ((SPType == SPTypes.СП) || (SPType == SPTypes.Корпус))
         {
             // Copy table
             commonTable = table.Copy();
             mainTable   = table.Copy();
             // Eliminate tail of factorynumbers
             int    defisIndex = mainComponent.FactoryNumber.ToString().IndexOf("-");
             string factoryNumberClean;
             if (defisIndex > 0)
             {
                 factoryNumberClean = mainComponent.FactoryNumber.ToString().Substring(0, defisIndex);
             }
             else
             {
                 factoryNumberClean = mainComponent.FactoryNumber.ToString();
             }
             for (int i = table.Rows.Count - 1; i >= 0; i--)
             {
                 string partNumber = table.Rows[i]["PartNumber"].ToString();
                 if (partNumber.IndexOf(factoryNumberClean) > 0)
                 {
                     commonTable.Rows.RemoveAt(i);
                 }
                 else
                 {
                     mainTable.Rows.RemoveAt(i);
                 }
             }
             table.Clear();
             // merge tables
             mainTable.Merge(commonTable);
             table = mainTable.Copy();
             // Clear tables
             mainTable   = null;
             commonTable = null;
         }
     }
     catch (Exception ex)
     {
         System.Windows.MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, MessageBoxButton.OK);
     }
 }
        // Create Method
        public void Create(SPTypes SPType)
        {
            try
            {
                // Declare specification component
                Component specComponent = null;

                // Check whether the component exist
                if (!IsComponentExist(SPType, out specComponent))
                {
                    System.Windows.MessageBox.Show("Компонент для данного типа спецификации отсутствует в модели.", "Компонент отсутствует в модели", MessageBoxButton.OK);
                    return;
                }
                // Open Workbook
                Excel.Application excelApp;
                Excel.Workbook    workBook = ExcelClass.OpenExcelWorkBook(FilePath, out excelApp, true);
                // Get appropriate work sheet
                Excel.Worksheet workSheet = GetWorkSheet(workBook, SPType);
                // Get specification header
                string specHeader = GetSpecificationHeader(SPType);
                // Format worksheet columns
                FormatWorkSheet(workSheet, specHeader);
                // Load Data
                table = GetDataTable(specComponent);
                // Refine and Merge table rows
                RefineAndMerge();
                // Sort table
                SortData(SPType);
                // Write data to Excel sheet
                WriteData(workSheet);
                // Match VP and SP data
                MatchData(workSheet, excelApp);

                // Close Excel
                ExcelClass.CloseExcel(workBook, excelApp);
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, MessageBoxButton.OK);
            }
        }
        private string GetSpecificationHeader(SPTypes SPType)
        {
            string header = string.Empty;

            try
            {
                header += mainComponent.Description + " ";
                header += mainComponent.PartNumber;
                header += "\n";
                switch (SPType)
                {
                case SPTypes.СП:
                    header += "Спецификация ";
                    break;

                case SPTypes.ТМ:
                    header += "Спецификация Трубы медные ";
                    break;

                case SPTypes.ТС:
                    header += "Спецификация Трубы стальные ";
                    break;

                case SPTypes.ТП:
                    header += "Спецификация Трубы пластиковые ";
                    break;

                case SPTypes.Корпус:
                    header += "Спецификация Корпус ";
                    break;

                default:
                    break;
                }

                // Check whether Quantity is numeric
                int  quantity;
                bool result = Int32.TryParse(this.Quantity, out quantity);
                // Define factory numbers
                if (result)
                {
                    if (this.Quantity != "1")
                    {
                        // get
                        double factoryNumber;
                        result = Double.TryParse(mainComponent.FactoryNumber, out factoryNumber);
                        if (result)
                        {
                            string lastFactoryNumber = (factoryNumber + quantity).ToString();
                            lastFactoryNumber = lastFactoryNumber.Substring(lastFactoryNumber.Length - 4);
                            header           += "Заводские номера № " + mainComponent.FactoryNumber +
                                                "–" + lastFactoryNumber;
                        }
                        else
                        {
                            header += "Заводской номер № " + mainComponent.FactoryNumber;
                        }
                    }
                    else
                    {
                        header += "Заводской номер № " + mainComponent.FactoryNumber;
                    }
                }
                else
                {
                    header += "Заводской номер № " + mainComponent.FactoryNumber;
                }
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, MessageBoxButton.OK);
            }
            return(header);
        }
        private Excel.Worksheet GetWorkSheet(Excel.Workbook workBook, SPTypes SPType)
        {
            Excel.Worksheet workSheet = null;
            try
            {
                string workSheetName = string.Empty;
                switch (SPType)
                {
                case SPTypes.СП:
                    workSheetName = "Спецификация";
                    break;

                case SPTypes.ТМ:
                    workSheetName = "Спецификация-медь";
                    break;

                case SPTypes.ТС:
                    workSheetName = "Спецификация-сталь";
                    break;

                case SPTypes.ТП:
                    workSheetName = "Спецификация-пластик";
                    break;

                case SPTypes.Корпус:
                    workSheetName = "Спецификация-корпус";
                    break;

                default:
                    break;
                }
                if (workSheetName != string.Empty)
                {
                    foreach (Excel.Worksheet workSheet2 in workBook.Sheets)
                    {
                        if (workSheet2.Name == workSheetName)
                        {
                            workSheet = workSheet2;
                        }
                    }
                    // Check whether the sheet exist
                    if (workSheet == null)
                    {
                        // Create new sheet
                        workSheet = workBook.ActiveSheet;
                        if (workSheet.Name != "Лист1")
                        {
                            // Add new sheet
                            workSheet = workBook.Sheets.Add();
                        }
                        // Rename sheet
                        workSheet.Name = workSheetName;
                    }
                }
                else
                {
                    return(null);
                }
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, MessageBoxButton.OK);
            }
            return(workSheet);
        }
        private bool IsComponentExist(SPTypes SPType, out Component component)
        {
            component = null;
            try
            {
                bool ok = false;
                switch (SPType)
                {
                case SPTypes.СП:
                    component = mainComponent;
                    ok        = true;
                    break;

                case SPTypes.ТМ:
                    foreach (Component subComponent in mainComponent.Components)
                    {
                        if (subComponent.AssemblyType == AssemblyTypes.ТМ)
                        {
                            component = subComponent;
                            ok        = true;
                        }
                    }
                    break;

                case SPTypes.ТС:
                    foreach (Component subComponent in mainComponent.Components)
                    {
                        if (subComponent.AssemblyType == AssemblyTypes.ТС)
                        {
                            component = subComponent;
                            ok        = true;
                        }
                    }
                    break;

                case SPTypes.ТП:
                    foreach (Component subComponent in mainComponent.Components)
                    {
                        if (subComponent.AssemblyType == AssemblyTypes.ТП)
                        {
                            component = subComponent;
                            ok        = true;
                        }
                    }
                    break;

                case SPTypes.Корпус:
                    foreach (Component subComponent in mainComponent.Components)
                    {
                        if (subComponent.AssemblyType == AssemblyTypes.Casing)
                        {
                            component = subComponent;
                            ok        = true;
                        }
                    }
                    break;

                default:
                    break;
                }
                return(ok);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, MessageBoxButton.OK);
                return(false);
            }
        }