使用FastReport报表工具生成标签打印文档
之前我在随笔《使用fastreport报表工具生成报表pdf文档》介绍过使用fastreport.net来根据报表模板进行生成pdf,以及随笔《使用fastreport报表工具生成标签打印文档》介绍过生成标签文档的处理,基本上都是基于模板进行生成pdf的做法,由于pdf在手机端显示总是觉得不那么方便,不管使用pdfjs或者直接打开pdf,都不太令客户满意,客户希望直接展示图片的方式显示。本篇随笔介绍如何使用fastreport.net来直接生成报表格式的图片文件。
1、报表模板及数据绑定处理
fastreport.net是一款适用于windows forms, asp.net和mvc框架的功能齐全的报表分析解决方案。之前使用直接生成pdf的方式构建报表文档,如下效果所示。
在fastreport设计报表模式里面,我们可以对报表进行设置,以便于在实际运行环境的情况下生成上面的报表文档。在fastreport设计器里面的效果如下所示。
这个报表包含了主表信息,和明细表的信息,我们主表动态信息,可以通过参数的绑定方式绑定,明细表则通过绑定datatable的方式动态处理即可。
采用参数绑定,我们需要在报表设计器里面定义好我们需要的参数,如下所示。
我们一般预先定义好相关的参数,然后绑定在模板里面,并设置好内容的对其格式即可。
如报表页面里面,我们放置了一个表格,定义好表格的行列和宽度后,双击表格单元格,就可以设置表格单元格的文本内容为对应的参数了,如下界面所示。
对于动态展示的明细列表部分,我们需要定义一个数据源的方式,从而可以让报表模板绑定对应的字段名称。
我根据数据表的信息,生成一个用于绑定明细列表的数据源,如下所示。
这样我们在代码绑定的时候,只需要指定detail的名称和对应的字段名称即可,有了这些定义,我们可以在报表设计中使用字段绑定了。
对于运行时刻报表数据的绑定,主要使用对应的对象的注册数据和设置参数处理函数即可实现。
//刷新数据源 report.registerdata(dt, "detail"); foreach (string key in dict.keys) { report.setparametervalue(key, dict[key]); } //运行报表 report.prepare(); //导出pdf报表 pdfexport export = new pdfexport(); report.export(export, realpath); report.dispose();
2、实现报表生成图片文档
图片生成的处理,和pdf格式的处理大同小异,主要就是先处理数据的绑定和准备,后续在根据对应的文件后缀名进行相应的图片生成,pdf生成使用pdfexport,图片生成采用的是imageexport类处理。
如果是基于web开发的,我们在控制器上处理对应的报表输出文件名称和路径,如下所示。
//导出pdf的文件路径 string exportpdfpath = string.format("/generatefiles/pres/report_{0}.jpg", id); //转换为物理路径 string realpath = server.mappath(exportpdfpath);
加载报表模板并初始化,这个不管pdf或者换图片格式,处理一样。
//以报表模板,初始化报表对象 report report = new report(); report.load(reportpath);
bs下生成并输出图片文件如下所示
//刷新数据源 report.registerdata(dt, "detail"); foreach (string key in dict.keys) { report.setparametervalue(key, dict[key]); } //运行报表 report.prepare(); //导出pdf报表 //pdfexport export = new pdfexport(); //导出jpg报表 imageexport export = new imageexport(); //export.jpegquality = 392; //export.resolutiony = 226; report.export(export, realpath); report.dispose(); result = content(exportpdfpath);//返回web相对路径
我们看到,图片生成的操作和pdf的处理差不多。
最后生成图片的界面效果如下所示。
如果报表的页数超过一页,我们可以通过参数来生成不同的图片,如下所示。
new imageexport() { pagerange = pagerange.current, curpage = count }
我们来看看另外一个处理代码,如下所示。
//多个图片导出 int count = 1; string firstfilename = exportimgpath.replace(".png", ""); foreach (pagebase item in report.pages) { string filename = string.format("{0}_{1}.png", firstfilename, count); exportimgpath = filename; report.export(new imageexport() { pagerange = pagerange.current, curpage = count }, filename); count++; }
和之前的不同,这个图片格式指定为png,另外可以支持多个页面的图片生成。
针对fastreport报表的特性,我在综合案例里面编写了一个专门用来处理fastreport的案例代码,如下所示。