QuestPDF添加第二张表格后第一张表格消失的问题处理
QuestPDF多表格显示问题解决方案
问题1:添加第二张表格后第一张消失的原因
QuestPDF中page.Content()方法的设计是每次调用都会重置页面的内容容器,而非追加内容。你先后两次调用page.Content().Table(...),第二次调用会完全覆盖第一次设置的内容,导致第一张表格被替换,最终只显示第二张表格。
问题2:修改代码实现同页显示两张表格
需要将两张表格放入同一个page.Content()容器内,通过Stack布局(默认垂直方向)来依次排列两个表格,确保内容被追加而非替换。
修改后的完整代码
using QuestPDF.Fluent; using QuestPDF.Helpers; using QuestPDF.Infrastructure; using QuestPDF.Previewer; namespace HTMLToPDFWithQuestPDF { class Program { static void Main(string[] args) { var document = Document.Create(container => { container.Page(page => { page.Size(PageSizes.Letter); page.Margin(1, Unit.Centimetre); page.PageColor(Colors.White); page.DefaultTextStyle(x => x.FontSize(10)); page.DefaultTextStyle(x => x.FontFamily(Fonts.Calibri)); page.Header() .AlignRight() .Text("Appendix 1") .FontFamily("Arial") .FontSize(10) .LineHeight(1.5f) .FontColor(Colors.Green.Lighten1); // 将两张表格放入同一个Content容器的Stack中 page.Content().Stack(stack => { // 第一张表格 stack.Item().Table(table => { table.ColumnsDefinition(columns => { columns.RelativeColumn(); columns.RelativeColumn(); columns.RelativeColumn(); columns.RelativeColumn(); }); // 复用Block样式配置 table.Cell() .ColumnSpan(4) .Row(1) .Column(1) .Element(Block) .Text("PURCHASE ORDER") .Bold() .FontSize(20); table.Cell().ColumnSpan(2).Row(2).Column(1).Element(Block); table.Cell() .ColumnSpan(4) .Row(2) .Column(1) .Padding(5) .Text( "Barangay: " + "\n" + "Tel. No:" ) .LineHeight(1f) .FontSize(10); table.Cell().ColumnSpan(2).Row(2).Column(3).Element(Block); table.Cell() .ColumnSpan(2) .Row(2) .Column(3) .Padding(5) .Text( "City Municipality: " + "\n" + "Province: " ) .LineHeight(1f) .FontSize(10); table.Cell().ColumnSpan(2).Row(3).Column(1).Element(Block); table.Cell() .ColumnSpan(2) .Row(3) .Column(1) .Padding(5) .Text( "Supplier: " + "\n" + "Address: " ) .LineHeight(1f) .FontSize(10); table.Cell().ColumnSpan(2).Row(3).Column(3).Element(Block); table.Cell() .ColumnSpan(2) .Row(3) .Column(3) .Padding(5) .Text( "P.O. No.: " + "\n" + "Date: " ) .LineHeight(1f) .FontSize(10); table.Cell().ColumnSpan(2).Row(4).Column(1).Element(Block); table.Cell().ColumnSpan(2).Row(4).Column(1) .Padding(5) .Text( "TIN:") .FontSize(10); table.Cell().ColumnSpan(2).Row(4).Column(3).Element(Block); table.Cell().ColumnSpan(2).Row(4).Column(3) .Padding(5) .Text( "Mode of Procurement:" + "\n" + "Bidding Negotiated Over the Counter") .FontSize(10); table.Cell().ColumnSpan(4).Row(5).Column(1).Element(Block); table.Cell() .ColumnSpan(4) .Row(5) .Column(1) .Padding(5) .Text( "Gentlemen:" + "\n" + " Please deliver to this Office the following articles subject to the terms and conditions contained herein.") .FontSize(10); table.Cell().ColumnSpan(2).Row(6).Column(1).Element(Block); table.Cell().ColumnSpan(2).Row(6).Column(1) .Padding(5) .Text( "Place of Delivery: " + "\n" + "Date of Delivery: " ) .LineHeight(1) .FontSize(10); table.Cell().ColumnSpan(2).Row(6).Column(3).Element(Block); table.Cell().ColumnSpan(2).Row(6).Column(3) .Padding(5) .Text( "Delivery Term: " + "\n" + "Payment Term: " ) .LineHeight(1) .FontSize(10); }); // 可选:给两张表格添加垂直间距 stack.Item().PaddingVertical(10); // 第二张表格 stack.Item().Table(newTable => { newTable.ColumnsDefinition(columns => { columns.RelativeColumn(); columns.RelativeColumn(); columns.RelativeColumn(); }); newTable.Cell() .ColumnSpan(3) .Row(1) .Column(1) .Element(Block) .Text("Second Table Content") .Bold() .FontSize(16); }); }); page.Footer() .AlignCenter() .Text(x => { x.Span("Page "); x.CurrentPageNumber(); }); }); }); document.ShowInPreviewer(); } static IContainer Block(IContainer container) { return container .Border(0.5f) .ShowOnce() .MinWidth(50) .MinHeight(25) .AlignCenter() .AlignMiddle(); } } }
关键修改点
- 将原来两次独立的
page.Content().Table(...)调用,合并到同一个page.Content().Stack(...)容器中 - 用
stack.Item()分别包裹两个表格,实现垂直排列 - 可选添加
stack.Item().PaddingVertical(10)来给两张表格之间增加间距,提升可读性
内容的提问来源于stack exchange,提问作者Svene
相关产品推荐
相关产品推荐

