在WPF应用中使用FastReport.WPF报表模块
FastReport是一个非常不错的报表组件,在Winform应用中常常使用它进行报表的设计、预览展现、打印或者导出文件(PDF、Excel)等,可以设计打印各种各样的报表,本篇随笔继续介绍当前最新的FastReport报表模块,其中FastReport.WPF是专门针对WPF的报表组件。
1、回顾FastReport应用
我们回顾一下,我之前在随笔中总结的一些FastReport应用案例,虽然WPF使用上有所差异,不过报表的格式是同样的,处理规则也是大同小异。
《使用FastReport报表工具生成标签打印文档》、《使用FastReport报表工具生成图片格式文档》、《使用FastReport报表工具生成报表PDF文档》、《使用FastReport报表工具实现信封套打功能》、《在Winform开发中使用FastReport创建报表》、《在Vue&Element前端项目中,使用FastReport + pdf.js生成并展示自定义报表》、《利用FastReport传递图片参数,在报表上展示签名信息》,可以说在Winform报表处理中,我还是比较喜欢FastReport的的纯.net开发的报表组件。
我们可以看到,FastReport报表还是非常强大的,可以处理各种不同的报表展示。



2、FastReport.WPF报表模块的使用
FastReport.WPF 报表模块是2023年底才出来的一款专门针对WPF的报表应用,我们在Nugget上搜索FastReport.WPF,添加对应的FastReport.WPF.Demo模块就可以在我们的WPF应用中添加测试版本的FastReport.WPF组件了,如果我们有正式版本,也可以安装后直接添加本地引用文件即可。

报表的预览和设计可以通过直接在WPF后端代码打开对应的报表组件实现相应的效果,也可以通过在页面中展示对应组件(预览组件、设计组件)来承载报表信息,我们针对两种情况分别进行相关的说明。
我们在WPF的应用端中添加一个报表的测试页面,用来测试FastReport的报表处理,如下界面所示。

一般的FastReport报表的处理,差不多就是那几个步骤:
1、创建报表对象
2、加载报表文件
3、加载报表相关数据或者参数
4、调用报表设计或者预览处理。
我们来看看简单的按钮单击调用报表的处理,如下代码所示。
/// <summary>
/// 报表预览
/// </summary>
private async void btnPreviewReport_Click(object sender, RoutedEventArgs e)
{
var reportFile = Path.Combine(baseDir, "Report/Simple List.frx");
using (var report = new Report())
{
//加载报表
report.Load(reportFile);
//创建数据源
var ds = GetNorthWindDataSet();
//绑定数据源
report.RegisterData(ds, "NorthWind"); //运行报表
report.Show();
}
}
/// <summary>
/// 报表设计
/// </summary>
private void btnDesignReport_Click(object sender, RoutedEventArgs e)
{
var reportFile = Path.Combine(baseDir, "Report/Simple List.frx");
using (var report = new Report())
{
//加载报表
report.Load(reportFile);
//创建数据源
var ds = GetNorthWindDataSet();
//绑定数据源
report.RegisterData(ds, "NorthWind"); //运行报表
report.Design();
}
}
当然我们也可以在Xaml中定义Command来处理对应的按钮事件。

Xam界面代码如下所示:
<ui:CardAction
Grid.Row="0"
Grid.Column="0"
Margin="0,0,14,0"
Padding="0"
VerticalAlignment="Stretch"
Command="{Binding DataContext.PreviewReportCommand, Mode=OneWay}"
CommandParameter="Simple List.frx"
IsChevronVisible="False">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image
Width="60"
Margin="24,0,0,0"
Source="/Assets/dashboardItem1.png" />
<StackPanel
Grid.Column="1"
Margin="24"
VerticalAlignment="Center">
<ui:TextBlock
FontTypography="BodyStrong"
Text="报表打印预览"
TextWrapping="WrapWithOverflow" />
<ui:TextBlock
Appearance="Tertiary"
Text="NorthWind报表预览"
TextWrapping="WrapWithOverflow" />
</StackPanel>
</Grid>
</ui:CardAction>
Command的处理后端代码如下所示。
/// <summary>
/// 预览报表
/// </summary>
/// <param name="path">报表路径</param>
[RelayCommand]
private void PreviewReport(string path)
{
var reportFile = Path.Combine(Environment.CurrentDirectory, $"Report/{path}");
if(File.Exists(reportFile))
{
using (var report = new Report())
{
//加载报表
report.Load(reportFile);
//创建数据源
var ds = GetNorthWindDataSet();
//绑定数据源
report.RegisterData(ds, "NorthWind");
//运行报表
report.ShowAsync();
}
}
}
除了我们这里使用MVVM的处理定义,代码逻辑上和单击事件的处理差不多。
FastReport报表可以导出Excel、HTML、PDF等文档格式的文件,如下代码是导出PDF的处理代码,可以把报表导出和预览效果一样的PDF文件。
/// <summary>
/// 导出PDF
/// </summary>
/// <param name="path"></param>
[RelayCommand]
private void ReportExport(string path)
{
var reportFile = Path.Combine(baseDir, $"Report/{path}");
if (File.Exists(reportFile))
{
using (var report = new Report())
{
//加载报表
report.Load(reportFile);
//创建数据源
var ds = GetNorthWindDataSet();
//绑定数据源
report.RegisterData(ds, "NorthWind");
//运行报表
report.Prepare();
//导出PDF报表
var file = FileDialogHelper.SavePdf("result.pdf");
if (!string.IsNullOrEmpty(file))
{
var export = new PDFExport();
report.Export(export, file);
}
//打开PDF
if (File.Exists(file))
{
Process.Start("explorer.exe", file);
}
}
}
}
导出文件后,我们在WPF程序中,可以通过 Process.Start("explorer.exe", file); 命令进行打开PDF文档。

