在日常的企業系統開發和數據處理場景中,生成包含結構化信息的 PDF 報表是一項非常常見的需求。無論是業務清單、統計數據、還是系統導出的資料,表格通常都是呈現信息最直接、最清晰的方式。因此,如何在 PDF 中靈活繪製表格、控制樣式、綁定數據,成為許多 .NET 開發者的關鍵任務之一。
在這一需求下,Free Spire.PDF for .NET 提供了兩種常用的表格繪製機制:PdfTable 和 PdfGrid。它們分別面向不同的應用場景,支持自動樣式、單元格格式控制、數據綁定等功能。本文將結合示例代碼,深入介紹兩者的使用方式、外觀設置以及核心差異,並幫助你在 C# 中快速構建專業、美觀的 PDF 表格佈局。
1. 使用 PdfTable 繪製數據表格
PdfTable 支持直接綁定 DataTable 或自定義集合,適合用於動態報表生成。下面演示如何創建一個包含員工信息的表格,並設置交替行顏色、表頭樣式和單元格對齊方式。
using System;
using System.Data;
using System.Drawing;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Tables;
namespace PdfTableDemo
{
class Program
{
static void Main(string[] args)
{
PdfDocument doc = new PdfDocument();
PdfPageBase page = doc.Pages.Add(PdfPageSize.A4, new PdfMargins(40));
// 創建 PdfTable
PdfTable table = new PdfTable();
table.Style.DefaultStyle.Font = new PdfTrueTypeFont(new Font("微軟雅黑", 11f, FontStyle.Regular), true);
table.Style.HeaderStyle.Font = new PdfTrueTypeFont(new Font("微軟雅黑", 12f, FontStyle.Bold), true);
// 構造數據源
DataTable dt = new DataTable();
dt.Columns.Add("員工ID");
dt.Columns.Add("姓名");
dt.Columns.Add("部門");
dt.Columns.Add("職位");
dt.Columns.Add("級別");
dt.Rows.Add(new string[] { "101", "張偉", "技術部", "開發工程師", "2" });
dt.Rows.Add(new string[] { "102", "李娜", "人事部", "主管", "1" });
dt.Rows.Add(new string[] { "103", "王強", "市場部", "專員", "2" });
dt.Rows.Add(new string[] { "104", "劉芳", "市場部", "經理", "1" });
dt.Rows.Add(new string[] { "105", "趙敏", "技術部", "測試工程師", "2" });
table.DataSource = dt;
table.Style.ShowHeader = true;
// 表頭樣式
table.Style.HeaderStyle.BackgroundBrush = PdfBrushes.DarkBlue;
table.Style.HeaderStyle.TextBrush = PdfBrushes.White;
table.Style.HeaderStyle.StringFormat = new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle);
// 單元格居中
for (int i = 0; i < table.Columns.Count; i++)
{
table.Columns[i].StringFormat = new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle);
}
// 交替行顏色
table.BeginRowLayout += (sender, args) =>
{
args.MinimalHeight = 22f;
if (args.RowIndex < 0) return;
args.CellStyle.BackgroundBrush = args.RowIndex % 2 == 0 ? PdfBrushes.White : PdfBrushes.LightGray;
};
table.Draw(page, new PointF(0, 40));
doc.SaveToFile("PdfTableExample.pdf");
}
}
}
表格預覽:
關鍵點解析:
- 數據源綁定:
PdfTable.DataSource可以直接綁定DataTable或集合對象,自動生成行列。 - 表頭顯示:通過
ShowHeader = true顯示錶頭,結合字體、背景色設置可以快速美化。 - 行樣式控制:
BeginRowLayout事件允許對每行高度、背景色進行動態設置,實現交替行顏色。 - 單元格對齊:
PdfStringFormat控制水平與垂直對齊方式,使表格內容整齊。
PdfTable 更適合報表類數據展示,尤其是行列數固定或來源於數據庫的數據表。
2. 使用 PdfGrid 繪製自定義表格
PdfGrid 更適合用於自由佈局的表格,如需要合併單元格、跨行跨列或複雜邊框樣式的場景。下面示例演示一個訂單信息表格,包含單元格合併和自定義邊框。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Grid;
using System.Drawing;
namespace PdfGridDemo
{
class Program
{
static void Main(string[] args)
{
PdfDocument doc = new PdfDocument();
PdfPageBase page = doc.Pages.Add(PdfPageSize.A4, new PdfMargins(40));
PdfGrid grid = new PdfGrid();
grid.Columns.Add(4);
grid.Style.CellPadding = new PdfPaddings(3, 3, 3, 3);
grid.Style.Font = new PdfTrueTypeFont(new Font("微軟雅黑", 12f, FontStyle.Regular), true);
PdfGridRow rowTitle = grid.Rows.Add();
PdfGridRow rowHeader = grid.Rows.Add();
PdfGridRow row1 = grid.Rows.Add();
PdfGridRow row2 = grid.Rows.Add();
// 設置標題跨列
rowTitle.Cells[0].Value = "訂單信息表";
rowTitle.Cells[0].ColumnSpan = 4;
rowTitle.Cells[0].Style.BackgroundBrush = PdfBrushes.Orange;
rowTitle.Cells[0].StringFormat = new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle);
// 設置表頭
rowHeader.Cells[0].Value = "訂單號";
rowHeader.Cells[1].Value = "日期";
rowHeader.Cells[2].Value = "客户";
rowHeader.Cells[3].Value = "已付款";
foreach (PdfGridCell cell in rowHeader.Cells)
{
cell.Style.BackgroundBrush = PdfBrushes.DarkBlue;
cell.Style.TextBrush = PdfBrushes.White;
cell.StringFormat = new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle);
}
// 填充數據
row1.Cells[0].Value = "A1001";
row1.Cells[1].Value = "2025/11/01";
row1.Cells[2].Value = "星辰地產";
row1.Cells[3].Value = "是";
row2.Cells[0].Value = "A1002";
row2.Cells[1].Value = "2025/11/02";
row2.Cells[2].Value = "華夏科技";
row2.Cells[3].Value = "否";
// 設置行/列合併示例
row1.Cells[2].RowSpan = 2; // 客户列跨兩行
// 設置邊框
PdfBorders borders = new PdfBorders();
borders.All = new PdfPen(Color.Orange, 0.7f);
foreach (PdfGridRow r in grid.Rows)
{
foreach (PdfGridCell c in r.Cells)
{
c.Style.Borders = borders;
}
}
grid.Draw(page, new PointF(0, 50));
doc.SaveToFile("PdfGridExample.pdf");
}
}
}
表格預覽:
關鍵點解析:
- 自由佈局:
PdfGrid可靈活設置單元格的跨行 (RowSpan) 和跨列 (ColumnSpan)。 - 樣式靈活:每個單元格都可以單獨設置背景色、邊框、對齊方式。
- 適合複雜表格:如果表格不規則、需要突出標題或合併單元格,
PdfGrid的控制力更強。
3. PdfTable 與 PdfGrid 的區別
雖然 PdfTable 和 PdfGrid 都可以繪製表格,但它們的適用場景略有不同:
- 數據綁定:
PdfTable支持直接綁定DataTable或集合,適合報表型表格;PdfGrid更適合手動構建每個單元格的數據。 - 樣式控制:
PdfGrid可以單獨設置每個單元格樣式、跨行跨列、邊框更靈活;PdfTable更注重批量樣式統一。 - 複雜表格:涉及跨行、跨列、特殊邊框和自定義佈局時,
PdfGrid優勢明顯;需要快速生成數據表格時,PdfTable更高效。
總結來説,如果你的需求是數據庫或集合驅動的報表,選擇 PdfTable;如果是自由佈局或跨行跨列表格,PdfGrid 更合適。
總結
本文展示了 C# 使用 Spire.PDF 繪製 PDF 表格 的兩種方式:PdfTable 與 PdfGrid。通過示例代碼可以看到:
- PdfTable:適合綁定數據源,支持表頭、交替行顏色、單元格對齊,快速生成報表表格。
- PdfGrid:適合自由佈局,支持單元格合併、邊框和背景顏色自定義,適合複雜或不規則表格。
掌握這兩類表格的使用方法,可以幫助開發者在生成 PDF 報表時靈活應對不同需求,無論是企業內部報表、財務清單還是訂單信息,都可以輕鬆實現高質量輸出。