使用QuestPDF生成交错表格

交错表格指表格内的部分行与基准行不对齐,有一定的偏差。常见的交错表有:高程闭合自动计算表格、界址点表格等。示例如下:

在这里插入图片描述

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]);
            }
        });
    }
}

需要注意的是,交错行方式会存在以下情况,当表格长度过长,需要跨页时,跨页后的表格不再遵循交错排版,交错格会恢复到相同表格基准线,因此需要手动进行分页处理,固定每页行数,每页单独生成表格,保证排版一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值