![]() | Профиль мощности по точкам учёта |
Отчёт содержит представление профиля 30-минутной электрической мощности по выбранным точкам учёта за выбранный период времени.
Входные параметры отчёта:
Точки учёта – элемент классификатора, являющийся непосредственно точкой учёта или иерархически включающий целевые точки учёта;
Начало периода – дата начала периода времени для выборки данных;
Окончание периода – дата окончания периода времени для выборки данных.
Примеры сформированных отчётов:
Для корректного представления данных в данном отчёте требуется выравнивание начала и окончания периода на границу суток.
Полученная обобщённая коллекция элементов классификатора должна быть преобразована к соответствующей коллекции целевых точек учёта.
// Выравнивание дат на начало суток var startDate = ReportParams.DateStart.Date; var stopDate = ReportParams.DateStop.Date; // Список точек учёта var meterPoints = ReportParams.ClassifierItem.GetAllChildrenOfClass(MeterPoint.GetClassInfo()).ToArray();
// Первая строка таблицы var startRow = 7; // Первая колонка var column = 1; // Первая строка с данными var dataRow = startRow + 3; // Выводимый параметр var parametr = DirectionBasedParameter.Instances.PowerActiveForward30Min; // Интервал выборки var interval = new DayIntervalData(){ StartDt = startDate, EndDt = stopDate }; // Создаём справочник соответствия даты и времени и номера строки в отчёте var dateToRowNumber = new Dictionary<DateTime, int>(); var tmpTime = startDate; var tmpRow = dataRow; while (tmpTime <= stopDate) { // Заполняем штампами времени первый столбец sheet.Cells[tmpRow, 0].Value = tmpTime.ToString(); dateToRowNumber.Add(tmpTime, tmpRow); tmpRow++; tmpTime = tmpTime.AddMinutes(30); } // Последняя строка в отчёте var lastRow = tmpRow - 1;
foreach (MeterPoint meterPoint in meterPoints) { // Наименование точки учёта var name = meterPoint.Caption; // Серийный номер прибора учёта var electricityMeter = meterPoint.AttributeElectricityMeter == null ? "Нет прибора" : meterPoint.AttributeElectricityMeter.Caption; // Коэффициенты трансформации var transformersInfo = meterPoint.GetMeasureTransformersInfo(); var ktt = transformersInfo.CurrentRatio != null ? transformersInfo.CurrentRatio.Value : 1.0; var ktn = transformersInfo.VoltageRatio != null ? transformersInfo.VoltageRatio.Value : 1.0; sheet.Cells[startRow, column].Value = name; sheet.Cells[startRow + 1, column].Value = electricityMeter; sheet.Cells[startRow + 2, column].Value = string.Format("{0}/{1}", ktt, ktn); sheet.Cells[startRow + 3, column].Value = "А+, кВт*ч"; // Получение данных по точке учёта column++; }
На данном этапе производится получение данных по каждой точке учёта и вывод полученных данных на лист. Метод GetMeterPointFinalData возвращает только существующие данные, в связи с этим требуется сопоставление штампа времени и номер строки.
// Получение данных по точке учёта var data = meterPoint.GetMeterPointFinalData(parametr, interval).ToArray(); foreach (var date in dateToRowNumber) { sheet.Cells[date.Value, column].Value = "н/д"; var record = data.FirstOrDefault(x => x.ValueDt != null && x.ValueDt == date.Key); if (record != null) sheet.Cells[date.Value, column].Value = record.Value / 1000.0; }
// Установить рамки вокруг всех ячеек sheet.Cells.GetSubrangeAbsolute(startRow, 0, lastRow, column - 1).SetBorder(); // В заголовке таблицы установить жирный шрифт и устанавливаем цвет ячеек var header = sheet.Cells.GetSubrangeAbsolute(startRow, 0, startRow + 3, column - 1); header.Style.FillPattern.SetSolid(Color.FromArgb(0, 189, 215, 238)); header.Style.HorizontalAlignment = HorizontalAlignmentStyle.Center; header.Style.VerticalAlignment = VerticalAlignmentStyle.Center; // Включить автоматическую ширину первого столбца sheet.Columns[0].AutoFit(); // Формат данных var dataRange = sheet.Cells.GetSubrangeAbsolute(dataRow, 1, lastRow, column - 1); dataRange.Style.HorizontalAlignment = HorizontalAlignmentStyle.Center; dataRange.Style.VerticalAlignment = VerticalAlignmentStyle.Center; for (int i = 1; i < column; i++) sheet.Columns[i].Width = 15*256; // Выводим информацию по параметрам формирования отчёта sheet.Cells[0, 0].Value = "Профиль мощности по точкам учёта"; sheet.Cells[1, 0].Value = string.Format("За период с {0} по {1}", startDate.ToShortDateString(), stopDate.ToShortDateString()); sheet.Cells[2, 0].Value = string.Format("Сформирован {0}", DateTime.Now.ToShortDateString()); sheet.Cells.GetSubrangeAbsolute(0, 0, 2, 0).Style.Font.Weight = ExcelFont.BoldWeight;
var sheet = WorkbookNonExcel.Worksheets.FirstOrDefault(); // Выравнивание дат на начало суток var startDate = ReportParams.DateStart.Date; var stopDate = ReportParams.DateStop.Date; // Список точек учёта var meterPoints = ReportParams.ClassifierItem.GetAllChildrenOfClass(MeterPoint.GetClassInfo()).ToArray(); // Первая строка таблицы var startRow = 4; // Первая колонка var column = 1; // Первая строка с данными var dataRow = startRow + 4; // Выводимый параметр var parametr = DirectionBasedParameter.Instances.PowerActiveForward30Min; // Интервал выборки var interval = new DayIntervalData(){ StartDt = startDate, EndDt = stopDate }; // Создаём справочник соответствия даты и времени и номера строки в отчёте var dateToRowNumber = new Dictionary<DateTime, int>(); var tmpTime = startDate.AddMinutes(30); var tmpRow = dataRow; while (tmpTime <= stopDate) { // Заполняем штампами времени первый столбец sheet.Cells[tmpRow, 0].Value = tmpTime.ToString(); dateToRowNumber.Add(tmpTime, tmpRow); tmpRow++; tmpTime = tmpTime.AddMinutes(30); } // Последняя строка в отчёте var lastRow = tmpRow - 1; // Цикл по точкам учёта foreach (MeterPoint meterPoint in meterPoints) { // Наименование точки учёта var name = meterPoint.Caption; // Серийный номер прибора учёта var electricityMeter = meterPoint.AttributeElectricityMeter == null ? "Нет прибора" : meterPoint.AttributeElectricityMeter.Caption; // Коэффициенты трансформации var transformersInfo = meterPoint.GetMeasureTransformersInfo(); var ktt = transformersInfo.CurrentRatio != null ? transformersInfo.CurrentRatio.Value : 1.0; var ktn = transformersInfo.VoltageRatio != null ? transformersInfo.VoltageRatio.Value : 1.0; sheet.Cells[startRow, column].Value = name; sheet.Cells[startRow + 1, column].Value = electricityMeter; sheet.Cells[startRow + 2, column].Value = string.Format("{0}/{1}", ktt, ktn); sheet.Cells[startRow + 3, column].Value = "А+, кВт*ч"; // Получение данных по точке учёта var data = meterPoint.GetMeterPointFinalData(parametr, interval).ToArray(); foreach (var date in dateToRowNumber) { sheet.Cells[date.Value, column].Value = "н/д"; var record = data.FirstOrDefault(x => x.ValueDt != null && x.ValueDt == date.Key); if (record != null) sheet.Cells[date.Value, column].Value = record.Value / 1000.0; } column++; } // Установить рамки вокруг всех ячеек sheet.Cells.GetSubrangeAbsolute(startRow, 0, lastRow, column - 1).SetBorder(); // В заголовке таблицы установить жирный шрифт и устанавливаем цвет ячеек var header = sheet.Cells.GetSubrangeAbsolute(startRow, 0, startRow + 3, column - 1); header.Style.FillPattern.SetSolid(Color.FromArgb(0, 189, 215, 238)); header.Style.HorizontalAlignment = HorizontalAlignmentStyle.Center; header.Style.VerticalAlignment = VerticalAlignmentStyle.Center; // Включить автоматическую ширину первого столбца sheet.Columns[0].AutoFit(); // Формат данных var dataRange = sheet.Cells.GetSubrangeAbsolute(dataRow, 1, lastRow, column - 1); dataRange.Style.HorizontalAlignment = HorizontalAlignmentStyle.Center; dataRange.Style.VerticalAlignment = VerticalAlignmentStyle.Center; for (int i = 1; i < column; i++) sheet.Columns[i].Width = 15*256; // Выводим информацию по параметрам формирования отчёта sheet.Cells[0, 0].Value = "Профиль мощности по точкам учёта"; sheet.Cells[1, 0].Value = string.Format("За период с {0} по {1}", startDate.ToShortDateString(), stopDate.ToShortDateString()); sheet.Cells[2, 0].Value = string.Format("Сформирован {0}", DateTime.Now.ToShortDateString()); sheet.Cells.GetSubrangeAbsolute(0, 0, 2, 0).Style.Font.Weight = ExcelFont.BoldWeight;
Готовый файл отчёта Профиль мощности по точкам учёта