主要思路:
- 在项目中引用fastreport.dll动态链接库
- 用fastreport designer 设计标签模板
- 在项目中调用fastreport 提供的API 设置标签变量参数、打印机属性等,发送打印
详细步骤:
1.安装fastreport标签软件,这里以fastreport demo版本为例。安装标签软件的主要作用是用来制作打印模板,只需安装到程序开发电脑或标签模板制作的电脑上即可,项目运行电脑可以不用安装。
进入下载站点选择产品类型。
下载自己想要的版本。
安装方式与常规软件安装一样,此处不做赘述。
2.引入DLL到项目
需要引入的dll文件可以在上面步骤1下载的程序安装目录找到。
手动引入。右击项目解决方案资源管理器中的"引用"--"添加引用",浏览选择fastreport相关文件路径,添加到项目中即可。 (fastreport相关的dll都引用进去,不确定都会用得上,但是小弟我曾经少引用了线上出现了多次问题,反正都引用不亏)
也可以在Nuget上安装引用。Nuget会帮助我们安装FastReport.dll及它所需要的其他依赖项到项目。
引用成功后,在项目的解决方案资源管理器中会看到FastReport。
3.制作标签模板
制作标签模版需要用到上面步骤1安装的设计程序。
打开设计程序,新建一个模板文件,在上面去拖拉你要的组件就可以了,我一般常用的就是文本框、表格、图片、条形码和二维码,二维码的格式很多,根据用户需求去选择对应的码制就行,然后界面简单布局一下。我在使用过程中发现低版本的DLL,应该是1.3.63.0吧,二维码不支持QRcode,打印出来的会是一团黑色的,然后升级到高版本就可以了。
模板上面的变量赋值我掌握到的有两种方式,一种是传递datatable 格式的数据,datatable的字段名要求与模板中的变量名一致;另一个是需要在模板中设置参数,然后在程序中设置同样的参数名称和值。模板也可以直接用数据库作为数据源,但是这种方式对数据库不安全,我没有研究它,另外还可以以EXCEL等其他文件来作为数据源,有兴趣的可以自行研究,我在项目中用到的还是通过程序代码来给变量赋值。
我这里简单的举一个,哦不对,是两个栗子作为参考哈。
栗子1:用tabletable 来传递变量的标签模板
关于控件的操作很简单,直接从工具栏拖过来简单设置一下就行。上面的模板,用到了表格、文本框、二维码。变量的设置用了常量("出货外箱标识"、"项目名称"等固定不变的文字可以使用常量)、模板变量(P.WLDM、P.SL等)。设置控件变量有两种方式,通过控件的Text属性或者双击控件,在弹出的Edit Text 窗口编辑。
需要注意的是,设置变量的格式为 [A.bcd],A可以简单地理解为一个对象,bcd为对象的属性值,这种理解与面向对象的概念比较像,不管设计的初衷是不是这样,反正这么容易记忆,哈哈。这个A在程序传递datatable数据到标签模板的时候会用到的。
栗子2:用模板参数来制作标签
点击标签模板任意空白区域,在右边找到Parameters树状结构,右击Parameter--New Parameter 即可新建一个变量,按F2或右击--Rename给这个变量改一个好听的名字,这一个变量就算完事了,重复这个步骤,把要用到的变量全建好。
设置好模板参数后,再设置标签元素的名称,同样设置Text属性为 [参数名]。也可以双击元素,在弹出的Edit Text 窗口中选择对应的变量双击或拖动设定。注意用模版parameter的方式,变量前面不带 "类名"。
设置完后的模板如下:
另外还可以用设计器的代码编辑功能来设置控件属性或事件,如下面演示对生产日期和保质期进行设置,如下设置生产日期为系统当前时间,有效期为30天,二维码的赋值也是在代码里面。
Code选项卡的代码语法与C#语法是一样的,选中对应的控件,在属性窗口选择事件,即可进行编码,与VS 的操作类似。
4.通过代码给模板传递参数变量
标签做好了,我们就可以写代码了~
上面我们有两种设置的标签变量的方式,对应了两种不同的传值方法。大致逻辑是一样的,只是传参格式稍有不同。
4.1 通过dataTabel 来传递,通过一个按钮的点击实现标签打印
private void btnPrint1_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("WLDM", typeof(string));
dt.Columns.Add("YJBBH", typeof(string));
dt.Columns.Add("RJBBH", typeof(string));
dt.Columns.Add("PC", typeof(string));
dt.Columns.Add("SL", typeof(string));
DataRow row = dt.NewRow();
row["WLDM"] = "10050407080990";
row["YJBBH"] = "V1.4.3.5";
row["RJBBH"] = "V2.4.5.6";
row["PC"] = "20240416001-76";
row["SL"] = "20";
dt.Rows.Add(row);
Report report = new Report();
//加载标签模版
report.Load(@"D:\Users\twelve\Desktop\temp1.frx");
//注册打印数据
report.RegisterData(dt, "P");
//打印
report.Print();
}
简单吧,三行代码,就可以实现打印了,设置默认打印机为PDF打印机,即可本地查看打印效果。
注意 report.RegisterData(dt,"P"); 第二个参数P ,与模板里面的变量名前缀一致!
4.2 通过Parameter 来传递,通过一个按钮的点击实现标签打印
private void button3_Click(object sender, EventArgs e)
{
Report report = new Report();
//加载标签模版
report.Load(@"D:\Users\twelve\Desktop\temp2.frx");
//设置变量
report.SetParameterValue("WLDM", "10050407080991");
report.SetParameterValue("YJBBH", "V1.4.3.6");
report.SetParameterValue("RJBBH", "V2.4.5.7");
report.SetParameterValue("PC", "20240416001-78");
report.SetParameterValue("SL", "30");
//打印
report.Print();
}
也能正常打印出来。推荐这种方式,简洁,而且如果模版用到了代码没有定义的参数,方式1会报错,方式2不会。
5.见网友的小 Tips
- 二维码Border下的QuiteZone属性设置为False,可以去掉二维码周围的空白,个人比较喜欢,方便使用,尤其是在布局元素多,页面紧凑的时候。
- 通过 report.PrintSettings.Copies 属性可以设置打印数量。
- 打印的时候关闭打印设置 report.PrintSettings.ShowDialog = false;
- 导出打印图片 ImageExport img = new ImageExport(); report.Export(img, "c:\\1.png");
- 导出PDF PDFExport pdf = new PDFExport(); report.Export(pdf, "c:\\qqq1.pdf");
- 以上4、5如果不能导出,请将其放在print()之后试试呢,或在前面加上 report.Prepare();~~~
- 实现打印预览,先将dll添加到控件工具箱,然后拖一个previewControl1控件到窗体上,接着写代码 report.Preview = previewControl1; report.Prepare();report.ShowPrepared();
- 设置打印机 report.PrintSettings.Printer = ""; 不设置的话用的是系统默认打印机
- 用完了记得 report.Dispose() 一下哦~~~
- (2023-02-10)补充:如果打印报错 "fastreport 的类型初始值设定项引发异常",除了安装fastreport 软件外,检查下 FastReport.dll 、FastReport.Bars.dll、FastReport.Compat.dll、FastReport.DataVisualization.dll、FastReport.Editor.dll 有没有引用。据经验这些不一样全部用到,但是以防万一。还有一个 FastReport.xml 文件,也可以放到目录去。上面这些文件在解压安装包里可以找到。
(还有很多其他的功能和技巧,慢慢摸索~~~~更新时间2023年9月6日,刚上班)
2024年4月16日更新一些错误和替换违规图片不显示。(这两天大A牛灾啊~再继续几天建仓^_^)