Sawiki RDL报告引擎是一个用于将RDL报告渲染到ASP.NET或Winforms查看器的工具。它还可以将渲染后的报告导出为XLS、PDF或CSV格式的文件。该引擎读取在Microsoft Visual Studio中创建的RDL文件,连接到引用的数据库,收集参数信息,并渲染最终的报告。目前,它支持所有RDL特性,除了3D图表、列、递归层次结构、文档映射和固定标题。它包括完整的VB.NET支持,包括导入外部库。
这是一个轻量级高速报告渲染器,包括一个RDL编译器,以进一步提高报告项目的性能。它对于任何希望在不支付SQL Server许可证的情况下将Microsoft Reporting Services报告部署到网站,或者在WinForms应用程序中部署报告的人来说都是有用的。
这个项目最初是为了在不支付Microsoft SQL Server许可证的情况下将RDL报告包含在网站中而开始的。同时,对MicrosoftASP.NET报告查看器的工作方式也不满意。花了一些时间在开源项目RDL Project 3上,但对其部分VB解释器和复杂的渲染算法感到不满意。
引擎使用来自Microsoft.VisualBasics命名空间的VBCodeProvider类来编译任何包含的源代码和表达式到一个程序集中。程序集中的每个函数都被放入一个委托列表中,这些委托可以在报告处理期间按索引调用。唯一不能直接编译的表达式是包含聚合函数如Sum、Avg等的表达式。对于这些,使用正则表达式修改RDL报告中的VB源代码,将任何聚合函数调用包装到一个迭代器中。
渲染是先到一个中间模型,然后再渲染到最终形式。中间模型由GenericRender类表示,该类由Report.Run方法返回。GenericRender表示一个简单的盒子模型,可以轻松地转换为最终渲染类之一。这些包括RenderToHtml、RenderPagesToHtml、RenderToText、RenderToCsv、RenderToXls和RenderPagesToPdf。WinForms查看器直接与GenericRender类工作。GenericRender类的简单盒子模型允许简单地渲染到各种最终形式,这一点由RenderToText类总共不到100行代码就可以看出。
RDL引擎包括四个元素:
要读取RDL报告、设置一些参数并将渲染后的报告输出到PDF和XLS,请使用以下代码:
// 创建一个新的Report对象并加载一个RDL报告定义
Rdl.Engine.Report rpt = new Rdl.Engine.Report();
FileStream fs = new FileStream("Product Line Sales.rdl", FileMode.Open);
rpt.Load(fs, ".");
fs.Close();
// 设置参数
rpt.ReportParameters["Category"].Value = 1;
rpt.ReportParameters["StartDate"].Value = DateTime.Now;
rpt.ReportParameters["EndDate"].Value = DateTime.Now.AddMonths(-1);
// 渲染报告
Rdl.Render.GenericRender render = rpt.Run();
// 导出到XLS并写入文件
Rdl.Render.RenderToXls xlsExport = new Rdl.Render.RenderToXls();
string xls = xlsExport.Render(render, false);
StreamWriter sw = File.CreateText("Product Line Sales.xls");
sw.Write(xls);
sw.Close();
// 导出到PDF并写入文件
PageRender pr = new Rdl.Render.PageRender();
pr.Render(render);
Rdl.Render.RenderPagesToPdf pdfExport = new Rdl.Render.RenderPagesToPdf();
string pdf = pdfExport.Render(render, pr);
sw = File.CreateText("Product Line Sales.pdf");
sw.Write(pdf);
sw.Close();
以下ASP.NET页面包括一个ReportViewer控件和一个Parameters控件。当按下Button6时,Parameters控件加载Product Line Sales报告。Parameters控件包括一个View按钮,当按下时触发ViewReport事件,在该事件中报告被渲染并加载到ReportViewer控件中。