业务报表生成:通过 C# 将数据库导出为 PDF
2026/7/22 18:17:58 网站建设 项目流程

一、实现思路与技术路径
整体实现分为三个核心阶段:

数据读取:使用 ADO.NET 连接数据库,执行 SQL 查询并将结果集填充到 DataTable 对象中
数据写入:调用 Free Spire.XLS 的 InsertDataTable 方法,将 DataTable 批量写入 Excel 工作表
格式转换:通过内置转换引擎将工作表直接输出为 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 数据库连接与数据查询
///
/// 从数据库查询数据并填充到 DataTable
///
/// 数据库连接字符串
/// 查询 SQL 语句
/// 填充后的 DataTable
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
///
/// 将 DataTable 数据导出为 PDF 文件
///
/// 数据源
/// PDF 输出路径
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;

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询