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
相关产品推荐
相关产品推荐

