C# Winform .NET FastReport自定义报表模块源码 框架说明:VS2017.Net+FastReport + Devexpress16.2.5+SQLServer2014 功能说明:的可以开发各种不同的自定义报表,可以实现 单表报表、主明细报表、一主多明细报表,可以自定义报表查询条件,提供开发人员直接使用的DLL与源码,可以在此基础上进行二次开发,加快企业的报表设计与打印,降低企业开发成本。

最近在给公司做报表模块升级,用C# Winform + FastReport搞了个灵活的自定义报表系统。这套东西支持单表、主子表、一主多子表结构,还能自定义查询条件。直接上干货,看看怎么用代码实现这些骚操作。

环境准备

先甩个NuGet命令装核心包:

Install-Package FastReport.OpenSource
Install-Package DevExpress.Win

开发环境用VS2017,数据库随便连个SQL Server。记得把DevExpress的DLL引用进来,工具栏拖个ReportDesigner控件备用。

单表报表5分钟速成

最简单的报表就是直接绑个DataTable。代码比喝奶茶还简单:

// 搞个数据源
DataTable dt = DAL.ExecuteQuery("SELECT * FROM Orders");
// 创建报表对象
using (Report report = new Report())
{
    report.Load(@"Templates\Order.frx"); // 加载模板
    report.RegisterData(dt, "OrderData"); // 绑定数据源
    report.Prepare(); // 编译报表
    report.Show(); // 弹窗预览
}

关键点在模板设计——打开FastReport设计器,把字段拖到对应位置保存为.frx文件。代码里那个RegisterData方法贼重要,不绑定数据源的话报表就是个空壳子。

主子表报表实战

C# Winform .NET FastReport自定义报表模块源码 框架说明:VS2017.Net+FastReport + Devexpress16.2.5+SQLServer2014 功能说明:的可以开发各种不同的自定义报表,可以实现 单表报表、主明细报表、一主多明细报表,可以自定义报表查询条件,提供开发人员直接使用的DLL与源码,可以在此基础上进行二次开发,加快企业的报表设计与打印,降低企业开发成本。

主子表结构需要处理数据关联。代码层面要搞点小动作:

// 主表
DataTable master = DAL.GetData("SELECT * FROM Orders");
// 子表
DataTable detail = DAL.GetData("SELECT * FROM OrderDetails");

// 绑定关系
DataSet ds = new DataSet();
ds.Tables.Add(master);
ds.Tables.Add(detail);
ds.Relations.Add("OrderRelation", master.Columns["OrderID"], detail.Columns["OrderID"]);

using (Report report = new Report())
{
    report.Load(@"Templates\MasterDetail.frx");
    report.RegisterData(ds, "OrderDB");
    // 设计器里记得设置DataBand的Relation属性
    report.GetDataSource("OrderDB").Enabled = true;
    report.Prepare();
    report.Show();
}

这里有个坑:设计器里必须给子表的DataBand设置Relation属性为OrderRelation,否则关联数据出不来。曾经有同事因为这个通宵加班,血的教训!

动态查询条件黑科技

要实现用户自定义过滤条件,得用ReportParameters

report.SetParameterValue("StartDate", DateTime.Now.AddMonths(-1));
report.SetParameterValue("EndDate", DateTime.Now);

// SQL改成这样:
string sql = @"SELECT * FROM Orders 
WHERE OrderDate BETWEEN @StartDate AND @EndDate";

设计器里配置参数更骚——右键报表空白处选参数,添加两个DateTime类型的参数,然后直接在SQL里用@参数名调用。这样连代码都不用改,过滤条件随心配。

二次开发秘籍

源码包里有个ReportEngine.cs核心类,封装了通用操作。比如批量导出的骚操作:

public void ExportBatch(List<DataTable> tables, string templatePath)
{
    foreach (var dt in tables)
    {
        using (var report = new Report())
        {
            report.Load(templatePath);
            report.RegisterData(dt, "Source");
            report.Export(new PDFExport(), $"{Guid.NewGuid()}.pdf");
        }
    }
}

这个类里还藏了个彩蛋——用反射自动绑定数据字段,适合字段多的表。不过要注意性能,数据量超10万条的话还是得走分页查询。

踩坑指南

  1. DevExpress的皮肤和FastReport的预览窗口有兼容问题,遇到白屏就加这句:
DevExpress.Skins.SkinManager.EnableFormSkins();
  1. 内存泄漏是个大坑,所有报表对象必须放在using里或者手动Dispose
  2. 中文乱码?模板字体换成宋体保平安

这套东西上线后,原本需要3天开发的报表现在1小时就能搞定。特别是那个动态参数功能,产品经理再也不用拿着改需求来找我们干架了。源码已打包,需要的老铁直接git clone走起,改个数据库连接字符串就能跑起来。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