Example #1
0
        private void Window_ContentRendered(object sender, EventArgs e)
        {
            Results = new List <ResultParameter>();
            CalculateTimeValues(DAMFiles[0]); //Elég a legelső DAM fájlt megvizsgálni ezekhez az adatokhoz, mert a többinek pontosan ugyan azokat az időpontokat kell tartalmaznia. Ha mégse, azt a betöltés kiszűri.
            TimeValues.NumberOfDaysAndNumberOfRowsInADay(DAMFiles[0]);
            TimeValues.LastRowOfDays  = TimeValues.WholeHourRow + (TimeValues.NumberOfRowsInADay * TimeValues.NumberOfDays);
            TimeValues.LastRowOfHours = TimeValues.WholeHourRow + (TimeValues.NumberOfRowsInAnHour * TimeValues.NumberOfHours);
            Parameters.Run(Results, DAMFiles);

            //Az OFD azért kell, hogy csak akkor nyissa meg az excelt, ha a program már nem használja.
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.FileName = FilesExportImport.WriteToExcel(Results);
            if (ofd.FileName != "")
            {
                bool fileClosed = false;
                while (!fileClosed) //Addig vár, míg a program nem használja már az excelt
                {
                    try
                    {
                        ofd.OpenFile();              //Megnézi, hogy be van-e már zárva a program által
                        Process.Start(ofd.FileName); //Ha nem dob exceptiont, akkor igen és megnyitja az excelt
                        fileClosed = true;           //Nem ismétli meg többet a ciklust
                    }
                    catch
                    { }
                }
            }
            Application.Current.Shutdown(); //Bezárja a programot magát
        }
        public static string WriteToExcel(List <ResultParameter> Results)
        {
            List <Task> taskList = new List <Task>();                      //Lista a taskokhoz

            Excel.Application excelFile = new Excel.Application();         //Létrejön az Excel fájl
            Excel.Workbook    workbook  = excelFile.Workbooks.Add();       //Ebben vannak a worksheet-ek

            List <Excel.Worksheet> wsheets = new List <Excel.Worksheet>(); //Lista a worksheet-ekhez, azért kell, hogy mikor hozzáadom a worksheeteket a dokumentumhoz, akkor le is legyenek mentve, hogy később lehessen címezni és ezáltal szerkeszteni mindet

            for (int i = 0; i < Results.Count; i++)                        //Feltölti a worksheetek listáját elemekkel. Annyi worksheet lesz mindig, ahány paraméter
            {
                if (i == 0)
                {
                    wsheets.Add(workbook.ActiveSheet); //A legelső elemnél a már meglévő üres worksheet-et lehet felhasználni
                }
                else
                {
                    wsheets.Add(excelFile.Worksheets.Add()); //Nem az első elemnél mindig hozzáadja az újat és ezt az újat tárolja el a listában
                }
            }

            foreach (ResultParameter rp in Results) //Végigmegy a végeredmény paramétereken
            {
                taskList.Add(new Task(() =>         //Minden task megkap egy oldalt, amit fel kell tölteniük az adatokkal.
                {
                    //wsheets[Results.IndexOf(rp)] - Ez azt jelenti, hogy az az elem, amelyikkel éppen dolgozik a Results-ból, ugyan azt az elemet kell nézni a worksheetek között is. Mindig pontos megegyezés lesz a paraméterek és a worksheetek között, ezért ez mindig működik.
                    wsheets[Results.IndexOf(rp)].Name = rp.Name;                                                               //Mindig az aktuális paraméter lesz a worksheet neve

                    int groupsAdditionalRows = 4;                                                                              //Minden új csoporttal hozzá kell adni az előző csoportban lévő sorok számát, plusz 2-t, hogy a következő csoport annyival lejjebb legyen
                                                                                                                               // Az Excel 1,1-től indexel, viszont az első sor a paraméter neve és mértékegysége lesz. Ez azt jelenti hogy a harmadik sortól lesz releváns, mert kihagyunk egy plusz helyet. Egyszerűbb egyszer változó - 2-t írni.

                    if (rp.Groups[0].ResultsForFlies[0].Length == TimeValues.NumberOfDays)                                     //Ha az eredmények száma annyi, mint a napok száma, akkor óra paramétereket kell kiírni épp.
                    {
                        wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 3, "A"]           = rp.Name + " " + rp.Unit; //A paraméter neve és mértékegysége az első sor
                        wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 3, "A"].Font.Bold = true;                    //Vastag szöveg
                        wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 2, "A"]           = TimeValues.FirstDayDate; //A paraméter neve és mértékegysége az első sor
                        wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 2, "A"].Font.Bold = true;                    //Vastag szöveg
                    }
                    else if (rp.Groups[0].ResultsForFlies[0].Length == TimeValues.NumberOfHours)                               //Ha az eredmények száma annyi, mint az órák száma, akkor óra paramétereket kell kiírni épp.
                    {
                        groupsAdditionalRows = 5;
                        wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 4, "A"]           = rp.Name + " " + rp.Unit; //A paraméter neve és mértékegysége az első sor
                        wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 4, "A"].Font.Bold = true;                    //Vastag szöveg
                    }

                    for (int j = 0; j < rp.Groups.Count; j++) //A csoportokon megy végig, köztük annyi sort hagy, amennyi a NumberOfThisGroup + 2 hogy legyen köztük hézag
                    {
                        if (rp.Groups[j].ResultsForFlies[0].Length == TimeValues.NumberOfHours)
                        {
                            wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 2, "A"]           = "Hour - ";
                            wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 2, "A"].Font.Bold = true; //Vastag szöveg
                            wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 1, "A"]           = "Time - ";
                            wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 1, "A"].Font.Bold = true; //Vastag szöveg
                        }

                        wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows, "A"]           = "Group: " + rp.Groups[j].GetName(); //A csoport neve
                        wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows, "A"].Font.Bold = true;                               //Vastag szöveg

                        if (rp.Groups[j].ResultsForFlies[0].Length == TimeValues.NumberOfDays)
                        {
                            for (int columnHeaders = 0; columnHeaders < rp.Groups[j].ResultsForFlies[0].Length; columnHeaders++)
                            { //Akár nap, vagy óra alapú a végeredmény, az oszlopokat annak megfelelően kiírja
                                wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows, columnHeaders + 2]           = "Day " + (columnHeaders + 1);
                                wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows, columnHeaders + 2].Font.Bold = true;
                            } //A +2 az excelben való indexeléshez kell. Az első elem a csoport neve és 1-től indexel az Excel
                        }
                        else if (rp.Groups[j].ResultsForFlies[0].Length == TimeValues.NumberOfHours)
                        {
                            for (int columnHeaders = 0; columnHeaders < rp.Groups[j].ResultsForFlies[0].Length; columnHeaders++)
                            { //Akár nap, vagy óra alapú a végeredmény, az oszlopokat annak megfelelően kiírja
                                wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 2, columnHeaders + 2]           = (columnHeaders + 1).ToString();
                                wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 2, columnHeaders + 2].Font.Bold = true;
                                wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 1, columnHeaders + 2]           = TimeValues.ExactHourValueForHours[columnHeaders] + ":00:00";
                                wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows - 1, columnHeaders + 2].Font.Bold = true;
                                wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows, columnHeaders + 2]           = TimeValues.GetIndexOfDarkLightValuesForHours(columnHeaders);
                                wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows, columnHeaders + 2].Font.Bold = true;
                            } //A +2 az excelben való indexeléshez kell. Az első elem a csoport neve és 1-től indexel az Excel
                        }

                        int rowsInCaseOfExcludeDead = 0; //Ahhoz, hogy ugyan azt a sort felül tudja írni a rendszer, mikor az Exclude Dead érvényesül, ahhoz kell egy második szám, ami nem a ciklusért felel, de meghatározza a sorokat, ahova ír a program.
                        for (int rows = 0; rows < rp.Groups[j].ResultsForFlies.Count; rows++)
                        {
                            for (int columns = -1; columns < rp.Groups[j].ResultsForFlies[rows].Length; columns++) //-1-ről indul, mert az mutatja, hogy a legelső oszlopot tölti épp fel és az indexelés így lesz jó a +2-vel később
                            {
                                if (columns == -1)
                                {
                                    wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows + 1 + rowsInCaseOfExcludeDead, "A"]           = rp.Groups[j].GetName() + (rows + 1);
                                    wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows + 1 + rowsInCaseOfExcludeDead, "A"].Font.Bold = true;
                                }
                                else
                                {
                                    if (rp.Groups[j].ResultsForFlies[rows][columns] == "DEAD" && ExperimentSettingsValues.ExcludeDead)
                                    {                                                                       //Ha Exclude Dead mellett halott muslicát talál, akkor azt a sort semmiképp ne írja be az excel-be. Eddig az első találatot mindig beírta.
                                        for (int deleteCells = columns + 1; deleteCells > 0; deleteCells--) //Visszamenőlegesen kitörli az eddig beírt mezőket a halott muslica csoportjának sorába
                                        {
                                            wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows + 1 + rowsInCaseOfExcludeDead, deleteCells] = "";
                                        }
                                        rowsInCaseOfExcludeDead--;
                                        break;
                                    }

                                    wsheets[Results.IndexOf(rp)].Cells[groupsAdditionalRows + 1 + rowsInCaseOfExcludeDead, columns + 2] = rp.Groups[j].ResultsForFlies[rows][columns];
                                }
                            }
                            rowsInCaseOfExcludeDead++;
                        }

                        if (rp.Groups[j].ResultsForFlies[0].Length == TimeValues.NumberOfDays)
                        {
                            groupsAdditionalRows += rp.Groups[j].NumberOfThisGroup + 4; //Ez a növelés jelöli ki a következő sort, ahova a következő csoport beírása kerül majd.
                        }
                        else if (rp.Groups[j].ResultsForFlies[0].Length == TimeValues.NumberOfHours)
                        {
                            groupsAdditionalRows += rp.Groups[j].NumberOfThisGroup + 6; //Ez a növelés jelöli ki a következő sort, ahova a következő csoport beírása kerül majd.
                        }
                    }
                }, TaskCreationOptions.LongRunning));
            }

            foreach (Task t in taskList) //A taskok futtatása egyenként
            {
                t.Start();
            }

            Task.WaitAll(taskList.ToArray()); //Task-ok bevárása

            SaveFileDialog sfd = new SaveFileDialog();

            sfd.Filter = "Excel files (*.xlsx)|*.xlsx|All files (*.*)|*.*";
            if (sfd.ShowDialog() == true)
            {
                try
                {
                    workbook.SaveAs(sfd.FileName);
                }
                catch
                {
                    workbook.Saved = true;
                    sfd.FileName   = "";
                }
            }
            else
            {
                workbook.Saved = true; //Azért kell, hogy ne kérdezzen rá az excel bezárásánál, hogy akarod-e menteni a munkalapot
                sfd.FileName   = "";
            }
            excelFile.Quit();

            return(sfd.FileName);
        }
