Для изменения размера нажмите или перетащите

Профиль мощности по точкам учёта

Отчёт содержит представление профиля 30-минутной электрической мощности по выбранным точкам учёта за выбранный период времени.

Входные параметры отчёта:

  • Точки учёта – элемент классификатора, являющийся непосредственно точкой учёта или иерархически включающий целевые точки учёта;

  • Начало периода – дата начала периода времени для выборки данных;

  • Окончание периода – дата окончания периода времени для выборки данных.

Примеры сформированных отчётов:

Обработка входных параметров

Для корректного представления данных в данном отчёте требуется выравнивание начала и окончания периода на границу суток.

Полученная обобщённая коллекция элементов классификатора должна быть преобразована к соответствующей коллекции целевых точек учёта.

C#
// Выравнивание дат на начало суток
var startDate = ReportParams.DateStart.Date;
var stopDate = ReportParams.DateStop.Date;
// Список точек учёта
var meterPoints = ReportParams.ClassifierItem.GetAllChildrenOfClass(MeterPoint.GetClassInfo()).ToArray();
Инициализация внутренних переменных
C#
// Первая строка таблицы
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;
Основной цикл по точкам учёта
C#
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++;
}
Получение и вывод данных в документ Excel

На данном этапе производится получение данных по каждой точке учёта и вывод полученных данных на лист. Метод GetMeterPointFinalData возвращает только существующие данные, в связи с этим требуется сопоставление штампа времени и номер строки.

C#
// Получение данных по точке учёта
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;
}
Форматирование документа Excel
C#
// Установить рамки вокруг всех ячеек
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;
Полный сценарий отчёта
C#
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;

Готовый файл отчёта Профиль мощности по точкам учёта

См. также