交错表格指表格内的部分行与基准行不对齐,有一定的偏差。常见的交错表有:高程闭合自动计算表格、界址点表格等。示例如下:
1 合并单元格方式
通常情况下会使用表格合并功能来实现交错表格,具体示例代码如下:
var pdf_obj = Document.Create(document =>
{
document.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.PageColor(Colors.White);
//字体默认大小20号字体
page.DefaultTextStyle(x => x.FontFamily("simFang").FontSize(10));
page.Content().Column(column =>
{
column.Item().AlignCenter().Text("交错表格").FontSize(20);
column.Item().Text("").FontSize(8);
column.Item().Table(table =>
{
table.Header(header =>
{
for (int i = 0; i < 5; i++) { header.Cell().Element(HeaderStyle).Text($"标题{i}"); }
});
table.ColumnsDefinition(columns =>
{
for (int i = 0; i < 5; i++) { columns.RelativeColumn(50); }
});
for (int i = 0; i < 30; i++)
{
for (int j = 0; j < 5; j++)
{
if (i % 2 == 0)
{
if(j == 4)
{
if( i == 1)) {table.Cell().Element(CellStyle).Text(i.ToString()); }
}
else {table.Cell().RowSpan(2).Element(CellStyle).Text(i.ToString());}
else
{
if(j == 4) { table.Cell().RowSpan(2).Element(CellStyle).Text(i.ToString());}
}
}
}
table.Cell().ColumnSpan(6).Element(CellStyle).Text("");
});
});
});
});
然而在实际使用 QuestPDF 生成交错表格时会出现以下问题:
- 如果表格内存在某一列所有单元格都是未合并单元格,那么表格可以正常显示,反之则会出现表格错乱问题。
- 表格的间距明显与标准单元格宽,不够紧凑。
基于上述问题,本文不使用合并单元格方式生成表格,采用嵌套表格生成交错表格。
2 嵌套表格
static IContainer DefaultCellStyle(IContainer container, string colors)
{
return container.Border(0.5f).BorderColor(Colors.Black).Background(colors)
.PaddingVertical(2).PaddingHorizontal(4).AlignMiddle();
}
static IContainer HalfCellStyle(IContainer container)
{
return container.ScaleVertical(0.5f).PaddingVertical(2)
.PaddingHorizontal(4).AlignMiddle().ShowOnce();
}
static IContainer HeaderStyle(IContainer container)
{
DefaultCellStyle(container, Colors.Grey.Lighten3).AlignCenter();
}
static IContainer CellStyle(IContainer container)
{
DefaultCellStyle(container, Colors.White).ShowOnce().AlignCenter();
}
public void CreatePDF(string outputFile)
{
List<string[]> list = new List<string[]>();
for(int i = 0; i < 30; i++)
{
var text = i.ToString();
list.Add(new string[]{text, text, text, text, text});
}
var pdf_obj = Document.Create(document =>
{
document.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.PageColor(Colors.White);
//字体默认大小20号字体
page.DefaultTextStyle(x => x.FontFamily("simFang").FontSize(10));
page.Content().Column(column =>
{
column.Item().AlignCenter().Text("交错表格").FontSize(20);
column.Item().Text("").FontSize(8);
column.Item().Table(table =>
{
table.Header(header =>
{
for (int i = 0; i < 5; i++) { header.Cell().Element(HeaderStyle).Text($"标题{i}"); }
});
table.ColumnsDefinition(columns =>
{
for (int i = 0; i < 5; i++) { columns.RelativeColumn(50); }
});
for (int j = 0; j < 5; j++)
{
if (j == 4) { table.Cell().RowSpan(list.Count).Element((c) => HalfTable(c, list)); }
else { table.Cell().Element(CellStyle).Text(list[0][j]); }
}
for (int i = 0; i < list.Count; i++)
{
for (int j = 0; j < 5; j++)
{
if (j != 4) { table.Cell().Element(CellStyle).Text(list[i][j]); }
}
}
table.Cell().ColumnSpan(5).Element(CellStyle).Text("");
});
});
});
});
using (var steam = File.Create(outputFile))
{
pdf_obj .GeneratePdf(steam);
}
void HalfTable(IContainer container, List<string[]> list)
{
container.Table(table =>
{
table.ColumnsDefinition(columns => columns.RelativeColumn());
table.Cell().Element(HalfCellStyle).Text("");
for (int i = 1; i < list.Count; i++)
{
table.Cell().Element(CellStyle).Text(list[i][4]);
}
});
}
}
需要注意的是,交错行方式会存在以下情况,当表格长度过长,需要跨页时,跨页后的表格不再遵循交错排版,交错格会恢复到相同表格基准线,因此需要手动进行分页处理,固定每页行数,每页单独生成表格,保证排版一致。