FastReport 完全教程:从入门到精通
FastReport 是一个功能强大、灵活且易于使用的报表生成工具,支持 .NET, VCL, Java 等多种平台,它不仅可以生成静态报表,还能创建交互式、参数化、分组、主/明细等复杂报表。

目录
-
第一部分:FastReport 基础
- 什么是 FastReport?
- 为什么选择 FastReport?
- 安装与准备
- 核心概念:报表、数据、对象
-
第二部分:创建你的第一个报表
- 步骤 1:创建新报表
- 步骤 2:连接数据源
- 步骤 3:设计报表布局
- 步骤 4:预览和导出报表
-
第三部分:核心功能详解
- 数据绑定:如何将数据与报表元素关联
- 参数:实现动态和交互式报表
- 变量:在报表中进行计算和统计
- 分组:创建结构清晰的分组报表
- 主/明细报表:处理多表关联数据
- 条件格式:根据数据动态改变样式
-
第四部分:进阶技巧
(图片来源网络,侵删)- 脚本编程:使用 C# 或 VB.NET 增强报表功能
- 交叉表:创建数据透视表风格的报表
- 条形码和二维码:添加识别码
- 子报表:在报表中嵌入其他报表
- 图表:将数据可视化
-
第五部分:在应用程序中使用报表
- WinForms 集成
- ASP.NET Web Forms 集成
- ASP.NET Core 集成
- Blazor 集成
第一部分:FastReport 基础
什么是 FastReport?
FastReport 是一个独立的报表生成器,它允许开发者或最终用户设计、生成和打印各种格式的报表,它提供了可视化的报表设计器,用户可以通过拖放控件来设计报表布局,无需编写大量代码。
为什么选择 FastReport?
- 功能强大:支持几乎所有常见的报表类型,包括列表、分组、主/明细、交叉表、图表等。
- 高度灵活:通过脚本编程,可以实现几乎任何自定义逻辑。
- 易于集成:为所有主流 .NET 框架(WinForms, WPF, ASP.NET, Blazor)提供了预构建的控件,集成非常简单。
- 多平台支持:除了 .NET,还支持 Delphi (VCL), C++ Builder, Java 等。
- 丰富的导出格式:支持导出为 PDF, Excel, Word, HTML, Image, XML, CSV 等。
安装与准备
- 下载:访问 FastReport 官方网站 下载适合你平台的版本(.NET 版本)。
- 安装:按照安装向导完成安装,安装程序通常会自动将必要的 DLL 文件添加到 Visual Studio 的工具箱中。
- 验证:在 Visual Studio 中,右键点击工具箱 -> “选择项” -> “COM 组件” 或 “.NET Framework 组件”,确保能看到
FastReport相关的控件(如FastReport.Web,FastReport.Win等)。
核心概念
- 报表:一个
.frx文件,是报表设计的核心,包含了所有数据、对象、脚本和布局信息。 - 数据源:报表的数据来源,可以是:
- DataSet:最常用的数据源,来自数据库查询或内存数据。
- DataTable:DataSet 中的一个表。
- IEnumerable / List:任何可枚举的集合。
- XML:直接从 XML 文件读取数据。
- 对象:报表设计器中的可视化元素,用于显示数据和装饰报表。
- Text:用于显示文本,如标题、字段值。
- Table:用于以表格形式显示数据。
- Matrix:用于创建交叉表。
- Picture:用于显示图片。
- Barcode:用于生成条形码。
- Line, Rectangle:用于绘制图形。
第二部分:创建你的第一个报表
我们将创建一个简单的列表报表,显示产品信息。
步骤 1:创建新报表
- 在 Visual Studio 中,右键你的项目 -> 添加 -> 新建项。
- 选择 "FastReport Report" (
.frx文件),命名为ProductsReport.frx。 - 这将打开 FastReport 的设计器界面。
步骤 2:连接数据源
假设你有一个 Products 表,包含 ID, ProductName, Price, Category 字段。

