C#實現(xiàn)將DataTable導(dǎo)出為PDF文檔
在許多業(yè)務(wù)系統(tǒng)中,從表格數(shù)據(jù)生成報表、發(fā)票或其他結(jié)構(gòu)化文檔是一項常見需求。這些數(shù)據(jù)通常存儲在 C# 的 DataTable 對象中,而問題在于:.NET 本身并不提供將 DataTable 直接渲染為 PDF 的能力。
本文將通過一個清晰、可落地的示例,介紹如何在 C# 中將 DataTable 導(dǎo)出為專業(yè)的 PDF 文檔。我們將借助第三方 PDF 組件,快速實現(xiàn)從表格數(shù)據(jù)到 PDF 報告的自動化生成。
為什么需要以編程方式生成 PDF
在 C# 應(yīng)用中,DataTable 常用于承載數(shù)據(jù)庫查詢結(jié)果或業(yè)務(wù)數(shù)據(jù)。雖然將其顯示在界面控件(如 DataGridView)中非常容易,但當(dāng)需要生成可分發(fā)、可歸檔、格式穩(wěn)定的文檔時,PDF 通常是更合適的選擇。
問題在于:
DataTable只是內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)- 它不具備任何文檔布局或渲染能力
- 手動繪制 PDF 內(nèi)容成本極高且難以維護
因此,實際開發(fā)中通常會引入專門的 PDF 生成庫,用于將表格數(shù)據(jù)映射為 PDF 表格,并自動處理分頁、布局和樣式。
項目準備:配置 C# PDF 導(dǎo)出環(huán)境
在開始導(dǎo)出 DataTable 之前,需要先完成項目和依賴的配置。
1. 創(chuàng)建 C# 項目
可以使用 控制臺應(yīng)用、WinForms、WPF 或 ASP.NET Core 項目,本文示例以控制臺程序為例,其他類型項目原理一致。
2. 安裝 PDF 組件(Spire.PDF)
通過 NuGet 安裝 Spire.PDF:
Install-Package Spire.PDF
或在 NuGet UI 中搜索 Spire.PDF 并安裝。
3. 引入命名空間
using System; using System.Data; using Spire.Pdf; using Spire.Pdf.Graphics; using Spire.Pdf.Tables; using System.Drawing; // 用于 Color 和 PointF
至此,項目已具備導(dǎo)出 PDF 的基本環(huán)境。
核心實現(xiàn):將 DataTable 轉(zhuǎn)換為 PDF
1. 準備示例 DataTable
下面的方法用于構(gòu)造一個示例 DataTable,作為 PDF 報表的數(shù)據(jù)來源。
public static DataTable GetSampleDataTable()
{
DataTable dataTable = new DataTable("Products");
// 定義列
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Category", typeof(string));
dataTable.Columns.Add("UnitPrice", typeof(decimal));
dataTable.Columns.Add("UnitsInStock", typeof(int));
// 添加示例數(shù)據(jù)行
dataTable.Rows.Add(1, "Chai", "Beverages", 18.00m, 39);
dataTable.Rows.Add(2, "Chang", "Beverages", 19.00m, 17);
dataTable.Rows.Add(3, "Aniseed Syrup", "Confections", 10.00m, 13);
dataTable.Rows.Add(4, "Chef Anton's Cajun Seasoning", "Condiments", 22.00m, 53);
dataTable.Rows.Add(5, "Chef Anton's Gumbo Mix", "Condiments", 21.35m, 0);
dataTable.Rows.Add(6, "Grandma's Boysenberry Spread", "Condiments", 25.00m, 120);
dataTable.Rows.Add(7, "Uncle Bob's Organic Dried Pears", "Produce", 30.00m, 15);
dataTable.Rows.Add(8, "Northwoods Cranberry Sauce", "Condiments", 40.00m, 6);
return dataTable;
}
2. 基礎(chǔ)版:將 DataTable 輸出為 PDF 表格
public static void ExportDataTableToPdf(DataTable dataTable, string filePath)
{
// 創(chuàng)建 PDF 文檔
PdfDocument doc = new PdfDocument();
PdfPageBase page = doc.Pages.Add();
// 添加標題
string title = "Product Inventory Report";
PdfFont titleFont = new PdfFont(PdfFontFamily.Helvetica, 20f, PdfFontStyle.Bold);
SizeF titleSize = titleFont.MeasureString(title);
float titleX = (page.Canvas.ClientSize.Width - titleSize.Width) / 2;
page.Canvas.DrawString(title, titleFont, PdfBrushes.DarkBlue, titleX, 20);
// 創(chuàng)建 PdfTable
PdfTable pdfTable = new PdfTable();
// 設(shè)置數(shù)據(jù)源
pdfTable.DataSource = dataTable;
// 表格樣式設(shè)置
pdfTable.Style.DefaultStyle.Font = new PdfFont(PdfFontFamily.Helvetica, 10f);
pdfTable.Style.HeaderStyle.Font = new PdfFont(PdfFontFamily.Helvetica, 11f, PdfFontStyle.Bold);
pdfTable.Style.HeaderStyle.BackgroundBrush = PdfBrushes.LightGray;
pdfTable.Style.ShowHeader = true; // 顯示表頭
// 繪制表格
PdfLayoutResult result = pdfTable.Draw(page, new PointF(0, 60));
// 保存文件
doc.SaveToFile(filePath);
doc.Close();
}
該方法中,PdfTable.DataSource 會自動將 DataTable 的列和行映射為 PDF 表格結(jié)構(gòu),這是整個導(dǎo)出的關(guān)鍵步驟。
3. 進階版:帶樣式的 PDF 報表
public static void ExportDataTableToPdfWithStyle(DataTable dataTable, string filePath)
{
// 創(chuàng)建 PDF 文檔
PdfDocument doc = new PdfDocument();
PdfPageBase page = doc.Pages.Add();
// 設(shè)置頁邊距
doc.PageSettings.Margins.All = 40;
// 添加標題
string title = "Detailed Product Inventory Report";
PdfFont titleFont = new PdfFont(PdfFontFamily.Helvetica, 24f, PdfFontStyle.Bold);
SizeF titleSize = titleFont.MeasureString(title);
float titleX = (page.Canvas.ClientSize.Width - titleSize.Width) / 2;
page.Canvas.DrawString(title, titleFont, PdfBrushes.DarkBlue, titleX, 20);
// 添加說明文字
string introduction = "This report provides an overview of current product inventory levels, detailing product ID, name, category, unit price, and units in stock.";
PdfFont introFont = new PdfFont(PdfFontFamily.Helvetica, 12f);
page.Canvas.DrawString(
introduction,
introFont,
PdfBrushes.Black,
new PointF(0, 60),
new PdfStringFormat(PdfStringFormatFlags.WordBreak) { MeasureTrailingSpaces = true }
);
// 計算表格起始位置
float tableY = 60 + introFont.MeasureString(introduction, page.Canvas.ClientSize.Width).Height + 20;
// 創(chuàng)建 PdfTable
PdfTable pdfTable = new PdfTable();
pdfTable.DataSource = dataTable;
// 表格樣式
pdfTable.Style.DefaultStyle.Font = new PdfFont(PdfFontFamily.Helvetica, 9f);
pdfTable.Style.HeaderStyle.Font = new PdfFont(PdfFontFamily.Helvetica, 10f, PdfFontStyle.Bold);
pdfTable.Style.HeaderStyle.BackgroundBrush = new PdfSolidBrush(Color.FromArgb(120, 180, 230));
pdfTable.Style.HeaderStyle.TextBrush = PdfBrushes.White;
pdfTable.Style.ShowHeader = true;
// 交替行背景色
pdfTable.Style.AlternateRowStyle.BackgroundBrush = new PdfSolidBrush(Color.LightYellow);
// 單元格內(nèi)邊距
pdfTable.Style.DefaultStyle.CellPadding = 5;
// 設(shè)置列寬
pdfTable.Columns[0].Width = 70f;
pdfTable.Columns[1].Width = 150f;
pdfTable.Columns[2].Width = 100f;
pdfTable.Columns[3].Width = 80f;
pdfTable.Columns[4].Width = 90f;
// 繪制表格(自動分頁)
PdfLayoutResult result = pdfTable.Draw(page, new PointF(0, tableY));
// 保存文件
doc.SaveToFile(filePath);
doc.Close();
}
輸出結(jié)果預(yù)覽

