fix: диаграммы отчёта по вакансиям не накладываются, шапка блоков — сплошная

Якорь второй диаграммы стоял на строке заголовка второй вертикальной
таблицы — при коротком списке рекрутёров (2-4 человека) это оказывалось
внутри вертикального диапазона первой диаграммы (фиксированные 14
строк), и они наезжали друг на друга. Теперь обе диаграммы позиционируются
независимо от строк таблиц: вторая всегда сразу под первой (ChartHeightRows).

Заливка шапки «Общий объем работ»/«Общий объем в работе» теперь на всю
ширину блока (по числу рекрутёров), а не только под текстом — иначе она
выглядела как две узкие цветные ячейки на белом фоне.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
gorbenko.pavel
2026-08-28 11:17:07 +05:00
parent 4dac12302c
commit 80973bc1c0
@@ -281,13 +281,22 @@ public static class VacancyReportWorkbook
sheet, styles, vertTable2HeaderRowIdx, "Общий объем в работе", summary.GrandInProgress, sheet, styles, vertTable2HeaderRowIdx, "Общий объем в работе", summary.GrandInProgress,
recruiters, r => r.ShareOfInProgress(summary.GrandInProgress)); recruiters, r => r.ShareOfInProgress(summary.GrandInProgress));
// Якоря диаграмм считаются НЕЗАВИСИМО от строк таблиц: у таблицы может
// быть 2 строки, а у диаграммы фиксированная высота ChartHeightRows — с
// якорем "на уровне шапки своей таблицы" вторая диаграмма при коротких
// таблицах вставала бы внутрь вертикального диапазона первой (см.
// ChartHeightRows). Обе выравнены по левому краю первой (горизонтальной)
// таблицы и просто идут подряд сверху вниз с отступом.
var period = $"с {report.From:dd.MM.yyyy} по {report.To:dd.MM.yyyy}"; var period = $"с {report.From:dd.MM.yyyy} по {report.To:dd.MM.yyyy}";
var chart1TopRowIdx = HeaderRowIdx + 1;
var chart2TopRowIdx = chart1TopRowIdx + ChartHeightRows + 1;
CreatePieChart( CreatePieChart(
sheet, "Объём вакансий " + period, sheet, "Объём вакансий " + period,
firstDataRowIdx: vertTable1DataStartRowIdx, rowCount: recruiters.Count, anchorTopRowIdx: vertTable1HeaderRowIdx); firstDataRowIdx: vertTable1DataStartRowIdx, rowCount: recruiters.Count, anchorTopRowIdx: chart1TopRowIdx);
CreatePieChart( CreatePieChart(
sheet, "Объём вакансий в работе " + period, sheet, "Объём вакансий в работе " + period,
firstDataRowIdx: vertTable2DataStartRowIdx, rowCount: recruiters.Count, anchorTopRowIdx: vertTable2HeaderRowIdx); firstDataRowIdx: vertTable2DataStartRowIdx, rowCount: recruiters.Count, anchorTopRowIdx: chart2TopRowIdx);
} }
/// <summary> /// <summary>
@@ -332,6 +341,13 @@ public static class VacancyReportWorkbook
SetCell(headerRow, 0, label, styles.SummaryBlueHeader); SetCell(headerRow, 0, label, styles.SummaryBlueHeader);
SetCell(headerRow, 1, total, styles.SummaryBlueTotal); 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++) for (var i = 0; i < recruiters.Count; i++)
{ {
var row = sheet.CreateRow(headerRowIdx + 1 + i); var row = sheet.CreateRow(headerRowIdx + 1 + i);
@@ -341,19 +357,22 @@ public static class VacancyReportWorkbook
} }
/// <summary> /// <summary>
/// Круговая диаграмма по одной вертикальной таблице: категории — колонка A /// Высота якоря диаграммы в строках — фиксированная и не зависит от числа
/// (имена рекрутёров), значения — колонка B (доля). Высота якоря — /// рекрутёров: подгонять размер круга под число категорий смысла нет, малое
/// фиксированные 14 строк: чтения диаграммы ради нет смысла подгонять её /// число секторов на большом круге читается ничуть не хуже. Используется и
/// размер под число рекрутёров, малое число категорий на большом круге /// при размещении диаграмм (см. BuildSummarySheet — вторая идёт сразу под
/// читается ничуть не хуже. /// первой, без наложения).
/// </summary> /// </summary>
private const int ChartHeightRows = 14;
/// <summary>Круговая диаграмма по одной вертикальной таблице: категории — колонка A (имена рекрутёров), значения — колонка B (доля).</summary>
private static void CreatePieChart( private static void CreatePieChart(
XSSFSheet sheet, string title, int firstDataRowIdx, int rowCount, int anchorTopRowIdx) XSSFSheet sheet, string title, int firstDataRowIdx, int rowCount, int anchorTopRowIdx)
{ {
if (rowCount == 0) return; if (rowCount == 0) return;
var drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch(); 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); var chart = (XSSFChart)drawing.CreateChart(anchor);
chart.SetTitle(title); chart.SetTitle(title);