FastReport 全方位教程:从入门到精通
FastReport 是一个功能强大、灵活且易于使用的报表生成器,支持 .NET, VCL, Java 等多种平台,它以其“代码优先”(Code-First)的设计理念而闻名,允许开发者在不使用复杂设计器的情况下,通过代码动态创建和修改报表。

第一部分:入门基础
什么是 FastReport?
FastReport 是一个独立的报表生成工具和类库,它的核心优势在于:
- 跨平台:支持 Windows (VCL, .NET WinForms, WPF), Linux, macOS, Web (ASP.NET Core, Blazor) 和移动端。
- 灵活性:既可以像 Word 一样“所见即所得”地设计报表,也可以通过 C# 或 VB.NET 代码完全在后台动态生成。
- 丰富功能:支持条形码、二维码、图表、交叉表、条带、矩阵、数据源(ADO.NET, LINQ, JSON, XML 等)等。
- 高性能:专为处理大量数据而优化。
安装 FastReport
- NuGet 包管理器(推荐):在 Visual Studio 中,通过 NuGet 包管理器控制台或界面安装
FastReport或FastReport.OpenSource(开源版本)。Install-Package FastReport
- 安装程序:从 FastReport 官网下载安装程序,安装后会在 Visual Studio 中集成报表设计器。
核心概念
在开始之前,必须理解 FastReport 的几个核心对象:
- Report:报表对象,是所有报表元素的容器,它定义了报表的整体结构、数据源和事件处理。
- DataBand:数据带,这是报表的核心,它会遍历数据源中的每一行记录,并为每一行重复其内部的控件,一个客户列表报表,
DataBand会为每个客户生成一行信息。 - TextObject:文本对象,用于在报表上显示静态文本(如“标题:”)或绑定到数据字段的动态文本(如
[CustomerName])。 - PageHeaderBand / PageFooterBand:页眉/页脚带,每一页的顶部和底部都会显示一次,通常用于显示页码、公司Logo、标题等。
- ReportHeaderBand / ReportFooterBand:报表头/报表尾,整个报表的开始和结束处只显示一次,通常用于显示报表总标题和总结信息。
- PictureObject:图片对象,用于显示图片,可以是静态的,也可以从数据库中动态加载。
- BarCodeObject:条码对象,用于生成各种类型的条码。
- DataTable:数据表,FastReport 使用自己的
DataTable对象作为数据源,你可以将ADO.NET的DataTable、List<T>、JSON字符串等填充到FastReport.Data命名空间下的DataTable中。
第二部分:创建你的第一个报表(设计器模式)
这是最直观的方式,适合初学者快速上手。
步骤 1:创建报表文件
- 在 Visual Studio 中,右键你的项目 -> 添加 -> 新建项。
- 选择 "FastReport Report" (.frx 文件),命名为
Report.frx。
步骤 2:设计报表布局
- 添加页眉:从工具箱中拖拽
TextObject到PageHeaderBand中,输入“客户列表”。 - 添加数据字段:
- 从 "Data" 窗口(通常在右侧)中,添加一个数据源,最简单的是添加一个
DataTable。 - 在
Data窗口中右键 -> Add -> Data Source -> 选择 "DataTable"。 - 右键新建的
DataTable-> Edit,添加几列,如ID,Name,City。 - 从
DataTable的字段(如Name,City)直接拖拽到DataBand中,FastReport 会自动为你创建TextObject并绑定字段。
- 从 "Data" 窗口(通常在右侧)中,添加一个数据源,最简单的是添加一个
- 添加页脚:拖拽一个
TextObject到PageFooterBand中,双击它,在属性窗口中找到 "Text" 属性,输入[Page#]来显示页码。
步骤 3:预览报表
- 在 Visual Studio 工具栏中,你会看到一个 "Preview" 按钮(通常是一个放大镜图标)。
- 点击它,FastReport 的预览窗口将会弹出,显示你设计的报表。
第三部分:在代码中动态使用报表
这是 FastReport 的强大之处,也是开发者最常用的方式。

步骤 1:准备数据
假设你有一个 Customer 类和一个 List<Customer>。
public class Customer
{
public int ID { get; set; }
public string Name { get; set; }
public string City { get; set; }
}
// 在你的窗体或控制器代码中
var customers = new List<Customer>
{
new Customer { ID = 1, Name = "张三", City = "北京" },
new Customer { ID = 2, Name = "李四", City = "上海" },
new Customer { ID = 3, Name = "王五", City = "广州" }
};
步骤 2:加载报表并填充数据
// 1. 创建报表对象
Report report = new Report();
// 2. 加载 .frx 报表文件
// 假设 Report.frx 文件已添加到项目的 "根目录" 或 "报表" 文件夹中,并设置为 "如果较新则复制"
report.Load("Report.frx");
// 3. 准备 FastReport 的数据源
// 将我们的 List<Customer> 转换为 FastReport 的 DataTable
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("City", typeof(string));
foreach (var customer in customers)
{
dt.Rows.Add(customer.ID, customer.Name, customer.City);
}
// 4. 将数据注册到报表中
// "Customers" 是我们在报表设计器中给数据源起的名字
report.RegisterData(dt, "Customers");
// 5. 预览报表
// 这会打开一个独立的预览窗口
report.Prepare();
report.Show();
关键点:
report.RegisterData(dt, "Customers")中的第二个参数"Customers"必须与你在报表设计器中给DataTable起的名字完全一致。- 如果没有
.frx文件,你可以完全用代码创建报表(见第四部分)。
第四部分:高级技巧与常用功能
参数化报表
允许在运行时向报表传递值,例如按城市筛选客户。
代码端:
// 1. 在报表中定义参数 (通常在报表设计器的 "Data" -> "Parameters" 中添加)
// 假设参数名为 "CityParam"
// 2. 在代码中设置参数值
report.SetParameterValue("CityParam", "北京"); // 传递参数值
// 3. 在报表设计器中使用参数
// 在 DataBand 的 "Filter" 属性中,可以写:[Customers.City] = '[CityParam]'
条件格式
根据数据值改变控件的样式(如字体颜色、背景色)。
操作:
- 选中
TextObject(例如显示City的文本框)。 - 在属性窗口中找到 "Conditions"。
- 添加一个新条件。
- 设置条件表达式,
[Customers.City] = '北京'。 - 设置满足条件时的样式,比如将
Font.Color设置为红色。
图片动态加载
从数据库或文件路径加载图片。
代码端:
// 假设 Customer 类有一个 ImagePath 属性
var customersWithImages = new List<Customer>
{
new Customer { ID = 1, Name = "张三", City = "北京", ImagePath = "logo.png" }
};
// ... (前面的代码相同)
// 在 Prepare() 之前,注册图片数据
report.PictureTable.Add("logo.png", System.Drawing.Image.FromFile("logo.png"));
// 在报表设计器中:
// 1. 添加一个 PictureObject 到 DataBand。
// 2. 在其属性中,设置 "Image" 属性为表达式:[PictureTable.Image('logo.png')]
// 或者,如果你的数据源中有图片路径,可以写:[PictureTable.Image([Customers.ImagePath])]
子报表
在一个报表中嵌套另一个报表。
操作:
- 在主报表的
DataBand中,拖入一个ChildObject。 - 在
ChildObject的属性中,指定要加载的子报表文件名(如SubReport.frx)。 - 子报表会自动继承主报表的数据源,你也可以在子报表中定义自己的数据源。
事件处理
使用 C# 代码控制报表的生成过程。
// 在 Prepare() 之前注册事件
report.BeforePagesAdd += Report_BeforePagesAdd;
// ...
private void Report_BeforePagesAdd(object sender, EventArgs e)
{
// 在生成每一页之前触发
// 可以在这里动态修改报表内容
// 获取报表标题文本框并修改其值
TextObject title = report.FindObject("txtReportTitle") as TextObject;
if (title != null)
{
title.Text = "动态生成的报表标题 - " + DateTime.Now.ToString();
}
}
导出报表
FastReport 可以将报表导出为多种格式。
// 在 Prepare() 之后 report.Prepare(); // 导出到 PDF 文件 report.Export(new PDFExport(), "MyReport.pdf"); // 导出到 Excel 文件 report.Export(new ExcelExport(), "MyReport.xlsx"); // 导出到 HTML 文件 report.Export(new HTMLExport(), "MyReport.html");
第五部分:最佳实践与提示
- 分层设计:对于复杂报表,将主报表、子报表、参数、数据源等分开管理,使结构更清晰。
- 命名规范:为报表、数据源、参数、控件等使用有意义的名称,方便后期维护。
- 使用脚本:FastReport 内置了脚本引擎(PascalScript),可以在报表设计器中编写复杂的逻辑,而无需修改 C# 代码,在
DataBand的OnBeforePrint事件中编写脚本。 - 性能优化:
- 只注册和加载需要的数据。
- 对于大数据量,考虑使用
DataBand的KeepTogether属性来控制分页逻辑,避免大块数据被分割到两页。 - 避免在报表循环中进行复杂的计算,尽量在数据加载前完成。
- 资源管理:在使用完
Report对象后,最好调用Dispose()方法,释放资源。
第六部分:学习资源
- 官方文档:FastReport 官网提供了最权威、最全面的文档和示例。
- 官方示例:安装 FastReport 后,通常会附带大量示例项目,是学习高级功能的最佳途径。
- 视频教程:在 YouTube 和 Bilibili 等平台搜索 "FastReport 教程",可以找到很多视频演示。
- 社区支持:FastReport 官方论坛和 Stack Overflow 上有大量开发者可以提问和交流。
希望这份详细的教程能帮助你快速掌握 FastReport!从简单的拖拽设计开始,逐步尝试代码动态生成,你会发现它是一个能极大提升你项目报表能力的强大工具。