这种通过FastReport内置类的Design或者Show方法展示的报表,是一个独立的窗口打开的。
有时候为了方便,我们可能需要设计一个页面或者窗口来放置我们的设计或者预览报表,那么我们可以通过在页面中展示对应组件(预览组件、设计组件)来承载报表信息。
需要在页面中添加对应的命名空间,如下代码所示。
<Page
x:Class="WHC.SugarProject.WpfUI.Views.Pages.FastReportPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Design="clr-namespace:FastReport.Design;assembly=FastReport.WPF"
xmlns:Preview="clr-namespace:FastReport.Preview;assembly=FastReport.WPF"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WHC.SugarProject.WpfUI.Views.Pages"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
Title="FastReportPage"
d:DesignHeight="850"
d:DesignWidth="800"
mc:Ignorable="d">
在页面中可以放置对应的组件对象,如下代码所示。
<StackPanel
x:Name="reportPanel"
Grid.Row="2"
Grid.ColumnSpan="3"
Margin="10">
<Preview:WpfPreviewControl
x:Name="previewControl"
Height="600"
Margin="10"
ToolbarVisible="False" />
<Design:WpfDesignerControl
x:Name="designerControl"
Height="600"
Margin="10" />
</StackPanel>
展示报表的时候,后台代码处理如下所示。
private void btnShowReport_Click(object sender, RoutedEventArgs e)
{
var reportFile = Path.Combine(baseDir, "Report/report.frx");
var report = new Report();
//加载报表
report.Load(reportFile);
//创建数据源
var list = CreateBusinessObject();
//绑定数据源
report.RegisterData(list, "Categories");
report.PrepareAsync(previewControl); //运行报表
}
private void btnShowDesign_Click(object sender, RoutedEventArgs e)
{
var reportFile = Path.Combine(baseDir, "Report/report.frx");
var report = new Report();
//加载报表
report.Load(reportFile);
//创建数据源
var list = CreateBusinessObject();
//绑定数据源
report.RegisterData(list, "Categories");
designerControl.Report = report;
}

当然我们也可以单独设计一个页面来承载,如下页面所示。

