C#实现将DataTable导出为PDF文档

 更新时间:2026年01月18日 08:22:32   作者:用户835629078051  
本文将通过一个清晰,可落地的示例,介绍如何在 C# 中将 DataTable 导出为专业的 PDF 文档,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

在许多业务系统中,从表格数据生成报表、发票或其他结构化文档是一项常见需求。这些数据通常存储在 C# 的 DataTable 对象中,而问题在于:.NET 本身并不提供将 DataTable 直接渲染为 PDF 的能力

本文将通过一个清晰、可落地的示例,介绍如何在 C# 中将 DataTable 导出为专业的 PDF 文档。我们将借助第三方 PDF 组件,快速实现从表格数据到 PDF 报告的自动化生成。

为什么需要以编程方式生成 PDF

在 C# 应用中,DataTable 常用于承载数据库查询结果或业务数据。虽然将其显示在界面控件(如 DataGridView)中非常容易,但当需要生成可分发、可归档、格式稳定的文档时,PDF 通常是更合适的选择。

问题在于:

  • DataTable 只是内存中的数据结构
  • 它不具备任何文档布局或渲染能力
  • 手动绘制 PDF 内容成本极高且难以维护

因此,实际开发中通常会引入专门的 PDF 生成库,用于将表格数据映射为 PDF 表格,并自动处理分页、布局和样式。

项目准备:配置 C# PDF 导出环境

在开始导出 DataTable 之前,需要先完成项目和依赖的配置。

1. 创建 C# 项目

可以使用 控制台应用、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

至此,项目已具备导出 PDF 的基本环境。

核心实现:将 DataTable 转换为 PDF

1. 准备示例 DataTable

下面的方法用于构造一个示例 DataTable,作为 PDF 报表的数据来源。

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

    // 添加示例数据行
    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. 基础版:将 DataTable 输出为 PDF 表格

public static void ExportDataTableToPdf(DataTable dataTable, string filePath)
{
    // 创建 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);

    // 创建 PdfTable
    PdfTable pdfTable = new PdfTable();

    // 设置数据源
    pdfTable.DataSource = dataTable;

    // 表格样式设置
    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 表格结构,这是整个导出的关键步骤。

3. 进阶版:带样式的 PDF 报表

public static void ExportDataTableToPdfWithStyle(DataTable dataTable, string filePath)
{
    // 创建 PDF 文档
    PdfDocument doc = new PdfDocument();
    PdfPageBase page = doc.Pages.Add();

    // 设置页边距
    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;

    // 创建 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);

    // 单元格内边距
    pdfTable.Style.DefaultStyle.CellPadding = 5;

    // 设置列宽
    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();
}

输出结果预览

进阶建议与最佳实践

  • 自动分页PdfTable.Draw 会在数据超出页面时自动分页
  • 异常处理:建议对文件保存操作添加 try-catch
  • 性能考虑:超大数据量时注意内存占用
  • 动态列结构:可根据 dataTable.Columns 动态配置列样式

总结

通过引入 Spire.PDF for .NET,在 C# 中将 DataTable 导出为 PDF 变得简单且高效。无论是基础表格导出,还是带样式的正式报表,该方案都能满足大多数业务系统的文档生成需求。

这种方式不仅显著减少了开发成本,也能稳定地产出专业级 PDF 文档,非常适合在企业级应用中使用。

到此这篇关于C#实现将DataTable导出为PDF文档的文章就介绍到这了,更多相关C# DataTable导出PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#将List转换为只读的List方法与技巧

    C#将List转换为只读的List方法与技巧

    在 C# 编程的广阔世界里,数据的安全性与稳定性始终是我们关注的焦点,当涉及到集合数据的处理时,有时我们会面临这样一个关键需求:将List转换为只读的List,所以本文给大家介绍了使用C#将List转换为只读的List的方法与技巧,需要的朋友可以参考下
    2025-01-01
  • C#实现打造气泡屏幕保护效果

    C#实现打造气泡屏幕保护效果

    本文是介给大家介绍一个很好玩的小程序:气泡屏幕保护!类似于windows的屏保功能,有需要的朋友可以参考一下。
    2016-10-10
  • C#连接到sql server2008数据库的实例代码

    C#连接到sql server2008数据库的实例代码

    这篇文章主要介绍了C#连接到sql server2008数据库的实例代码,需要的朋友可以参考下
    2017-09-09
  • Unity色子的投掷和点数的获得详析

    Unity色子的投掷和点数的获得详析

    这篇文章主要给大家介绍了关于Unity色子的投掷和点数的获得的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • C#实现批量给图片添加水印的示例代码

    C#实现批量给图片添加水印的示例代码

    这篇文章主要为大家详细介绍了如何利用C#实现批量给图片添加水印的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C#处理猜拳问题的简单实例(非窗体)

    C#处理猜拳问题的简单实例(非窗体)

    下面小编就为大家带来一篇C#处理猜拳问题的简单实例(非窗体)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • C# MemoryStream中ToArray和GetBuffer的区别小小结

    C# MemoryStream中ToArray和GetBuffer的区别小小结

    MemoryStream 中的 GetBuffer() 和 ToArray() 是两个用于获取流数据的方法,核心区别在于数据范围、内存占用和安全性,本文就来介绍一下两者的区别,感兴趣的额可以了解一下
    2025-07-07
  • C# 函数覆盖总结学习(推荐)

    C# 函数覆盖总结学习(推荐)

    下面小编就为大家带来一篇C# 函数覆盖总结学习(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • C#中字符串与字节数组的转换方式

    C#中字符串与字节数组的转换方式

    这篇文章介绍了C#中字符串与字节数组的转换方式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#封装DBHelper类

    C#封装DBHelper类

    DBHelper类是用类将ADO.NET用方法封装起来,用以减少程序员的工作量。本文为大家提供一个C#封装的DBHelper类,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05

最新评论