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); }
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); }