private void Generate_Click(object sender, RoutedEventArgs e)
        {
            List <string> NCProg_Tools = new List <string>();

            Microsoft.Office.Interop.Excel.Application oXL;
            _Workbook  oWB;
            _Worksheet oSheetProjectSummary     = null;
            _Worksheet oSheetProjectSummaryFull = null;
            _Worksheet oSheetNCProgSummary      = null;
            _Worksheet oSheetNewNCProgSummary   = null;
            _Worksheet oSheetToolpathDetails    = null;
            _Worksheet oSheetToolList           = null;
            _Worksheet oSheetNewToolList        = null;
            Dictionary <string, string> VarsListProjectSummary     = new Dictionary <string, string>();
            Dictionary <string, string> VarsListProjectSummaryFull = new Dictionary <string, string>();
            Dictionary <string, string> VarsListNCProgSummary      = new Dictionary <string, string>();
            Dictionary <string, string> VarsListToolpathDetails    = new Dictionary <string, string>();
            Dictionary <string, string> VarsListToolList           = new Dictionary <string, string>();
            bool   Has_ProjectSummary     = false;
            bool   Has_ProjectSummaryFull = false;
            bool   Has_NCProgSummary      = false;
            bool   Has_ToolList           = false;
            bool   Has_ToolpathDetails    = false;
            string Project_Path           = PowerMILLAutomation.ExecuteEx("print $project_pathname(0)");
            string NCProgDetails          = "";
            string MergedModelList        = "";
            int    FileQty = 0;

            if (listNCProgsSelected.Items.Count == 0)
            {
                //No NC Program selected, do nothing...
                MessageBox.Show("Please select at least one NC Program");
            }
            else
            {
                List <ToolInfo>     ToolData            = new List <ToolInfo>();
                List <ToolpathInfo> ToolpathData        = new List <ToolpathInfo>();
                List <ToolInfo>     ProjectToolData     = new List <ToolInfo>();
                List <ToolpathInfo> ProjectToolpathData = new List <ToolpathInfo>();
                ProjectInfo         Project             = new ProjectInfo();

                //Start Excel and get Application object.

                oXL               = new Microsoft.Office.Interop.Excel.Application();
                oXL.Visible       = true;
                oXL.DisplayAlerts = false;

                //Get the template from the option page
                string Path         = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\ExcellSetupSheet\\Template.ini";
                string TemplateFile = "";
                if (File.Exists(Path))
                {
                    const Int32 BufferSize = 128;
                    using (var fileStream = File.OpenRead(Path))
                        using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize))
                        {
                            String line;
                            while ((line = streamReader.ReadLine()) != null)
                            {
                                TemplateFile = line;
                            }
                        }
                }
                else
                {
                    Path = System.Reflection.Assembly.GetExecutingAssembly().CodeBase.Substring(8, System.Reflection.Assembly.GetExecutingAssembly().CodeBase.Length - 8);
                    string directory = System.IO.Path.GetDirectoryName(Path);
                    TemplateFile = directory + "\\Tool_List.xlsx";
                }

                if (!Directory.Exists(Project_Path + "\\Excel_Setupsheet\\"))
                {
                    Directory.CreateDirectory(Project_Path + "\\Excel_Setupsheet\\");
                }

                string[] fileArrayXLSX = Directory.GetFiles(Project_Path + "\\Excel_Setupsheet\\", "*.xlsx");
                string[] fileArrayXLS  = Directory.GetFiles(Project_Path + "\\Excel_Setupsheet\\", "*.xls");
                foreach (string File in fileArrayXLSX)
                {
                    if (File.IndexOf("~$") < 0)
                    {
                        FileQty = FileQty + 1;
                    }
                }

                foreach (string File in fileArrayXLS)
                {
                    if (File.IndexOf("~$") < 0)
                    {
                        FileQty = FileQty + 1;
                    }
                }

                if (FileQty > 0)
                {
                    File.Copy(TemplateFile, Project_Path + "\\Excel_Setupsheet\\SetupSheet_" + FileQty + ".xlsx");
                    TemplateFile = Project_Path + "\\Excel_Setupsheet\\SetupSheet_" + FileQty + ".xlsx";
                }
                else
                {
                    File.Copy(TemplateFile, Project_Path + "\\Excel_Setupsheet\\SetupSheet.xlsx");
                    TemplateFile = Project_Path + "\\Excel_Setupsheet\\SetupSheet.xlsx";
                }


                //Get a new workbook.
                oWB = (_Workbook)(oXL.Workbooks.Open(TemplateFile));

                List <string> ModelList = PowerMILLAutomation.GetListOf(PowerMILLAutomation.enumEntity.MachinableModels);
                PowerMILLAutomation.GetModelsLimits(ModelList, out double ModelsMinX, out double ModelsMinY, out double ModelsMinZ, out double ModelsMaxX, out double ModelsMaxY, out double ModelsMaxZ);

                Project = new ProjectInfo();
                Project.MachModelsMaxX = ModelsMaxX.ToString();
                Project.MachModelsMaxY = ModelsMaxY.ToString();
                Project.MachModelsMaxZ = ModelsMaxZ.ToString();
                Project.MachModelsMinX = ModelsMinX.ToString();
                Project.MachModelsMinY = ModelsMinY.ToString();
                Project.MachModelsMinZ = ModelsMinZ.ToString();
                Project.Name           = PowerMILLAutomation.ExecuteEx("print $project_pathname(1)");
                Project.Path           = PowerMILLAutomation.ExecuteEx("print $project_pathname(0)");
                Project.OrderNumber    = PowerMILLAutomation.ExecuteEx("print $project.orderNumber");
                Project.Programmer     = PowerMILLAutomation.ExecuteEx("print $project.programmer");
                Project.PartName       = PowerMILLAutomation.ExecuteEx("print $project.partname");
                Project.Customer       = PowerMILLAutomation.ExecuteEx("print $project.customer");
                Project.Date           = DateTime.Now.ToString();
                Project.Notes          = PowerMILLAutomation.ExecuteEx("print $project.notes");
                Project.ExcelTemplate  = TemplateFile;
                foreach (string Model in ModelList)
                {
                    MergedModelList = MergedModelList + Environment.NewLine + Model;
                }
                Project.ModelsList       = MergedModelList;
                Project.CombinedNCTPList = "";

                foreach (Worksheet worksheet in oWB.Worksheets)
                {
                    if (worksheet.Name == "Project_Summary")
                    {
                        oSheetProjectSummary = worksheet;
                        //Extract template keywords and cell adresses
                        VarsListProjectSummary = WriteFiles.ExtractTemplateData(oSheetProjectSummary);
                        Has_ProjectSummary     = true;
                    }
                    else if (worksheet.Name == "Project_Summary_Full")
                    {
                        oSheetProjectSummaryFull = worksheet;
                        //Extract template keywords and cell adresses
                        VarsListProjectSummaryFull = WriteFiles.ExtractTemplateData(oSheetProjectSummaryFull);
                        Has_ProjectSummaryFull     = true;
                    }
                    else if (worksheet.Name == "NCProg_Summary")
                    {
                        oSheetNCProgSummary = worksheet;
                        //Extract template keywords and cell adresses
                        VarsListNCProgSummary = WriteFiles.ExtractTemplateData(oSheetNCProgSummary);
                        Has_NCProgSummary     = true;
                    }
                    else if (worksheet.Name == "Toolpath_Details")
                    {
                        oSheetToolpathDetails = worksheet;
                        //Extract template keywords and cell adresses
                        VarsListToolpathDetails = WriteFiles.ExtractTemplateData(oSheetToolpathDetails);
                        Has_ToolpathDetails     = true;
                    }
                    else if (worksheet.Name == "ToolList")
                    {
                        oSheetToolList = worksheet;
                        //Extract template keywords and cell adresses
                        VarsListToolList = WriteFiles.ExtractTemplateData(oSheetToolList);
                        Has_ToolList     = true;
                    }
                }


                List <string> NCProg_Toolpaths = new List <string>();
                foreach (String NCProg in listNCProgsSelected.Items)
                {
                    if (NCProgDetails == "")
                    {
                        NCProgDetails = NCProg;
                    }
                    else
                    {
                        NCProgDetails = NCProgDetails + Environment.NewLine + NCProg;
                    }
                    NCProg_Toolpaths = PowerMILLAutomation.GetNCProgToolpathes(NCProg);
                    foreach (string Toolpath in NCProg_Toolpaths)
                    {
                        NCProgDetails = NCProgDetails + Environment.NewLine + "    " + Toolpath;
                    }
                    Project.TotalTime = Project.TotalTime + double.Parse(PowerMILLAutomation.ExecuteEx("print $entity('ncprogram';'" + NCProg + "').Statistics.TotalTime"));

                    //Extract the PowerMILL parameters found in the template from the current NCProgram toolapths
                    WriteFiles.ExtractData(NCProg, out ToolData, out ToolpathData);

                    if (Has_ProjectSummaryFull)
                    {
                        foreach (ToolpathInfo Toolpath in ToolpathData)
                        {
                            ProjectToolpathData.Add(new ToolpathInfo
                            {
                                Name               = Toolpath.Name,
                                Description        = Toolpath.Description,
                                Notes              = Toolpath.Notes,
                                ToolName           = Toolpath.ToolName,
                                ToolNumber         = Toolpath.ToolNumber,
                                ToolDiameter       = Toolpath.ToolDiameter,
                                ToolType           = Toolpath.ToolType,
                                ToolCutterLength   = Toolpath.ToolCutterLength,
                                ToolHolderName     = Toolpath.ToolHolderName,
                                ToolOverhang       = Toolpath.ToolOverhang,
                                ToolNumberOfFlutes = Toolpath.ToolNumberOfFlutes,
                                ToolLengthOffset   = Toolpath.ToolLengthOffset,
                                ToolRadOffset      = Toolpath.ToolRadOffset,
                                ToolpathType       = Toolpath.ToolpathType,
                                ToolTipRadius      = Toolpath.ToolTipRadius,
                                ToolDescription    = Toolpath.ToolDescription,
                                Thickness          = Toolpath.Thickness,
                                AxialThickness     = Toolpath.AxialThickness,
                                CutterComp         = Toolpath.CutterComp,
                                Feed               = Toolpath.Feed,
                                Speed              = Toolpath.Speed,
                                IPT               = Toolpath.IPT,
                                SFM               = Toolpath.SFM,
                                PlungeFeed        = Toolpath.PlungeFeed,
                                SkimFeed          = Toolpath.SkimFeed,
                                Coolant           = Toolpath.Coolant,
                                Stepover          = Toolpath.Stepover,
                                DOC               = Toolpath.DOC,
                                GeneralAxisType   = Toolpath.GeneralAxisType,
                                Statistic_Time    = Toolpath.Statistic_Time,
                                TPWorkplane       = Toolpath.TPWorkplane,
                                Tolerance         = Toolpath.Tolerance,
                                RapidHeight       = Toolpath.RapidHeight,
                                SkimHeight        = Toolpath.SkimFeed,
                                ToolpathMinX      = Toolpath.ToolpathMinX,
                                ToolpathMinY      = Toolpath.ToolpathMinY,
                                ToolpathMinZ      = Toolpath.ToolpathMinZ,
                                ToolpathMaxX      = Toolpath.ToolpathMaxX,
                                ToolpathMaxY      = Toolpath.ToolpathMaxY,
                                ToolpathMaxZ      = Toolpath.ToolpathMaxZ,
                                FirstLeadInType   = Toolpath.FirstLeadInType,
                                SecondLeadInType  = Toolpath.SecondLeadInType,
                                FirstLeadOutType  = Toolpath.FirstLeadOutType,
                                SecondLeadOutType = Toolpath.SecondLeadOutType,
                                CuttingDistance   = Toolpath.CuttingDistance,
                                NCProgName        = NCProg
                            });
                        }
                    }

                    if (Has_NCProgSummary)
                    {
                        //Write the Excel document
                        int Index = oSheetNCProgSummary.Index;
                        oSheetNCProgSummary.Copy(oSheetNCProgSummary, Type.Missing);

                        if (NCProg.Length > 31)
                        {
                            oWB.Sheets[Index].Name = NCProg.Replace("*", "").Substring(0, 30);
                        }
                        else
                        {
                            oWB.Sheets[Index].Name = NCProg;
                        }
                        oSheetNewNCProgSummary = oWB.Sheets[Index];

                        if (Has_ToolpathDetails)
                        {
                            WriteFiles.CreateExcelFile(NCProg, ToolpathData, ToolData, Project, oSheetNewNCProgSummary, VarsListNCProgSummary, oWB, true, Project_Path, oSheetNewNCProgSummary, NCProgDetails);
                        }
                        else
                        {
                            WriteFiles.CreateExcelFile(NCProg, ToolpathData, ToolData, Project, oSheetNewNCProgSummary, VarsListNCProgSummary, oWB, false, Project_Path, oSheetNewNCProgSummary, NCProgDetails);
                        }
                    }
                    if (Has_ToolpathDetails)
                    {
                        //Write the Excel document
                        WriteFiles.CreateExcelFile(NCProg, ToolpathData, ToolData, Project, oSheetToolpathDetails, VarsListToolpathDetails, oWB, false, Project_Path, oSheetNewNCProgSummary, NCProgDetails);
                    }
                    if (Has_ToolList)
                    {
                        //Write the Excel document
                        int Index = oSheetToolList.Index;
                        oSheetToolList.Copy(oSheetToolList, Type.Missing);
                        if (NCProg.Length > 25)
                        {
                            oWB.Sheets[Index].Name = NCProg.Replace("*", "").Substring(0, 24) + "-Tools";
                        }
                        else
                        {
                            oWB.Sheets[Index].Name = NCProg + "-Tools";
                        }
                        oWB.Sheets[Index].Name = NCProg + "-Tools";
                        oSheetNewToolList      = oWB.Sheets[Index];

                        WriteFiles.CreateExcelFile(NCProg, ToolpathData, ToolData, Project, oSheetNewToolList, VarsListToolList, oWB, false, Project_Path, oSheetNewNCProgSummary, NCProgDetails);
                    }
                }
                Project.CombinedNCTPList = NCProgDetails;
                if (Has_ProjectSummary)
                {
                    WriteFiles.CreateExcelFile("None", ToolpathData, ToolData, Project, oSheetProjectSummary, VarsListProjectSummary, oWB, true, Project_Path, oSheetProjectSummary, NCProgDetails);
                }
                if (Has_ProjectSummaryFull)
                {
                    WriteFiles.CreateExcelFile("None", ProjectToolpathData, ToolData, Project, oSheetProjectSummaryFull, VarsListProjectSummaryFull, oWB, true, Project_Path, oSheetProjectSummaryFull, NCProgDetails);
                }

                if (Has_NCProgSummary)
                {
                    oSheetNCProgSummary.Delete();
                }
                if (Has_ToolpathDetails)
                {
                    oSheetToolpathDetails.Delete();
                }
                if (Has_ToolList)
                {
                    oSheetToolList.Delete();
                }
                oXL.DisplayAlerts = true;
                oWB.Sheets[1].Activate();
                oWB.Save();
                MessageBox.Show("SetupSheet exported successfully");
            }
        }