進階建議與最佳實踐
- 自動分頁:
PdfTable.Draw會在數(shù)據(jù)超出頁面時自動分頁 - 異常處理:建議對文件保存操作添加
try-catch - 性能考慮:超大數(shù)據(jù)量時注意內(nèi)存占用
- 動態(tài)列結(jié)構(gòu):可根據(jù)
dataTable.Columns動態(tài)配置列樣式
總結(jié)
通過引入 Spire.PDF for .NET,在 C# 中將 DataTable 導(dǎo)出為 PDF 變得簡單且高效。無論是基礎(chǔ)表格導(dǎo)出,還是帶樣式的正式報表,該方案都能滿足大多數(shù)業(yè)務(wù)系統(tǒng)的文檔生成需求。
這種方式不僅顯著減少了開發(fā)成本,也能穩(wěn)定地產(chǎn)出專業(yè)級 PDF 文檔,非常適合在企業(yè)級應(yīng)用中使用。
到此這篇關(guān)于C#實現(xiàn)將DataTable導(dǎo)出為PDF文檔的文章就介紹到這了,更多相關(guān)C# DataTable導(dǎo)出PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用C#和SQL Server實現(xiàn)自動化解決郵件數(shù)據(jù)的處理
本文將介紹如何利用 C# 和 SQL Server 構(gòu)建一個自動化解決方案,實現(xiàn)從郵件讀取、附件下載到數(shù)據(jù)庫更新的全流程自動化處理,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下2026-01-01
C#中通過Response.Headers設(shè)置自定義參數(shù)的代碼示例
這篇文章主要介紹了C#中通過Response.Headers設(shè)置自定義響應(yīng)頭的方法,涵蓋基礎(chǔ)添加、安全校驗、生產(chǎn)實踐及調(diào)試技巧,強調(diào)類型安全、敏感頭保護和編碼規(guī)范,適用于ASP.NET及Core框架,需要的朋友可以參考下2025-09-09
c#異步操作后臺運行(backgroundworker類)示例
這篇文章主要介紹了c#異步操作后臺運行(backgroundworker類)示例,需要的朋友可以參考下2014-04-04
C#多線程之Thread中Thread.IsAlive屬性用法分析
這篇文章主要介紹了C#多線程之Thread中Thread.IsAlive屬性用法,實例分析了C#判斷線程可用狀態(tài)的技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04
C#使用Task實現(xiàn)執(zhí)行并行任務(wù)的原理的示例詳解
Task是一個表示異步操作的類,它提供了一種簡單、輕量級的方式來創(chuàng)建多線程應(yīng)用程序。本文就來和大家聊聊在C#中如何使用Task執(zhí)行并行任務(wù)吧2023-04-04

