![]() | Показания по точкам учёта |
Отчёт содержит представление показаний приборов учёта электроэнергии по выбранным точкам учёта на начало и конец выбранного периода времени.
Входные параметры отчёта:
Точки учёта – элемент классификатора, являющийся непосредственно точкой учёта или иерархически включающий целевые точки учёта;
Начало периода – дата начала периода времени для выборки данных;
Окончание периода – дата окончания периода времени для выборки данных.
Примеры сформированных отчётов:
Для корректного представления данных в данном отчёте требуется выравнивание начала и окончания периода на границу суток.
Полученная обобщённая коллекция элементов классификатора должна быть преобразована к соответствующей коллекции целевых точек учёта.
// Дата начала интервала var startDate = ReportParams.DateStart.Date; // Дата окончания интервала var stopDate = ReportParams.DateStop.Date; // Список точек учёта var meterPoints = ReportParams.ClassifierItem.GetAllChildrenOfClass(MeterPoint.GetClassInfo()).ToArray();
// Интервал выборки var interval = new DayIntervalData(){ StartDt = startDate, EndDt = stopDate }; // Выводимый параметр var parametr = TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay; // Первая строка таблицы var startRow = 4; // Первая строка с данными var dataRow = startRow + 2; // Текущая строка для вывода var currentRow = dataRow;
На данном этапе производится получение основных сведений по каждой точке учёта и вывод полученных данных на лист. Метод GetMeasureTransformersInfo возвращает информацию об установленных измерительных трансформаторах.
foreach (MeterPoint meterPoint in meterPoints) { // Порядковый номер sheet.Cells[currentRow, 0].Value = currentRow - dataRow + 1; // Наименование точки учёта sheet.Cells[currentRow, 1].Value = meterPoint.Caption; // Проверяем наличие прибора учёта if (meterPoint.AttributeElectricityMeter != null) { // Вывод тип прибора учёта sheet.Cells[currentRow, 2].Value = meterPoint.AttributeElectricityMeter.Caption; } else { sheet.Cells[currentRow, 2].Value = "Нет прибора"; } // Вывод наименования канала учёта sheet.Cells[currentRow, 3].Value = "А+, кВт"; // Получение коэффициентов трансформации var transformersInfo = meterPoint.GetMeasureTransformersInfo(stopDate); var ktt = transformersInfo.CurrentRatio != null ? transformersInfo.CurrentRatio.Value : 1.0; var ktn = transformersInfo.VoltageRatio != null ? transformersInfo.VoltageRatio.Value : 1.0; // Вывод коэффициентов трансформации sheet.Cells[currentRow, 4].Value = ktn; sheet.Cells[currentRow, 5].Value = ktt; // Получение данных по точке учёта currentRow ++; }
На данном этапе производится получение данных по каждой точке учёта и вывод полученных данных на лист. Метод GetMeterPointFinalData возвращает только существующие данные, в связи с этим требуется выполнить поиск данных по штампам времени.
// Получение данных по точке учёта var data = meterPoint.GetMeterPointFinalData(parametr, interval); var startValue = data.FirstOrDefault(x => x.ValueDt != null && x.ValueDt == startDate); var stopValue = data.FirstOrDefault(x => x.ValueDt != null && x.ValueDt == stopDate); // Первичное заполнение ячеек с данными sheet.Cells[currentRow, 6].Value = "н/д"; sheet.Cells[currentRow, 7].Value = "н/д"; sheet.Cells[currentRow, 8].Value = "н/д"; // Заполнение ячеек с данными if (startValue != null) sheet.Cells[currentRow, 6].Value = startValue.Value / 1000.0; if (stopValue != null) sheet.Cells[currentRow, 7].Value = stopValue.Value / 1000.0; if (startValue != null && stopValue != null) { // Формула расчёта потребления за период sheet.Cells[currentRow, 8].Formula = string.Format("=(H{0}-G{0})*E{0}*F{0}", currentRow + 1); }
// Установка дат в ячейках заголовка sheet.Cells[5, 6].Value = startDate.ToShortDateString(); sheet.Cells[5, 7].Value = stopDate.ToShortDateString(); // Установить рамки вокруг всех ячеек var dataCells = sheet.Cells.GetSubrangeAbsolute(dataRow, 0, currentRow - 1, 8); dataCells.SetBorder(); // Разрешить перенос по словам dataCells.Style.WrapText = true; // Вертикальное выравнивание "По центру" dataCells.Style.VerticalAlignment = VerticalAlignmentStyle.Center; // Горизонтальное выравнивание "По левому краю" dataCells.Style.HorizontalAlignment = HorizontalAlignmentStyle.Left; // Для ячеек с данными горизонтальное выравнивание "По центру" var digitRange = sheet.Cells.GetSubrangeAbsolute(startRow, 4, currentRow - 1, 8); digitRange.Style.HorizontalAlignment = HorizontalAlignmentStyle.Center; // Для ячеек с порядковым номером горизонтальное выравнивание "По центру" sheet.Cells.GetSubrangeAbsolute(dataRow, 0, currentRow - 1, 0).Style.HorizontalAlignment = HorizontalAlignmentStyle.Center; // В заголовке таблицы установить жирный шрифт и устанавливаем цвет ячеек var header = sheet.Cells.GetSubrangeAbsolute(startRow, 0, startRow + 1, 8); header.Style.Font.Weight = ExcelFont.BoldWeight; header.Style.FillPattern.SetSolid(Color.FromArgb(0, 189, 215, 238)); // Выводим информацию по параметрам формирования отчёта 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); 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 interval = new DayIntervalData(){ StartDt = startDate.AddDays(-1), EndDt = stopDate }; // Выводимый параметр var parametr = TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay; // Первая строка таблицы var startRow = 4; // Первая строка с данными var dataRow = startRow + 2; // Текущая строка для вывода var currentRow = dataRow; foreach (MeterPoint meterPoint in meterPoints) { // Порядковый номер sheet.Cells[currentRow, 0].Value = currentRow - dataRow + 1; // Наименование точки учёта sheet.Cells[currentRow, 1].Value = meterPoint.Caption; // Проверяем наличие прибора учёта if (meterPoint.AttributeElectricityMeter != null) { // Вывод тип прибора учёта sheet.Cells[currentRow, 2].Value = meterPoint.AttributeElectricityMeter.Caption; } else { sheet.Cells[currentRow, 2].Value = "Нет прибора"; } // Вывод наименования канала учёта sheet.Cells[currentRow, 3].Value = "А+, кВт"; // Получение коэффициентов трансформации var transformersInfo = meterPoint.GetMeasureTransformersInfo(stopDate); var ktt = transformersInfo.CurrentRatio != null ? transformersInfo.CurrentRatio.Value : 1.0; var ktn = transformersInfo.VoltageRatio != null ? transformersInfo.VoltageRatio.Value : 1.0; // Вывод коэффициентов трансформации sheet.Cells[currentRow, 4].Value = ktn; sheet.Cells[currentRow, 5].Value = ktt; // Получение данных по точке учёта var data = meterPoint.GetMeterPointFinalData(parametr, interval); var startValue = data.FirstOrDefault(x => x.ValueDt != null && x.ValueDt == startDate); var stopValue = data.FirstOrDefault(x => x.ValueDt != null && x.ValueDt == stopDate); // Первичное заполнение ячеек с данными sheet.Cells[currentRow, 6].Value = "н/д"; sheet.Cells[currentRow, 7].Value = "н/д"; sheet.Cells[currentRow, 8].Value = "н/д"; // Заполнение ячеек с данными if (startValue != null) sheet.Cells[currentRow, 6].Value = startValue.Value / 1000.0; if (stopValue != null) sheet.Cells[currentRow, 7].Value = stopValue.Value / 1000.0; if (startValue != null && stopValue != null) { // Формула расчёта потребления за период sheet.Cells[currentRow, 8].Formula = string.Format("=(H{0}-G{0})*E{0}*F{0}", currentRow + 1); } currentRow ++; } // Установка дат в ячейках заголовка sheet.Cells[5, 6].Value = startDate.ToShortDateString(); sheet.Cells[5, 7].Value = stopDate.ToShortDateString(); // Установить рамки вокруг всех ячеек var dataCells = sheet.Cells.GetSubrangeAbsolute(dataRow, 0, currentRow - 1, 8); dataCells.SetBorder(); // Разрешить перенос по словам dataCells.Style.WrapText = true; // Вертикальное выравнивание "По центру" dataCells.Style.VerticalAlignment = VerticalAlignmentStyle.Center; // Горизонтальное выравнивание "По левому краю" dataCells.Style.HorizontalAlignment = HorizontalAlignmentStyle.Left; // Для ячеек с данными горизонтальное выравнивание "По центру" var digitRange = sheet.Cells.GetSubrangeAbsolute(startRow, 4, currentRow - 1, 8); digitRange.Style.HorizontalAlignment = HorizontalAlignmentStyle.Center; // Для ячеек с порядковым номером горизонтальное выравнивание "По центру" sheet.Cells.GetSubrangeAbsolute(dataRow, 0, currentRow - 1, 0).Style.HorizontalAlignment = HorizontalAlignmentStyle.Center; // В заголовке таблицы установить жирный шрифт и устанавливаем цвет ячеек var header = sheet.Cells.GetSubrangeAbsolute(startRow, 0, startRow + 1, 8); header.Style.Font.Weight = ExcelFont.BoldWeight; header.Style.FillPattern.SetSolid(Color.FromArgb(0, 189, 215, 238)); // Выводим информацию по параметрам формирования отчёта 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); sheet.Cells.GetSubrangeAbsolute(0, 0, 2, 0).Style.Font.Weight = ExcelFont.BoldWeight;
Готовый файл отчёта Показания по точкам учёта