C#使用Free Spire.XLS for .NET实现将SQL数据导出为PDF文件

 更新时间:2026年07月17日 08:24:42   作者:咕白m625  
在企业应用开发中,将数据库查询结果导出为 PDF 格式是常见的报表需求,本文主要介绍了一种基于 Free Spire.XLS for .NET 免费库的实现方式,有需要的小伙伴可以了解下

在企业应用开发中,将数据库查询结果导出为 PDF 格式是常见的报表需求。PDF 具备格式固定、跨平台兼容、便于归档分发等特性,非常适合用于业务数据的正式输出。本文介绍一种基于 Free Spire.XLS for .NET 免费库的实现方式,通过「数据库 → DataTable → Excel 工作表 → PDF」的路径完成数据导出,全程无需依赖 Microsoft Office 环境。

一、实现思路与技术路径

整体实现分为三个核心阶段:

  1. 数据读取:使用 ADO.NET 连接数据库,执行 SQL 查询并将结果集填充到 DataTable 对象中
  2. 数据写入:调用 Free Spire.XLS 的 InsertDataTable 方法,将 DataTable 批量写入 Excel 工作表
  3. 格式转换:通过内置转换引擎将工作表直接输出为 PDF 文件

该方案的优势在于利用 Excel 作为中间载体,可以灵活设置表头样式、列宽、边框等格式,再统一转换为 PDF,相比直接绘制 PDF 表格,开发效率更高。

二、环境准备

2.1 安装依赖包

在 Visual Studio 的 NuGet 包管理器中安装以下两个包:

  • 表格处理库:FreeSpire.XLS
  • SQL Server 数据提供程序:Microsoft.Data.SqlClient(若使用其他数据库,替换为对应驱动包即可)

包管理器控制台安装命令:

Install-Package FreeSpire.XLS
Install-Package Microsoft.Data.SqlClient

2.2 引入命名空间

在代码文件头部引入所需命名空间:

using Spire.Xls;
using System.Data;
using Microsoft.Data.SqlClient;
using System.Drawing;

2.3 版本说明

本文使用的免费版本支持基础的 Excel 编辑与 PDF 转换能力,免费版存在页数限制,PDF 输出仅转换前 3 页内容,适合小规模数据报表场景。

三、完整代码实现

以下示例演示从 SQL Server 数据库读取产品表数据,写入 Excel 并设置基础样式,最终导出为 PDF 文件的完整流程。

3.1 数据库连接与数据查询

/// <summary>
/// 从数据库查询数据并填充到 DataTable
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="sqlQuery">查询 SQL 语句</param>
/// <returns>填充后的 DataTable</returns>
private static DataTable GetDataFromDatabase(string connectionString, string sqlQuery)
{
    DataTable dataTable = new DataTable();

    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter(sqlQuery, conn);
        try
        {
            adapter.Fill(dataTable);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"数据读取失败:{ex.Message}");
            throw;
        }
    }
    return dataTable;
}

3.2 数据写入 Excel 并导出 PDF

/// <summary>
/// 将 DataTable 数据导出为 PDF 文件
/// </summary>
/// <param name="dataTable">数据源</param>
/// <param name="outputPdfPath">PDF 输出路径</param>
public static void ExportDataTableToPdf(DataTable dataTable, string outputPdfPath)
{
    // 创建工作簿,using 语句自动释放资源
    using (Workbook workbook = new Workbook())
    {
        Worksheet sheet = workbook.Worksheets[0];
        sheet.Name = "数据报表";

        // 将 DataTable 批量写入工作表,参数:数据源、是否显示列名、起始行、起始列
        sheet.InsertDataTable(dataTable, true, 1, 1);

        // 自动获取已填充数据的单元格区域,无需手动计算行列
        CellRange usedRange = sheet.AllocatedRange;

        // 设置表头样式(第一行)
        CellRange headerRange = sheet.Range[1, 1, 1, dataTable.Columns.Count];
        headerRange.Style.Font.IsBold = true;
        headerRange.Style.Font.Size = 11;
        headerRange.Style.Color = Color.LightSkyBlue;
        headerRange.Style.HorizontalAlignment = HorizontalAlignType.Center;
        headerRange.Style.VerticalAlignment = VerticalAlignType.Center;

        // 快速设置全数据区域边框(外边框+内部分隔线)
        usedRange.BorderAround(LineStyleType.Thin);
        usedRange.BorderInside(LineStyleType.Thin);

        // 设置全数据区域居中对齐
        usedRange.Style.HorizontalAlignment = HorizontalAlignType.Center;
        usedRange.Style.VerticalAlignment = VerticalAlignType.Center;

        // 仅对有数据的列执行自适应,提升性能
        usedRange.AutoFitColumns();

        // 页面设置:表格内容在页面中水平居中
        sheet.PageSetup.CenterHorizontally = true;

        // 导出为 PDF 文件
        workbook.SaveToFile(outputPdfPath, FileFormat.PDF);
    }
}

