You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iText Blazor实现嵌套表格占满整宽的方法咨询

解决iText嵌套表格跨列及样式问题

问题说明

使用iText生成PDF时,基于List<ValidStaffMemberDTO>及其嵌套List属性生成表格,当前嵌套表格仅占外层表格1列宽度,需要实现:

  • 嵌套表格占满外层表格的4列宽度
  • 去除表格的垂直分隔线

解决方案

1. 实现嵌套表格跨4列

不要直接将嵌套表格添加到外层表格后补空单元格,而是创建一个跨4列的单元格,将嵌套表格放入该单元格中,这样嵌套表格就能自动占满外层表格的全部宽度。

2. 去除垂直分隔线

通过SetVerticalBorder(Border.NO_BORDER)方法,给外层表格、内层表格及所有单元格设置垂直边框为无,同时保留水平边框保证表格结构清晰。

修改后的完整代码

public async Task<byte[]> GeneratePdf(List<ValidStaffMemberDTO> staffMemberCalas)
{
    var memoryStream = new MemoryStream();
    var pdfWriter = new PdfWriter(memoryStream);
    var pdfDocument = new PdfDocument(pdfWriter);
    var document = new Document(pdfDocument);

    var header = new Paragraph("Trabajadores")
        .SetTextAlignment(TextAlignment.CENTER)
        .SetFontSize(20);

    // 外层表格:设置垂直边框为无,保留水平边框
    var table = new Table(new[] { 1f, 1f, 1f, 1f })
        .UseAllAvailableWidth()
        .SetVerticalBorder(Border.NO_BORDER);

    var cell11 = new Cell(1, 1)
        .SetBackgroundColor(ColorConstants.GRAY)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("Nombre"))
        .SetVerticalBorder(Border.NO_BORDER); // 表头单元格去除垂直边框
    var cell12 = new Cell(1, 1)
        .SetBackgroundColor(ColorConstants.GRAY)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("Categoría"))
        .SetVerticalBorder(Border.NO_BORDER);
    var cell13 = new Cell(1, 1)
        .SetBackgroundColor(ColorConstants.GRAY)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("Código"))
        .SetVerticalBorder(Border.NO_BORDER);
    var cell14 = new Cell(1, 1)
        .SetBackgroundColor(ColorConstants.GRAY)
        .SetTextAlignment(TextAlignment.CENTER)
        .Add(new Paragraph("Usuario R+"))
        .SetVerticalBorder(Border.NO_BORDER);

    table.AddCell(cell11);
    table.AddCell(cell12);
    table.AddCell(cell13);
    table.AddCell(cell14);

    try
    {
        foreach (var staffMember in staffMemberCalas)
        {
            // 员工信息行:去除垂直边框
            table.AddCell(new Cell(1, 1)
                .SetTextAlignment(TextAlignment.CENTER)
                .Add(new Paragraph(staffMember.StaffMember.Name ?? string.Empty))
                .SetVerticalBorder(Border.NO_BORDER));

            if (staffMember.StaffMember.Category != null)
                table.AddCell(new Cell(1, 1)
                    .SetTextAlignment(TextAlignment.CENTER)
                    .Add(new Paragraph(staffMember.StaffMember.Category.Description ?? string.Empty))
                    .SetVerticalBorder(Border.NO_BORDER));
            else
                table.AddCell(new Cell(1, 1)
                    .SetTextAlignment(TextAlignment.CENTER)
                    .Add(new Paragraph(string.Empty))
                    .SetVerticalBorder(Border.NO_BORDER));

            table.AddCell(new Cell(1, 1)
                .SetTextAlignment(TextAlignment.CENTER)
                .Add(new Paragraph(staffMember.StaffMemberCalasCode ?? string.Empty))
                .SetVerticalBorder(Border.NO_BORDER));
            table.AddCell(new Cell(1, 1)
                .SetTextAlignment(TextAlignment.CENTER)
                .Add(new Paragraph(staffMember.UserWithWorkGroup.FirstOrDefault() == null ? string.Empty : $"{staffMember.UserWithWorkGroup.FirstOrDefault().User.NameAndSurnames}"))
                .SetVerticalBorder(Border.NO_BORDER));


            if (staffMember.UserWithWorkGroup[0] != null)
            {
                // 内层表格:设置垂直边框为无
                Table innertable = new Table(new[] { 1f, 1f })
                    .UseAllAvailableWidth()
                    .SetVerticalBorder(Border.NO_BORDER);

                var cell21 = new Cell(1, 1)
                   .SetBackgroundColor(ColorConstants.GRAY)
                   .SetTextAlignment(TextAlignment.CENTER)
                   .Add(new Paragraph("Nombre grupo trabajo"))
                   .SetVerticalBorder(Border.NO_BORDER);
                var cell22 = new Cell(1, 1)
                    .SetBackgroundColor(ColorConstants.GRAY)
                    .SetTextAlignment(TextAlignment.CENTER)
                    .Add(new Paragraph("Activo"))
                    .SetVerticalBorder(Border.NO_BORDER);

                innertable.AddCell(cell21);
                innertable.AddCell(cell22);

                foreach (var userWithWorkGroup in staffMember.UserWithWorkGroup)
                {
                    if (userWithWorkGroup != null)
                    {
                        foreach (var wg in userWithWorkGroup.WorkGroup)
                        {
                            innertable.AddCell(new Cell(1, 1)
                                .SetTextAlignment(TextAlignment.CENTER)
                                .Add(new Paragraph(wg.Name ?? string.Empty))
                                .SetVerticalBorder(Border.NO_BORDER));
                            innertable.AddCell(new Cell(1, 1)
                                .SetTextAlignment(TextAlignment.CENTER)
                                .Add(new Paragraph(wg.IsInactive ? "Baja" : "Alta"))
                                .SetVerticalBorder(Border.NO_BORDER));
                        }
                    }
                    else
                    {
                        innertable.AddCell(new Cell(1, 1)
                            .SetTextAlignment(TextAlignment.CENTER)
                            .Add(new Paragraph(string.Empty))
                            .SetVerticalBorder(Border.NO_BORDER));
                        innertable.AddCell(new Cell(1, 1)
                            .SetTextAlignment(TextAlignment.CENTER)
                            .Add(new Paragraph(string.Empty))
                            .SetVerticalBorder(Border.NO_BORDER));
                    }
                }

                // 创建跨4列的单元格,放入嵌套表格
                var innerTableCell = new Cell(1, 4)
                    .Add(innertable)
                    .SetVerticalBorder(Border.NO_BORDER);
                table.AddCell(innerTableCell);
            }
        }

        document.Add(header);
        document.Add(table);
        document.Close();

        return memoryStream.ToArray();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        return null;
    }
    finally
    {
        pdfWriter.Flush();
        pdfWriter.Close();
        memoryStream.Flush();
        memoryStream.Close();
    }
}

关键修改点

  • 外层表格、内层表格及所有单元格添加SetVerticalBorder(Border.NO_BORDER),彻底去除垂直分隔线
  • 将嵌套表格放入new Cell(1,4)中,实现跨4列显示,替代原代码中添加嵌套表格后补3个空单元格的逻辑
  • 保持水平边框默认显示,确保表格结构清晰可读

内容的提问来源于stack exchange,提问作者Roberto Quirós

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:49:56