Как использовать table.cell() для обработки этого случая с помощью библиотеки QuestPDF?

Вопрос или проблема

Я столкнулся с задачей, когда работаю с ячейками таблицы: если у меня есть ячейка с 4 вертикальными спанами и 2 горизонтальными спанами, и у меня только два объекта. Раньше я справлялся с этим, используя 2 строки для значений объектов + 2 пустые строки.

Что если я сделаю так, чтобы каждый объект занимал пространство 2 вертикальных спана, это позволит мне не отображать оставшиеся строки как пустые, можно ли это реализовать? Вот код, который я использовал:

демонстрация отчета

table.Cell().RowSpan(maxListCount).ColumnSpan((uint)myProperities).Column(column =>{
int renderedRows = 0;
foreach (var complexItem in list)
{                                        
    column.Item().Row(row =>
    {
        foreach (var subHeader in header.ChildHeaders)
        {              
            var subHeaderValue = subHeader.Accessor(complexItem);
row.RelativeColumn().Element(mergedBlock).AlignCenter().Text(subHeaderValue?.ToString() ?? string.Empty);
    
        }
    });

    renderedRows++;  
}
while (renderedRows < 4)
{
    column.Item().Row(row =>
    {
        row.RelativeColumn().Element(mergedBlock).AlignCenter().Text("");
    });

    renderedRows++;
}});

Ответ или решение

Чтобы решить вашу задачу с использованием библиотеки QuestPDF для управления ячейками таблицы, вы можете использовать метод table.Cell() так, чтобы каждый объект занимал пространство, соответствующее 2 единицам вертикального слияния, что позволит избежать отображения пустых строк. Вот пример, как вы можете это реализовать:

table.Cell().RowSpan(maxListCount).ColumnSpan(2).Column(column =>
{
    // Счетчик отрисованных объектов
    int renderedRows = 0;

    // Обрабатываем каждый элемент списка
    foreach (var complexItem in list)
    {
        // Здесь мы создаем строки для объектов
        column.Item().Row(row =>
        {
            foreach (var subHeader in header.ChildHeaders)
            {
                var subHeaderValue = subHeader.Accessor(complexItem);
                row.RelativeColumn().Element(mergedBlock).AlignCenter().Text(subHeaderValue?.ToString() ?? string.Empty);
            }
        });

        // Увеличиваем счетчик отрисованных строк
        renderedRows++;

        // Проверяем, если текущая строка занимает 2 вертикальных спана
        if (renderedRows % 2 == 0)
        {
            // Добавляем пустую строку, только если текущая строка - четная
            column.Item().Row(row =>
            {
                row.RelativeColumn().Element(mergedBlock).AlignCenter().Text("");
            });
        }
    }

    // Заполняем оставшиеся строки пустыми, если это необходимо
    while (renderedRows < 4)
    {
        column.Item().Row(row =>
        {
            row.RelativeColumn().Element(mergedBlock).AlignCenter().Text("");
        });

        renderedRows++;
    }
});

Объяснение кода:

  1. Настройка ячейки: Устанавливаем RowSpan и ColumnSpan, чтобы указать количество ячеек, которые будет занимать данный элемент. В вашем случае ColumnSpan равен 2 для поддержки горизонтального слияния.

  2. Цикл по элементам: В этом цикле мы обрабатываем каждую запись из списка list. Мы используем row.RelativeColumn() для добавления содержимого в строки таблицы.

  3. Управление пустыми строками: Мы проверяем, находится ли renderedRows на четной позиции, чтобы добавить пустую строку только после каждых двух элементов. Это позволяет нам обойтись без лишних пустых строк для оформления.

  4. Заполнение оставшихся строк: Если после отрисовки всех объектов осталось меньше 4 строк, мы добавляем пустые строки, чтобы поддерживать общую структуру таблицы.

Использование данной стратегии позволит вам избежать отображения пустых строк и более эффективно использовать пространство таблицы.

Оцените материал
Добавить комментарий

Капча загружается...