3.3 主程序调用示例

static void Main(string[] args)
{
    // 数据库连接字符串
    string connString = "Server=localhost\\SQLEXPRESS;Database=SalesDB;User ID=demouser;Password=YourPassword;Encrypt=true;TrustServerCertificate=true;";

    // 查询 SQL
    string sql = @"
    SELECT 
        o.OrderID AS 订单编号,
        c.CustomerName AS 客户名称,
        o.OrderDate AS 订单日期,
        o.TotalAmount AS 订单金额
    FROM Orders o
    JOIN Customers c ON o.CustomerID = c.CustomerID
    WHERE YEAR(o.OrderDate) = 2026;
";
  
  
    // PDF 输出路径
    string outputPath = @"D:\Reports\SalesReport_2026.pdf";

    try
    {
        DataTable data = GetDataFromDatabase(connString, sql);
        ExportDataTableToPdf(data, outputPath);
        Console.WriteLine($"PDF 导出成功,文件已保存至:{outputPath}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"导出流程出错:{ex.Message}");
    }

    Console.ReadKey();
}

四、PDF 输出优化建议

4.1 页面方向与尺寸

对于列数较多的宽表,建议设置为横向打印以避免内容被截断:

sheet.PageSetup.Orientation = PageOrientationType.Landscape;
sheet.PageSetup.PaperSize = PaperSizeType.PaperA4;

4.2 缩放适配

开启页面自适应,确保所有列能在一页宽度内显示:

workbook.ConverterSetting.SheetFitToWidth = 1;
workbook.ConverterSetting.SheetFitToPage = false;

以上方案提供了一条清晰的数据库到 PDF 的导出路径,代码结构简单且易于扩展。开发者可在此基础上根据业务需求增加表头合并、条件格式、合计行等高级报表特性。

到此这篇关于C#使用Free Spire.XLS for .NET实现将SQL数据导出为PDF文件的文章就介绍到这了,更多相关C# SQL数据导出为PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • unity实现绘画功能

    unity实现绘画功能

    这篇文章主要为大家详细介绍了unity实现绘画功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • RSA密钥--JAVA和C#的区别及联系

    RSA密钥--JAVA和C#的区别及联系

    这篇文章主要介绍了关于RSA密钥事件JAVA和C#的区别及联系,文章从RSA语法介绍开始展开详细介绍了C#转JAVA及JAVA转C#,需要的小伙伴可以可以参考一下
    2021-10-10
  • C#向线程中传递多个参数的解决方法(两种)

    C#向线程中传递多个参数的解决方法(两种)

    这篇文章主要介绍了C#向线程中传递多个参数的解决方法(两种)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • 基于Silverlight打印的使用详解,是否为微软的Bug问题

    基于Silverlight打印的使用详解,是否为微软的Bug问题

    本篇文章对Silverlight打印的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#私有构造函数使用示例

    C#私有构造函数使用示例

    本文主要介绍了C#私有构造函数使用方法,私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例
    2014-01-01
  • C#传递参数到线程的方法汇总

    C#传递参数到线程的方法汇总

    这篇文章主要介绍了C#传递参数到线程的方法,非常实用,需要的朋友可以参考下
    2014-08-08
  • C#实现写入文本文件内容的方法

    C#实现写入文本文件内容的方法

    这篇文章主要介绍了C#实现写入文本文件内容的方法,涉及C#针对文本文件的判断、创建及写入等相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#利用PrintDocument定制打印单据的小例子

    C#利用PrintDocument定制打印单据的小例子

    这篇文章主要给大家介绍了关于C#利用PrintDocument定制打印单据的小例子,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • c# 常见文件路径Api的使用示例

    c# 常见文件路径Api的使用示例

    c#编程中经常有遇到要处理文件路径的需求,本文分别讲述了如何从程序下面的文件和临时目录下的文件去使用路径api,感兴趣的朋友可以了解下
    2021-05-05
  • Winform中进行MD5加密的实例

    Winform中进行MD5加密的实例

    下面小编就为大家带来一篇Winform中进行MD5加密的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01

最新评论