diff --git a/backend/Tnsu.ApprovalRoute.Application/Reports/VacancyReportWorkbook.cs b/backend/Tnsu.ApprovalRoute.Application/Reports/VacancyReportWorkbook.cs index ea645e1..c950894 100644 --- a/backend/Tnsu.ApprovalRoute.Application/Reports/VacancyReportWorkbook.cs +++ b/backend/Tnsu.ApprovalRoute.Application/Reports/VacancyReportWorkbook.cs @@ -281,13 +281,22 @@ public static class VacancyReportWorkbook sheet, styles, vertTable2HeaderRowIdx, "Общий объем в работе", summary.GrandInProgress, recruiters, r => r.ShareOfInProgress(summary.GrandInProgress)); + // Якоря диаграмм считаются НЕЗАВИСИМО от строк таблиц: у таблицы может + // быть 2 строки, а у диаграммы фиксированная высота ChartHeightRows — с + // якорем "на уровне шапки своей таблицы" вторая диаграмма при коротких + // таблицах вставала бы внутрь вертикального диапазона первой (см. + // ChartHeightRows). Обе выравнены по левому краю первой (горизонтальной) + // таблицы и просто идут подряд сверху вниз с отступом. var period = $"с {report.From:dd.MM.yyyy} по {report.To:dd.MM.yyyy}"; + var chart1TopRowIdx = HeaderRowIdx + 1; + var chart2TopRowIdx = chart1TopRowIdx + ChartHeightRows + 1; + CreatePieChart( sheet, "Объём вакансий " + period, - firstDataRowIdx: vertTable1DataStartRowIdx, rowCount: recruiters.Count, anchorTopRowIdx: vertTable1HeaderRowIdx); + firstDataRowIdx: vertTable1DataStartRowIdx, rowCount: recruiters.Count, anchorTopRowIdx: chart1TopRowIdx); CreatePieChart( sheet, "Объём вакансий в работе " + period, - firstDataRowIdx: vertTable2DataStartRowIdx, rowCount: recruiters.Count, anchorTopRowIdx: vertTable2HeaderRowIdx); + firstDataRowIdx: vertTable2DataStartRowIdx, rowCount: recruiters.Count, anchorTopRowIdx: chart2TopRowIdx); } /// @@ -332,6 +341,13 @@ public static class VacancyReportWorkbook SetCell(headerRow, 0, label, styles.SummaryBlueHeader); SetCell(headerRow, 1, total, styles.SummaryBlueTotal); + // Заливка — на всю ширину блока (по числу рекрутёров, как в горизонтальной + // таблице выше), а не только под текстом заголовка: иначе шапка выглядит + // как две узкие цветные ячейки на фоне остального белого листа, а не как + // сплошная плашка над таблицей. + for (var col = 2; col <= recruiters.Count; col++) + SetCell(headerRow, col, string.Empty, styles.SummaryBlueHeader); + for (var i = 0; i < recruiters.Count; i++) { var row = sheet.CreateRow(headerRowIdx + 1 + i); @@ -341,19 +357,22 @@ public static class VacancyReportWorkbook } /// - /// Круговая диаграмма по одной вертикальной таблице: категории — колонка A - /// (имена рекрутёров), значения — колонка B (доля). Высота якоря — - /// фиксированные 14 строк: чтения диаграммы ради нет смысла подгонять её - /// размер под число рекрутёров, малое число категорий на большом круге - /// читается ничуть не хуже. + /// Высота якоря диаграммы в строках — фиксированная и не зависит от числа + /// рекрутёров: подгонять размер круга под число категорий смысла нет, малое + /// число секторов на большом круге читается ничуть не хуже. Используется и + /// при размещении диаграмм (см. BuildSummarySheet — вторая идёт сразу под + /// первой, без наложения). /// + private const int ChartHeightRows = 14; + + /// Круговая диаграмма по одной вертикальной таблице: категории — колонка A (имена рекрутёров), значения — колонка B (доля). private static void CreatePieChart( XSSFSheet sheet, string title, int firstDataRowIdx, int rowCount, int anchorTopRowIdx) { if (rowCount == 0) return; var drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch(); - var anchor = drawing.CreateAnchor(0, 0, 0, 0, 3, anchorTopRowIdx, 11, anchorTopRowIdx + 14); + var anchor = drawing.CreateAnchor(0, 0, 0, 0, 3, anchorTopRowIdx, 11, anchorTopRowIdx + ChartHeightRows); var chart = (XSSFChart)drawing.CreateChart(anchor); chart.SetTitle(title);