在C#开发中制作报表,通常需要结合数据获取、展示控件和样式设计三个环节,不同的业务场景可以选择不同的实现方案,下面介绍几种常用的C#报表开发方法。

使用DataGridView控件制作简单报表
如果只需要展示基础的表格数据,不需要复杂的排版和打印功能,使用Windows Forms自带的DataGridView控件是最快捷的方式。首先需要从数据库获取需要展示的数据,然后绑定到控件的DataSource属性即可。
以下是连接SQL Server数据库并将数据绑定到DataGridView的示例代码:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace ReportDemo
{
public partial class SimpleReportForm : Form
{
public SimpleReportForm()
{
InitializeComponent();
LoadReportData();
}
private void LoadReportData()
{
// 数据库连接字符串,实际使用时替换为自己的数据库信息
string connStr = "Server=127.0.0.1;Database=TestDB;User Id=sa;Password=123456;";
string sql = "SELECT 订单编号, 客户名称, 订单金额, 下单时间 FROM 订单表 WHERE 下单时间 >= '2024-01-01'";
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
DataTable dt = new DataTable();
adapter.Fill(dt);
// 将数据绑定到DataGridView控件
dataGridView1.DataSource = dt;
// 调整列宽自适应
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
}
}
}
使用ReportViewer控件制作标准报表
如果需要制作支持打印、分页、导出为PDF或Excel的标准报表,可以使用Visual Studio自带的ReportViewer控件,配合RDLC报表文件实现更丰富的报表功能。这种方式支持添加表头、表尾、统计汇总、图片等元素,适合正式的业务报表场景。
开发步骤
- 在项目中添加新建项,选择报表类型,创建RDLC报表文件
- 在报表文件中添加表格控件,绑定数据源字段
- 在窗体中拖入ReportViewer控件,关联创建好的RDLC报表文件
- 编写代码为报表提供数据源
以下是为ReportViewer控件提供数据源的示例代码:
using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Reporting.WinForms;
namespace ReportDemo
{
public partial class StandardReportForm : Form
{
public StandardReportForm()
{
InitializeComponent();
LoadReport();
}
private void LoadReport()
{
string connStr = "Server=127.0.0.1;Database=TestDB;User Id=sa;Password=123456;";
string sql = "SELECT 产品名称, 销售数量, 销售金额 FROM 销售明细表";
DataTable dt = new DataTable();
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
adapter.Fill(dt);
}
// 设置报表数据源
ReportDataSource rds = new ReportDataSource("SalesDataSet", dt);
reportViewer1.LocalReport.DataSources.Clear();
reportViewer1.LocalReport.DataSources.Add(rds);
// 指定RDLC报表文件路径,实际使用时替换为自己的报表路径
reportViewer1.LocalReport.ReportPath = "SalesReport.rdlc";
// 刷新报表显示
reportViewer1.RefreshReport();
}
}
}
自定义绘制复杂报表
如果报表有特殊的排版需求,比如需要合并单元格、自定义绘制表头样式、添加复杂的统计图表,也可以使用GDI+自定义绘制报表内容,这种方式灵活性最高,但是开发成本也相对更高,适合有特殊定制化需求的场景。
以下是使用GDI+在Panel控件上绘制简单报表表头的示例代码:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace ReportDemo
{
public partial class CustomReportForm : Form
{
public CustomReportForm()
{
InitializeComponent();
panel1.Paint += Panel1_Paint;
}
private void Panel1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
// 设置绘制质量
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
// 绘制报表标题
Font titleFont = new Font("微软雅黑", 16, FontStyle.Bold);
SolidBrush titleBrush = new SolidBrush(Color.Black);
string title = "2024年第一季度销售报表";
SizeF titleSize = g.MeasureString(title, titleFont);
float titleX = (panel1.Width - titleSize.Width) / 2;
g.DrawString(title, titleFont, titleBrush, titleX, 10);
// 绘制分隔线
Pen linePen = new Pen(Color.Gray, 1);
g.DrawLine(linePen, 10, 40, panel1.Width - 10, 40);
// 释放资源
titleFont.Dispose();
titleBrush.Dispose();
linePen.Dispose();
}
}
}
报表开发注意事项
- 数据库连接字符串不要硬编码在代码中,建议放在配置文件里方便后续修改
- 如果报表数据量较大,建议添加分页查询逻辑,避免一次性加载过多数据导致内存占用过高
- 导出报表时如果需要兼容旧版本的Office,建议生成xls格式而不是xlsx格式
- 报表的样式尽量保持统一,字体、颜色、间距符合项目的整体设计规范
C#报表开发DataGridViewReportViewerSQL_Server修改时间:2026-06-15 20:36:44