fix: колонки с датами теряли заливку шапки (SetDefaultColumnStyle в NPOI)
Tests / frontend-test (pull_request) Successful in 48s
Tests / backend-test (pull_request) Successful in 2m0s

H1/I1/K1 («Дата подачи заявки», «Дата закрытия вакансии», «Дата
выхода») выходили с форматом даты вместо синей заливки шапки — хотя
код применял ко всей строке 1 один и тот же стиль Header.

Причина — SetDefaultColumnStyle(col, DataDate), вызванный ПОСЛЕ записи
строк: в отличие от чистого OOXML, где стиль колонки уступает явному
стилю ячейки, NPOI этим вызовом переписывает стиль уже существующих
ячеек колонки целиком, включая шапку. Формат даты и так стоит на каждой
конкретной ячейке с датой (SetDate) — вызов просто убран.

Добавлен регрессионный тест (сравнение Index стиля, а не ссылки на
объект — NPOI отдаёт новую обёртку ICellStyle на каждый вызов
CellStyle, ссылки не совпадают даже у идентичного стиля).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
gorbenko.pavel
2026-08-28 11:33:13 +05:00
parent 80973bc1c0
commit 1221b31225
2 changed files with 27 additions and 5 deletions
@@ -90,6 +90,23 @@ public sealed class VacancyReportWorkbookTests
IsEmptyAt(sheet, 1, 17).ShouldBeTrue();
}
[Fact(DisplayName = "Шапка колонок с датами закрашена так же, как остальная шапка")]
public void Header_DateColumns_SameStyleAsRestOfHeader()
{
// Регрессия: даты когда-то получали формат через SetDefaultColumnStyle,
// а он в NPOI переписывает стиль УЖЕ существующих ячеек колонки —
// включая шапку, которая от этого лишалась заливки (H1/I1/K1 получали
// DataDate вместо Header). Формат даты теперь ставится только на сами
// ячейки с датами (см. SetDate), шапки колонок с датами он не касается.
var sheet = BuildListSheet(new VacancyReportGroup("", [Row("Логист")]));
// NPOI отдаёт на каждый вызов CellStyle новую обёртку — сравнивать
// нужно индекс стиля в книге, а не ссылки на объекты.
var headerStyleIndex = CellAt(sheet, 1, 3)!.CellStyle.Index; // «Вакансия» — заведомо обычная шапка.
foreach (var col in (int[])[8, 9, 11]) // H «Дата подачи заявки», I «Дата закрытия», K «Дата выхода»
CellAt(sheet, 1, col)!.CellStyle.Index.ShouldBe(headerStyleIndex);
}
[Fact(DisplayName = "Строка вакансии: значения в своих колонках, «Комментарии» пусты")]
public void DataRow_Layout()
{