private void importDataMenuItem_Click(object sender, EventArgs e) { OpenFileDialog importDataDialog = new OpenFileDialog(); importDataDialog.Filter = "Файл Excel (*.xlsx)|*.xlsx"; importDataDialog.ShowDialog(); string fileName = importDataDialog.FileName; if (string.IsNullOrWhiteSpace(fileName)) { return; } this.Enabled = false; metersList = GetDataFromExelFile(fileName, false); metersList.IsInitialized = true; dataGridView1.DataSource = metersList; ShowCoeffs(metersList.First()); NotificationHelper.ShowInfo("Данні успішно завантажені"); this.Enabled = true; }
private void saveSettingsButton_Click(object sender, EventArgs e) { if (metersList[0].GeneralCoefficient.NE(100.0)) { NotificationHelper.ShowError("Загальна сумма коефіцієнтів по закладам повинна бути рівна 100"); return; } if (CalculateCoeffsSum().NE(100.0)) { NotificationHelper.ShowError("Сумма коефіцієнтів повинная бути рівна 100"); return; } if (dataGridView1.SelectedCells.Count == 0 || ((dataGridView1.SelectedCells != null) && (dataGridView1.SelectedCells[0].RowIndex == 0))) { if (NotificationHelper.AskYesNo("Ви впевнені, що хочете встановити ці коефіцієнти для всіх ЛПЗ?") == System.Windows.Forms.DialogResult.Yes) { double[] coeffs = new double[12]; for (int i = 1; i <= 12; i++) { coeffs[i - 1] = Convert.ToDouble(Controls.Find("monthLimit" + i, true).First().Text); } WaitForm wf = new WaitForm(this); wf.Show(); wf.Refresh(); Enabled = false; try { metersList.SetDefaultCoeffs(coeffs); } catch (Exception ex) { NotificationHelper.ShowError(ex.Message); } finally { wf.Close(); Enabled = true; } } } else { if (NotificationHelper.AskYesNo( string.Format("Встановити данні коефіцієнти для {0}", metersList[dataGridView1.SelectedCells[0].RowIndex].Name) ) == System.Windows.Forms.DialogResult.Yes) { double[] coeffs = new double[12]; for (int i = 1; i <= 12; i++) { coeffs[i - 1] = Convert.ToDouble(Controls.Find("monthLimit" + i, true).First().Text); } metersList[dataGridView1.SelectedCells[0].RowIndex].MonthsCoefficients = coeffs; } } }
private void WriteLimitsToExcelFile() { try { metersList.SetSum(CalculateVolume()); } catch (Exception ex) { NotificationHelper.ShowError(ex.Message); return; } HeavyProcessProgressForm hpForm = new HeavyProcessProgressForm(this); hpForm.Show(); Enabled = false; Excel.Application xlApp = new Excel.Application(); if (xlApp == null) { NotificationHelper.ShowError("Помилка при завантаженні Excel."); Environment.Exit(0); } hpForm.ChangeProgress(null, 2); Excel.Workbook wb = xlApp.Workbooks.Open(System.IO.Path.Combine(getApplicationDirectory(), TEMPLATES_DIRECTORY_NAME, TEMPLATES_FILE_NAME)); if (wb == null) { xlApp.Quit(); xlApp = null; NotificationHelper.ShowError("Помилка при завантаженні файлу шаблону."); Environment.Exit(0); } hpForm.ChangeProgress(null, 2); Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1]; if (ws == null) { wb.Close(0); xlApp.Quit(); xlApp = null; NotificationHelper.ShowError("Помилка при завантаженні файлу шаблону."); Environment.Exit(0); } hpForm.ChangeProgress(null, 2); int progrStep = (int)Math.Floor((double)(hpForm.ProgressRest / (metersList.Count() - 1))); try { // Массив итогов по месяцам double[] monthTotals = new double[12]; // Массив итогов по кварталам double[] quartalsLimits = new double[QUARTER_LETTERS.Length]; // Общая мощность double totalPower = 0.0; // Итог по году double yearTotal = 0.0; for (int i = 1; i < metersList.Count; i++) { hpForm.ChangeProgress(string.Format("Заповнюємо ліміти по '{0}'...", metersList[i].Name), progrStep); ws.get_Range(POWER_COLUMN_LETTER + (NAME_COLUMN_INDEX + (i - 1))).Value = metersList[i].ConnectedPower; totalPower += metersList[i].ConnectedPower; ws.get_Range(POWER_COLUMN_LETTER + YEAR_BEGIN_INDEX).Value = Math.Round(totalPower, EnergyMeter.LIMIT_PRECISION); // Заполняем лимиты по месяцам for (int j = 0; j < metersList[i].MonthsLimits.Length; j++) { ws.get_Range(MONTHS_LETTERS[j] + (NAME_COLUMN_INDEX + (i - 1))).Value = metersList[i].MonthsLimits[j]; monthTotals[j] += metersList[i].MonthsLimits[j]; ws.get_Range(MONTHS_LETTERS[j] + YEAR_BEGIN_INDEX).Value = Math.Round(monthTotals[j], EnergyMeter.LIMIT_PRECISION); } // Вычисляем и заполняем значения за кварталы for (int j = 0; j < QUARTER_LETTERS.Length; j++) { double quartalValue = Math.Round((metersList[i].MonthsLimits[0 + (3 * j)] + metersList[i].MonthsLimits[1 + (3 * j)] + metersList[i].MonthsLimits[2 + (3 * j)]) , EnergyMeter.LIMIT_PRECISION); ws.get_Range(QUARTER_LETTERS[j] + (NAME_COLUMN_INDEX + (i - 1))).Value = quartalValue; quartalsLimits[j] += quartalValue; // Если на шаблон на формулах, то комментим ws.get_Range(QUARTER_LETTERS[j] + YEAR_BEGIN_INDEX).Value = Math.Round(quartalsLimits[j], EnergyMeter.LIMIT_PRECISION); } // ВСЁ ЧТО НИЖЕ МОЖНО ПРОСТО ПРОПИСАТЬ ФОРМУЛАМИ В ШАБЛОНЕ!! double yearMeterTotal = Math.Round(metersList[i].MonthsLimits.Sum(), EnergyMeter.LIMIT_PRECISION); ws.get_Range(YEAR_LETTER + (NAME_COLUMN_INDEX + (i - 1))).Value = yearMeterTotal; yearTotal += yearMeterTotal; ws.get_Range(YEAR_LETTER + YEAR_BEGIN_INDEX).Value = Math.Round(yearTotal, EnergyMeter.LIMIT_PRECISION); } hpForm.ChangeProgress("Зберігаємо зміни до файлу...", hpForm.ProgressRest); string fileNameToSave = System.IO.Path.Combine(getApplicationDirectory(), READY_FILE_NAME); string fName = System.IO.Path.GetFileNameWithoutExtension(fileNameToSave); int k = 0; while (System.IO.File.Exists(fileNameToSave)) { string fExtension = new System.IO.FileInfo(fileNameToSave).Extension; string newFName = fName + "-" + (k++) + fExtension; fileNameToSave = System.IO.Path.Combine(getApplicationDirectory(), newFName); } wb.SaveAs(fileNameToSave); NotificationHelper.ShowInfo("Все готово!"); } catch { NotificationHelper.ShowError("Помилка при заповненні файлу! Скоріше за все файл зайнятий іншою программою"); return; } finally { hpForm.Close(); Enabled = true; // Закрываем всё! wb.Close(0); xlApp.Quit(); xlApp = null; } }
private MetersList GetDataFromExelFile(string fileName, bool appStart) { MetersList mList = new MetersList(); // запуск процесса Excel Excel.Application xlApp = new Excel.Application(); if (xlApp == null) { NotificationHelper.ShowError("Помилка при завантаженні екземпляру Microsoft Excel!"); Environment.Exit(0); } // Загрузка книги Excel.Workbook wb = xlApp.Workbooks.Open(fileName); if (wb == null) { NotificationHelper.ShowError("Помилка при завантаженні книги Microsoft Excel!"); xlApp.Quit(); xlApp = null; Environment.Exit(0); } // Выбор листа с данными Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1]; if (ws == null) { NotificationHelper.ShowError("Помилка при завантаженні листа із книги Microsoft Excel!"); xlApp.Quit(); xlApp = null; Environment.Exit(0); } // Считывание данных с листа try { for (int i = 0; ; i++) { string name = ws.get_Range(NAME_COLUMN_LETTER + (NAME_COLUMN_INDEX + i)).Value; if (string.IsNullOrWhiteSpace(name)) { break; } if (appStart) { mList.Add( new EnergyMeter { Name = name, IsHeating = (name.EndsWith("(опал.)") || name.EndsWith("(оп.)") || name.EndsWith("(опалення)")), Number = (i + 1), ConnectedPower = ws.get_Range(POWER_COLUMN_LETTER + (NAME_COLUMN_INDEX + i)).Value }); } else { double[] mounthLimits = new double[12]; for (int j = 0; j < MONTHS_LETTERS.Count(); j++) { mounthLimits[j] = ws.get_Range(MONTHS_LETTERS[j] + (NAME_COLUMN_INDEX + i)).Value; } EnergyMeter newMeter = new EnergyMeter(ws.get_Range(YEAR_LETTER + (NAME_COLUMN_INDEX + i)).Value, mounthLimits); newMeter.Name = name; newMeter.Number = (i + 1); newMeter.ConnectedPower = ws.get_Range(POWER_COLUMN_LETTER + (NAME_COLUMN_INDEX + i)).Value; mList.Add(newMeter); } } } catch (Exception ex) { NotificationHelper.ShowError("Помилка при завантаженні данних!"); Environment.Exit(0); } finally { wb.Close(false); xlApp.Quit(); xlApp = null; //System.GC.Collect(); } return(mList); }