- 在设计器左侧的 "Data"(数据)窗口中,右键点击 "Report" -> "Add Data Source..."。
- 选择 "ADO.NET" 并点击 "OK"。
- 如果你的项目已经有
DataSet,可以直接选择它,如果没有,可以点击 "New Connection" 创建一个新的数据库连接,然后选择Products表。 - 成功添加后,你会看到
Products表及其字段(ID,ProductName,Price,Category)。
步骤 3:设计报表布局
- 设置页面:点击设计器顶部的 "Page"(页面)选项卡,可以设置页面大小、方向、边距等。
- :
- 从工具箱中拖拽一个
Text对象到报表的 "Page Header"(页眉)带区。 - 双击该 Text 对象,输入 "产品列表"。
- 你可以在属性窗口中修改字体、颜色、对齐方式等。
- 从工具箱中拖拽一个
- :
- 在 "Page Header" 带区,再拖入 4 个
Text对象,分别输入 "ID", "产品名称", "价格", "类别"。 - 将它们水平对齐,形成表头。
- 在 "Page Header" 带区,再拖入 4 个
- 添加数据字段:
- 切换到 "Data"(数据)窗口,将
Products表中的ID,ProductName,Price,Category字段直接拖拽到报表的 "Data"(数据)带区。 - FastReport 会自动为每个字段创建一个
Text对象,并完成数据绑定。 - 调整这些 Text 对象的位置,使其在表头下方对齐。
- 切换到 "Data"(数据)窗口,将
- 调整带区:
- "Page Header":每页顶部重复显示。
- "Data":显示每一条记录的数据。
- "Page Footer":每页底部显示,通常用于页码,拖入一个
Text对象,输入[Page] of [TotalPages]。
步骤 4:预览和导出报表
- 点击设计器工具栏上的 "Preview"(预览)按钮(一个放大镜图标)。
- 你将看到一个预览窗口,显示生成的报表,可以在这里翻页、缩放。
- 在预览窗口的工具栏上,点击 "Export"(导出)按钮,选择你想要的格式(如 PDF, Excel),然后保存文件。
恭喜!你已经成功创建了你的第一个 FastReport 报表!
第三部分:核心功能详解
数据绑定
数据绑定是报表的灵魂,除了直接拖拽字段,你还可以:
- 手动绑定:选中一个
Text对象,在属性窗口的 "Data" 标签下,点击 "Expression"(表达式),然后从数据源中选择字段。 - 表达式:
[Products.ProductName],方括号[]是 FastReport 中引用数据字段的标准语法。
参数
参数允许用户在运行时向报表传递值,实现动态筛选。
- 创建参数:
- 在设计器左侧,右键点击 "Parameters"(参数)-> "Add"。
- 命名为
CategoryFilter,类型为String。
- 使用参数:
- 在 "Data" 带区,右键点击数据源(
Products表)-> "Edit..."。 - 在弹出的窗口中,切换到 "Conditions"(条件)选项卡。
- 点击 "Add",设置条件为
[Category] = [CategoryFilter]。 - 报表将只显示类别等于
CategoryFilter参数值的记录。
- 在 "Data" 带区,右键点击数据源(
- 传递参数:
- 在你的 C# 代码中,创建报表实例后,可以这样设置参数:
Report report = new Report(); report.Load("ProductsReport.frx"); report.SetParameterValue("CategoryFilter", "电子产品"); // 传递值 report.Prepare(); // 准备报表 report.ShowPrepared(); // 显示预览
- 在你的 C# 代码中,创建报表实例后,可以这样设置参数:
变量
变量用于在报表中进行计算,如求和、计数、平均值等。
- 创建变量:
- 在设计器左侧,右键点击 "Variables"(变量)-> "Add"。
- 选择 "Sum"(求和),表达式为
[Products.Price],命名为TotalPrice。
- 显示变量:
- 在 "Report Footer"(报表页脚)带区,拖入一个
Text对象。 - 在其表达式中输入
[TotalPrice]。 - 你可以添加文本,如 "总价格: [TotalPrice]"。
- 在 "Report Footer"(报表页脚)带区,拖入一个
FastReport 内置了许多常用变量,如 [Sum], [Count], [Average],你也可以直接使用它们。
分组
分组可以让报表结构更清晰,例如按类别对产品进行分组。
- 创建分组:
- 在设计器左侧,右键点击 "Groups"(分组)-> "Add"。
- 在弹出的窗口中,选择数据源
Products,然后选择分组字段[Category]。 - 点击 "OK"。
- 理解分组带区:
- 设计器上会出现两个新的带区:
Header 1和Footer 1。 Header 1:在每个新的分组开始时显示,在这里可以显示类别名称。Footer 1:在每个分组结束时显示,在这里可以计算并显示该分组的总价。
- 设计器上会出现两个新的带区:
- 设计分组:
- 在
Header 1带区,拖入一个Text对象,表达式为[Category]。 - 在
Footer 1带区,使用变量来显示分组的总价,你可能需要为每个组创建一个独立的求和变量。
- 在
主/明细报表
当需要展示一对多关系的数据时(如一个订单和它的多个订单项),主/明细报表非常有用。
- 设计主报表:
- 创建一个主报表文件,
MasterReport.frx。 - 绑定主表数据(如
Orders表),显示订单号、客户名等。
- 创建一个主报表文件,
- 设计明细报表:
- 创建另一个报表文件,
DetailReport.frx。 - 绑定明细表数据(如
OrderItems表),显示产品、数量、单价等。
- 创建另一个报表文件,
- 在主报表中嵌入明细报表:
- 打开
MasterReport.frx,在主表数据带区(Data带区)的适当位置,从工具箱中拖入一个Child对象。 - 选中
Child对象,在属性窗口中设置其 "Report" 属性为DetailReport.frx。 - 关键步骤:FastReport 需要知道如何将主表记录与明细表关联,通常这需要通过脚本或设置子报表的数据源来完成,在
MasterReport.frx中,你可能需要为Child对象的BeforePrint事件编写脚本,动态地为子报表(DetailReport)设置数据筛选条件(OrderID = [MasterReport.Orders.ID])。
- 打开
第四部分:进阶技巧
脚本编程
FastReport 使用 C# 或 VB.NET 作为其脚本语言。
- 添加脚本:在设计器中,右键点击报表、带区或对象 -> "Script"。
- 常用事件:
Report.StartReport:报表开始执行前,适合初始化变量。Band.BeforePrint:带区打印前,适合动态计算、修改对象属性。Text.BeforePrint:Text 对象打印前,适合根据条件改变其值。
- 示例:在
Text.BeforePrint事件中,根据价格高低改变文本颜色:private void Text1_BeforePrint(object sender, EventArgs e) { // [Price] 是绑定的字段 if (Convert.ToDecimal([Price]) > 1000) { this.Text1.ForeColor = System.Drawing.Color.Red; } else { this.Text1.ForeColor = System.Drawing.Color.Black; } }
交叉表
交叉表(Matrix)用于对数据进行汇总分析,类似 Excel 的数据透视表。
- 从工具箱中拖拽一个
Matrix对象到报表中。 - 行:将一个字段(如
Category)拖到矩阵的 "Row" 区域。 - 列:将另一个字段(如
Year)拖到矩阵的 "Column" 区域。 - 值:将需要汇总的字段(如
Price)拖到矩阵的 "Value" 区域。 - FastReport 会自动对值进行求和,你可以在属性中更改聚合方式(求和、计数、平均值等)。
条件格式
除了通过脚本改变样式,FastReport 还提供了更简单的条件格式功能。
- 选中一个
Text对象。 - 在属性窗口中,找到 "Conditions"(条件)选项卡。
- 点击 "Add",设置一个条件(
[Price] > 1000)。 - 在 "Style"(样式)中,设置满足条件时的字体颜色、背景色等。
第五部分:在应用程序中使用报表
这里以最常用的 WinForms 为例。
添加引用和控件
- 在你的项目中,通过 NuGet 包管理器安装
FastReport.Windows包。 - 在窗体上,从工具箱中拖入一个
FastReportPreviewControl控件。
C# 代码示例
using System;
using System.Data;
using System.Windows.Forms;
using FastReport; // 引入 FastReport 命名空间
namespace WinFormsApp
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void btnGenerateReport_Click(object sender, EventArgs e)
{
// 1. 创建报表对象
Report report = new Report();
// 2. 加载报表模板文件 (.frx)
report.Load("ProductsReport.frx");
// 3. (可选) 准备数据
// 这里假设你有一个 GetData() 方法来填充 DataSet
DataSet data = GetData();
report.RegisterData(data, "Products"); // 注册数据源,"Products" 是你在 .frx 中使用的名称
// 4. (可选) 设置参数
report.SetParameterValue("CategoryFilter", "电子产品");
// 5. 准备报表
report.Prepare();
// 6. 将准备好的报表分配给预览控件
fastReportPreviewControl1.Report = report;
// 7. 或者直接显示预览窗口 (另一种方式)
// report.ShowPrevised(); // 这会弹出一个独立的预览窗口
}
private DataSet GetData()
{
// 这里应该是从数据库或其他数据源获取数据的逻辑
// 为了示例,我们创建一个临时的 DataTable
DataTable dt = new DataTable("Products");
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("ProductName", typeof(string));
dt.Columns.Add("Price", typeof(decimal));
dt.Columns.Add("Category", typeof(string));
dt.Rows.Add(1, "笔记本电脑", 5999.99, "电子产品");
dt.Rows.Add(2, "办公椅", 899.50, "家具");
dt.Rows.Add(3, "无线鼠标", 199.00, "电子产品");
dt.Rows.Add(4, "台灯", 159.90, "家具");
DataSet ds = new DataSet();
ds.Tables.Add(dt);
return ds;
}
}
}
总结与学习资源
- 核心思想:FastReport 的核心是
.frx文件,它是一个独立的报表定义,你的应用程序主要负责加载这个文件、提供数据、设置参数,然后调用Prepare()和ShowPrevised()来生成和显示报表。 - 官方资源:
- FastReport 官方文档:最权威、最全面的学习资料,包含所有函数、属性和事件的说明。
- FastReport 示例:官方提供了大量示例项目,是学习高级功能的最佳途径。
- FastReport 论坛:遇到问题时,可以在论坛寻求帮助。
这份教程为你提供了一个坚实的起点,FastReport 的功能非常丰富,最好的学习方式就是 动手实践,尝试创建不同类型的报表,探索各种对象和事件,你会发现它是一个能极大提升你开发效率的强大工具。
