我即将要开始一个项目,需要从数据中打印简单报告。它将基于WPF进行开发,我在考虑应该选择哪种方式。
我知道WPF引入了自己的打印技术(基于XPS),看起来很容易使用。然而,我想知道是否使用ReportViewer控件并将其嵌入到Windows Forms宿主控件中会更容易,因为这将使用户能够导出各种格式以及打印。
有没有人从WPF中打印/报告的经验?你推荐哪个方向?
我即将要开始一个项目,需要从数据中打印简单报告。它将基于WPF进行开发,我在考虑应该选择哪种方式。
我知道WPF引入了自己的打印技术(基于XPS),看起来很容易使用。然而,我想知道是否使用ReportViewer控件并将其嵌入到Windows Forms宿主控件中会更容易,因为这将使用户能够导出各种格式以及打印。
有没有人从WPF中打印/报告的经验?你推荐哪个方向?
RDL 的限制
最初我选择了 RDLC/ReportViewer 来进行 WPF 打印,但发现它的限制非常大。以下是我发现的一些限制:
直接从 WPF 进行打印非常简单
由于这些限制,我尝试使用纯 WPF 创建报表,并发现这实际上非常容易。WPF 允许您实现自己的 DocumentPaginator
子类来生成页面。
我开发了一个简单的 DocumentPaginator 子类,它可以获取任何 Visual,分析可视树,并隐藏选定的元素以创建每个页面。
DocumentPaginator 详细信息
以下是我的 DocumentPaginator 子类在初始化期间(第一次获取 PageCount 或第一次调用 GetPage() 时)执行的操作:
我的DocumentPaginator的GetPage方法如下:
Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => {} ));
) 以使任何后台呈现任务完成这是相当简单的代码,让我能够将几乎任何我可以使用WPF创建的东西变成页面并打印出来。
额外的报告支持
既然我的分页器已经工作了,我就不用再担心我是否正在为屏幕或纸张创建我的WPF内容了。事实上,我建立的用于数据输入和编辑的UI通常也非常适合打印。
从那里开始,我添加了一个简单的工具栏和一些代码,结果建立了一个完整的基于WPF的报告系统,比RDL要强大得多。我的报告代码可以导出文件,打印到打印机,剪切/粘贴页面图像以及剪切/粘贴Excel数据。我还可以通过单击复选框将任何UI切换为“打印视图”,以查看它在打印时的外观。所有这些只用了几百行C#和XAML代码!
目前为止,我认为RDL唯一具有而我的报告代码没有的功能是生成格式化的Excel电子表格的能力。我可以看出如何做到这一点,但迄今为止还没有必要-仅剪切和粘贴数据已经足够。
从我的经验来看,我的建议是编写一个分页器,然后开始使用WPF本身来创建您的报告。
xaml
视图转换为页面的class
。而且,没有其他方法 :( - Gopichandar看一下PdfReports。它是一个基于iTextSharp和EPPlus库构建的代码优先报告引擎。它兼容于.NET 3.5+的Web和Windows应用程序。
我最近完成了开发自己的报告系统的任务,它基本上由设计环境和数据源管理器组成。第一个任务是开发类似WYSWIG的设计环境。我使用GDI+完成了这个任务,甚至没有考虑打印,因为打印/生成打印预览比我预期的要容易得多,通常只需要将所有内容绘制到打印事件的图形对象上即可。
我认为在WPF的情况下,它会很相似,所以你唯一需要担心的就是在屏幕上显示你的报告,而打印只需要几行代码即可。
不谈论WPF未来的整个政治讨论,我们发现最好的选择是将ReportViewer包装在Windows Forms主机控件中。
http://blog.pineywoodstech.com/index.php/2012/01/using-microsoft-reportviewer-with-wpf/