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

Показания по точкам учёта

Отчёт содержит представление показаний приборов учёта электроэнергии по выбранным точкам учёта на начало и конец выбранного периода времени.

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

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

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

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

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

  • Отчёт за сутки по одной точке учёта - Скачать

  • Отчёт за полный месяц по группе точек учёта - Скачать

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

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

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

C#
// Дата начала интервала
var startDate = ReportParams.DateStart.Date;
// Дата окончания интервала
var stopDate = ReportParams.DateStop.Date;
// Список точек учёта
var meterPoints = ReportParams.ClassifierItem.GetAllChildrenOfClass(MeterPoint.GetClassInfo()).ToArray();
Инициализация внутренних переменных
C#
// Интервал выборки
var interval = new DayIntervalData(){ StartDt = startDate, EndDt = stopDate };
// Выводимый параметр
var parametr = TariffZoneBasedParameter.Instances.EnergyActiveForwardTotalFixDay;

// Первая строка таблицы
var startRow = 4;
// Первая строка с данными
var dataRow = startRow + 2;
// Текущая строка для вывода
var currentRow = dataRow;
Основной цикл по точкам учёта

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

C#
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 ++;
}
Получение и вывод данных в документ Excel

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

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

Готовый файл отчёта Показания по точкам учёта

См. также