Example #3
0
        private string[][] ErrorDataChecking(string[][] loadedDAMValues) //A 4. oszlopban a DAM fájlban ha nem 1-es szerepel, az hiba
        {                                                                //Ha egyszer megy végig a DAM-on, az hatékonyabb, szóval itt nézi a dátumot is. Az idő túlságosan random értékeket vehet fel, ezért az nem jó minta felismeréshez és ezáltal a DAM fájl ellenőrzéséhez
            string[] date     = new string[3];                           //A dátum és idő mindig 3 mezőt tartalmaz
            string[] time     = new string[3];                           //Egy bizonyos hibatűréssel lehet vizsgálni az időt is. Ha nagyobb az eltérés, mint 1 óra, akkor meg kell nézni, hogy a napok megváltoztak-e.
            string[] prevDate = date;
            string[] prevTime = time;

            for (int i = 0; i < loadedDAMValues.Length; i++)
            {
                date = loadedDAMValues[i][1].Split(' '); //Ez tartalmazza az aktuális sor dátumát, ami mindig 3 értékből áll (nap, hó, év)
                time = loadedDAMValues[i][2].Split(':'); //Ez tartalmazza az aktuális sor idejét, ami mindig 3 értékből áll (óra, perc, másodperc)
                if (i > 0)                               //Az első körben nem vizsgálja, hogy a prevDate is kaphassonon értéket, így tudja onnantól összehasonlítani az elemeket
                {
                    if (date[2] == prevDate[2])          //Megegyezik az évszám
                    {
                        if (date[1] == prevDate[1])      //Megegyezik a hónap
                        {
                            if (date[0] == prevDate[0])
                            {
                                if ((int.Parse(time[0]) - int.Parse(prevTime[0])) > 2 || (int.Parse(time[0]) - int.Parse(prevTime[0])) < 0) //2 óránál nagyobb eltérés a sorok között hibát eredményez
                                {
                                    ErrorMessageForDateChecking();
                                    return(null);
                                }
                            }
                            else if ((int.Parse(date[0]) - int.Parse(prevDate[0])) > 1 || (int.Parse(date[0]) - int.Parse(prevDate[0])) < 0) //Ha több mint 1 nap eltérés van, hibát eredményez
                            {
                                ErrorMessageForDateChecking();
                                return(null);
                            }
                        }
                        else
                        {
                            int indexOfDate     = TimeValues.IndexOfMonth(date[1]);
                            int indexOfPrevDate = TimeValues.IndexOfMonth(prevDate[1]);
                            if (indexOfDate == -1 || indexOfDate == -1 || (indexOfDate - indexOfPrevDate > 1 || indexOfDate - indexOfPrevDate < 0)) //Ha normális hónapok vannak megadva és a különbségük több, mint 1 hónap, akkor hibaüzenet
                            {
                                ErrorMessageForDateChecking();
                                return(null);
                            }
                        }
                    }
                    else if ((int.Parse(date[2]) - int.Parse(prevDate[2])) > 1 || (int.Parse(date[2]) - int.Parse(prevDate[2])) < 0) //Ha több, mint 1 év a különbség, akkor hibaüzenet
                    {
                        ErrorMessageForDateChecking();
                        return(null);
                    }
                }
                prevTime = time;
                prevDate = date;


                if (loadedDAMValues[i][3] != "1") //Az 1-es szám vizsgálatához a 4. oszlopban
                {
                    if (MessageBox.Show("An error was found in the DAM file!\nRow " + (i + 1) + " and column 4." + "\nDo you want to import the DAM file without the data from this row?", "Wrong input data", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
                    {
                        loadedDAMValues[i][0] = "-1";
                    }
                    else
                    {
                        return(null);
                    }
                }
            }
            return(loadedDAMValues);
        }