通过页面的封装,我们在页面中提供一个公用的报表组件。
/// <summary>
/// FastReportPreview.xaml 的交互逻辑
/// </summary>
public partial class FastReportPreview : Window
{
/// <summary>
/// 报表对象
/// </summary>
public Report Report { get; set; } = new();//初始化对象 public FastReportPreview()
{
InitializeComponent(); this.previewControl.Loaded += (s, e) =>
{
Report.PrepareAsync(previewControl);
};
}
}
在调用报表页面展示的时候,对报表对象做相应的处理即可,然后调用窗口进行展示。
/// <summary>
/// 使用自定义窗口打开报表预览
/// </summary>
private void btnShowReport2_Click(object sender, RoutedEventArgs e)
{
var dlg = App.GetService<FastReportPreview>();
if (dlg != null)
{
var reportFile = Path.Combine(baseDir, "Report/report.frx"); //加载报表
dlg.Report.Load(reportFile);
//创建数据源
var list = CreateBusinessObject();
//绑定数据源
dlg.Report.RegisterData(list, "Categories"); dlg.ShowDialog();
}
}
同理设计报表也是一样的处理方式,不在赘述。
以上就是我WPF应用中使用FastReport.WPF报表模块的一些经验总结,结合之前的Winform案例经验,我们可以充分的利用FastReport的报表的相关功能,实现我们所需要的报表展示或者文件导出了。
在WPF应用中使用FastReport.WPF报表模块的更多相关文章
- 在Winform开发中使用FastReport创建报表
FastReport.Net是一款适用于Windows Forms, ASP.NET和MVC框架的功能齐全的报表分析解决方案.可用在Microsoft Visual Studio 2005到2015, ...
- 在WPF程序中使用摄像头兼谈如何使用AForge.NET控件(转)
前言: AForge.NET 是用C#写的一个关于计算机视觉和人工智能领域的框架,它包括图像处理.神经网络.遗传算法和机器学习等.在C#程序中使用摄像头,我习惯性使用AForge.NET提供的类库.本 ...
- WPF 程序中启动和关闭外部.exe程序
当需要在WPF程序启动时,启动另一外部程序(.exe程序)时,可以按照下面的例子来: C#后台代码如下: using System; using System.Collections.Generic; ...
- 如何在WPF程序中使用ArcGIS Engine的控件
原文 http://www.gisall.com/html/47/122747-4038.html WPF(Windows Presentation Foundation)是美国微软公司推出.NET ...
- WPF换肤之三:WPF中的WndProc
原文:WPF换肤之三:WPF中的WndProc 在上篇文章中,我有提到过WndProc中可以处理所有经过窗体的事件,但是没有具体的来说怎么可以处理的. 其实,在WPF中,要想利用WndProc来处理所 ...
- WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示
原文:WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示 为方便描述, 这里仅以正方形来做演示, 其他图形从略. 运行时效果图:XAML代码:// Transform.XAML< ...
- WPF/Silverlight中的RichTextBox总结
WPF/Silverlight中的RichTextBox总结 在WPF或者是在Silverlight中有个非常强大的可以编辑的容器控件RichTextBox,有的时间会采取该控件来作为编辑控件.鉴 ...
- 解决VS2019中.net core WPF 暂时无法使用 Designer 的临时方法
目录 解决 VS2019 中.net core WPF 暂时无法使用 Designer 的临时方法 安装 vs 2019 professional/enterprise版本 在vs的设置里,勾选.NE ...
- WPF程序中App.Config文件的读与写
WPF程序中的App.Config文件是我们应用程序中经常使用的一种配置文件,System.Configuration.dll文件中提供了大量的读写的配置,所以它是一种高效的程序配置方式,那么今天我就 ...
- WPF项目中解决ConfigurationManager不能用(转)
https://blog.csdn.net/MOESECSDN/article/details/78107888 在WPF项目中遇到这样的问题,做一下笔记.希望对自己和读者都有帮助. 在aap.con ...
随机推荐
- 等保测评之主机测评——Centos7
目录 基础信息收集 (一)身份鉴别 (二)访问控制 (三)安全审计 (四)入侵防范 (五)恶意代码防范 (六)可信验证 (七)数据完整性 (八)数据保密性 (九)数据备份恢复 (十)剩余信息保护 命令 ...
- 【Android】【外包杯】后台管理系统 | 进度day01
外包杯官方提示:平台不要太大,只是一些小东西包括支付宝和微信小程序打开,无需安装口香糖,餐巾纸有一块屏幕,不需要很大,只需要满足顾客可以看到传播的内容打开橱窗不要有锋利边角,不要求一体,提高场景利用率 ...
- 【结对作业】第一周 | 学习体会day03
昨天解决线路查询时遇到的type接受为空导致出现空指针异常抛出,后来发现是因为传递的数据类型出现了问题,更改数据类型之后问题就得到了解决今天在实现站点查询线路时遇到了乱码问题,在这之前我们单独编写代码 ...
- .NET8极致性能优化CHRL
前言 .NET8在.NET7的基础上进行了进一步的优化,比如CHRL(全称:CORINFO_HELP_RNGCHKFAIL)优化技术,CORINFO_HELP_RNGCHKFAIL是边界检查,在.NE ...
- DevOps|研发提效-敏捷开发之每日站立会
对于研发效能团队建设和组织,本文不再赘述,可以参考之前的文章,已经讲得很透彻了.本文重点讲我们日常是怎么开站立会,怎么让团队跑起来,高效能产出的.每日站立会,15分钟到30分钟,看似非常短的一个会,但 ...
- .net 温故知新【15】:Asp.Net Core WebAPI 配置
关于Asp.Net Core中的配置实际之前我已经整理过.net 中以json方式进行配置的介绍(.net 温故知新:[8].NET 中的配置从xml转向json),当时我们说Asp.Net Core ...
- Pattern类和Matcher类的使用
1.先看好数据源 先将一个String对象确定为程序要对其进行操作的数据源. String b="hello,good morning"; 2.建立Pattern类的对象 Stri ...
- [USACO2007OPEN S] Catch That Cow S
题目描述 FJ丢失了他的一头牛,他决定追回他的牛.已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动.FJ的行走方式很特别:他每一次可以前进一步.后退一步或者直接走到2*x的位置.计算他 ...
- C++ Qt开发:RadioButton单选框分组组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QRadioB ...
- 基于winform(C#)的飞鸟小游戏
本项目是一款基于C# (winform)版本的飞鸟小游戏,是一款益智类游戏 其效果如下图所示 如上图所示为飞鸟游戏的初始化界面: 可以看到游戏包含了四个功能: 启动 注册 登陆 排行榜 启动:是用于开 ...