我有一个即将到来的项目,该项目将必须能够从其数据中打印简单的报告。这将是基于WPF的,我想知道该走哪条路。
我知道WPF引入了自己的打印技术(基于XPS),看起来很容易使用。但是,我不知道要使用ReportViewer控件并将其嵌入Windows Forms宿主控件是否会更容易,因为这将使用户能够导出为多种格式以及进行打印。
有没有人从WPF打印/报告过任何经验?您会向哪个方向推荐?
Answers:
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本身创建报告。
看看PdfReports。这是一个代码优先报告引擎,基于iTextSharp和EPPlus库构建。它与.NET 3.5+ Web和Windows应用程序兼容。
Scryber呢?它允许PDF报告模板使用xml定义,并在运行时绑定到应用程序中的数据。http://scryber.codeplex.com/
要详细说明Ray Burns的答案,如果您正在寻找实现示例,请参见: 自定义数据网格文档分页器
这是一个很好的起点。
没有深入讨论WPF的未来,我们发现最好的选择是将ReportViewer包装在Windows Forms宿主控件中。
http://blog.pineywoodstech.com/index.php/2012/01/using-microsoft-reportviewer-with-wpf/