使用FastReport报表工具实现信封套打功能

在较早期的报表套打的时候,我倾向于使用LODOP的ActiveX进行报表的打印或者套打,BS效果还是很不错的。之前利用它在Winform程序里面实现信封套打功能,详细参考《基于信封套打以及批量打印的实现过程》,虽然功能能够完美实现,不过由于还需要附带一个不是百分百整合一起的插件,还是有点另类的,虽然只是第一次使用的时候,需要安装一次插件即可。本篇随笔介绍一下如何旧瓶装新酒,使用FastReport报表工具来实现信封的套打及批量打印的功能。

1、信封套打及批量打印功能的回顾

首先我们要有一些特制的信封或者普通信封,这样才能基于这个基础上进行套打,把邮政编码、地址和联系人等信息打印上去。

然后你需要有一个打印设备,我这里采用了一个佳能的喷墨打印机(当然其他的也没问题)。

其次我们开发一个工具来快速实现数据的导入和批量打印,如下界面所示。

最后当然能够满足要求的打印大量的信封出来,减少我们人工干预的麻烦了。

2、使用FastReport报表工具来实现信封的套打及批量打印

首先我们模仿上面的工具界面来做一个新的Winform程序,这次使用DevExpress界面来做,得到界面如下所示。

功能和前面软件的基本一样,只是界面有所变化差异而已。

现在我们来聊聊如何FastReport报表工具来实现套打的处理,这样我们就可以使用它来进行信封的打印了。

首先,和前面随笔《使用FastReport报表工具生成报表PDF文档》/《使用FastReport报表工具生成标签打印文档》等文章介绍的一样,我们套打一样需要准备好一个报表模板,然后基于这个基础上进行套打处理。

套打的原理,就是预设一个图片和报表的大小,以及放置一些需要打印的内容,预设的图片一般不需要打印出来,这样其他内容打印在特定的纸张上就实现了证书、信封、发票、快递单等的打印了。

而使用FastReport报表工具,我们可以对报表模板里面的元素的位置、大小、样式等进行一定的调整,以适应我们具体的报表需要,基于这个模式我们先设计一个FastReport报表模板,如下所示。

以上模板的设置,主要就是注意定义好几个参数,并将参数和具体的展示控件进行绑定,并加入一个图片作为不打印的元素即可。

报表在运行时刻可以进行模板的调整,如下是报表的【打印设计】界面。

我们可以利用FastReport提供的报表设计工具进行元素位置、大小、样式等方面的调整。这样就可以给客户很大的灵活性进行处理。

报表打印的操作如下代码所示。

        /// <summary>
        /// 报表打印测试
        /// </summary>
        private void btnPrintTest_Click(object sender, EventArgs e)
        {
            if(this.txtAddress.Text.Length == 0)
            {
                MessageDxUtil.ShowTips("请输入地址");
                this.txtAddress.Focus();
                return;
            }
            else if (this.txtReceiver.Text.Length == 0)
            {
                MessageDxUtil.ShowTips("请输入收件人");
                this.txtReceiver.Focus();
                return;
            }

            FrmReportPreview dlg = new FrmReportPreview();
            var report = dlg.Report;

            //加载报表
            var reportFile = Path.Combine(baseDir, "Report/信封报表.frx");
            report.Load(reportFile);

            //绑定数据源
            //定义参数和数据格式
            var dict = new Dictionary<string, object>();

            var zipCode = txtPostCode.Text.Trim().PadRight(6, ‘ ‘).ToCharArray();
            dict.Add("C1", zipCode[0]);
            dict.Add("C2", zipCode[1]);
            dict.Add("C3", zipCode[2]);
            dict.Add("C4", zipCode[3]);
            dict.Add("C5", zipCode[4]);
            dict.Add("C6", zipCode[5]);
            dict.Add("Address", this.txtAddress.Text.Trim());

            var Recipient = this.txtReceiver.Text.Trim();
            if(!Recipient.EndsWith("收"))
            {
                Recipient += "收";
            }
            dict.Add("Recipient", Recipient);

            //刷新数据源
            foreach (string key in dict.Keys)
            {
                report.SetParameterValue(key, dict[key]);
            }

            dlg.ShowDialog();
        }

以上打印处理的时候,会调用打印预览界面展示数据,如下界面所示。

报表打印设计处理,和打印测试差不多,也需要绑定数据,方便预览,代码如下所示。

        /// <summary>
        /// 报表打印设计
        /// </summary>
        private void btnPrintDesign_Click(object sender, EventArgs e)
        {
            FrmReportDesign dlg = new FrmReportDesign();
            var report = dlg.Report;

            //加载报表文件
            var reportFile = Path.Combine(baseDir, "Report/信封报表.frx");
            report.Load(reportFile);

            //绑定数据源
            //定义参数和数据格式
            var dict = new Dictionary<string, object>();

            var zipCode = txtPostCode.Text.Trim().PadRight(6, ‘ ‘).ToCharArray();
            dict.Add("C1", zipCode[0]);
            dict.Add("C2", zipCode[1]);
            dict.Add("C3", zipCode[2]);
            dict.Add("C4", zipCode[3]);
            dict.Add("C5", zipCode[4]);
            dict.Add("C6", zipCode[5]);
            dict.Add("Address", this.txtAddress.Text.Trim());

            var Recipient = this.txtReceiver.Text.Trim();
            if (!Recipient.EndsWith("收"))
            {
                Recipient += "收";
            }
            dict.Add("Recipient", Recipient);

            //刷新数据源
            foreach (string key in dict.Keys)
            {
                report.SetParameterValue(key, dict[key]);
            }

            dlg.ShowDialog();
        }

信封打印,我们不需要一个个确认打印对话框,指定那个PrintDialog为False即可。信封的批量打印代码如下所示。

        /// <summary>
        /// 信封批量打印操作
        /// </summary>
        private void btnBatchPrint_Click(object sender, EventArgs e)
        {
            if(dtImport == null || dtImport.Rows.Count == 0)
            {
                MessageDxUtil.ShowTips("没有打印数据");
                return;
            }

            FastReport.Report report = new FastReport.Report();
            FastReport.Utils.Res.LocaleFolder = Path.Combine(baseDir, "L18N");
            var file = FastReport.Utils.Res.LocaleFolder + @"Chinese (Simplified).frl";
            FastReport.Utils.Res.LoadLocale(file);

            //加载报表
            var reportFile = Path.Combine(baseDir, "Report/信封报表.frx");
            report.Load(reportFile);

            SplashScreenHelper.Show(typeof(FrmWaitForm));
            SplashScreenHelper.SetCaption("正在打印...");
            int total = dtImport.Rows.Count;
            int i = 0;
            foreach(DataRow dr in dtImport.Rows)
            {
                SplashScreenHelper.SetDescription(string.Format("正在打印...任务 {0} / {1}", i++, total));

                //绑定数据源
                //定义参数和数据格式
                var dict = new Dictionary<string, object>();

                var zipCode = dr["邮编"].ToString().Trim().PadRight(6, ‘ ‘).ToCharArray();
                dict.Add("C1", zipCode[0]);
                dict.Add("C2", zipCode[1]);
                dict.Add("C3", zipCode[2]);
                dict.Add("C4", zipCode[3]);
                dict.Add("C5", zipCode[4]);
                dict.Add("C6", zipCode[5]);
                dict.Add("Address", dr["地址"].ToString().Trim());

                var Recipient = dr["收件人"].ToString().Trim();
                if (!Recipient.EndsWith("收"))
                {
                    Recipient += "收";
                }
                dict.Add("Recipient", Recipient);

                //刷新数据源
                foreach (string key in dict.Keys)
                {
                    report.SetParameterValue(key, dict[key]);
                }

                report.PrintSettings.ShowDialog = false;
                report.Print();

                Thread.Sleep(100);
            }
            SplashScreenHelper.SetCaption("打印完成!");
            SplashScreenHelper.SetDescription(string.Format("完成全部打印,共打印【{0}】份!", total));
            Thread.Sleep(500);
            SplashScreenHelper.Close();
        }

我们使用该批量模式测试打印几个信封,效果如下所示。

如果导入数据很多,那么一样和前面的软件打印效果一样,中间不需要人工接入,喝茶等着完成即可。

这个就是整合了FastReport报表工具实现信封套打功能的软件,这样整合后,软件体验性就更加完美了。

原文地址:https://www.cnblogs.com/wuhuacong/p/11975730.html

时间: 2024-09-28 21:05:29

使用FastReport报表工具实现信封套打功能的相关文章

大揭秘!热门报表工具Fastreport和Stimulsoft最新动态都在这里

Fastreport和Stimulsoft 作为最常被提及的两个报表类的重要产品,大家也是一直都很关注他们的最新动向!是否有重要更新?是否发布了重要消息?别着急,今天小编特意为大家带来了Fastreport和Stimulsoft最新更新内容和最近动态!赶快来看看吧! 重要更新:Fastreport.Net2019.4版本发布 FastReport.Net是适用于Windows Forms,ASP.NET,MVC和.NET Core的全功能报表解决方案. 它可以在Microsoft Visual

FastReport报表设计

目录 5.1 前言 5.2 基本概念及操作 5.3 报表设计与范例 5.4 常用功能及函数 5.5 报表设计常用技巧 5.1 前言 汽车业务管理系统(VBMS)使用FastReport3.0报表系统设计报表.    本文主要描述使用FastReport设计报表的基本概念.使用方法.设计技巧和范例,不是FastReport的用户手册因此并不针对每个细节进行阐述.立足于建立设计报表的概念和实用技巧范例的讲解,面对的是具有一定计算机操作水平的用户.在VBMS中使用FastReport设计报表应该掌握以

FastReport报表设计(仔细看)

FastReport报表设计 2011-06-16 16:56:19|  分类: 系统开发|举报|字号 订阅 下载LOFTER我的照片书  | 目录 5.1 前言 5.2 基本概念及操作 5.3 报表设计与范例 5.4 常用功能及函数 5.5 报表设计常用技巧 5.1 前言 汽车业务管理系统(VBMS)使用FastReport3.0报表系统设计报表.    本文主要描述使用FastReport设计报表的基本概念.使用方法.设计技巧和范例,不是FastReport的用户手册因此并不针对每个细节进行

蒋步星:报表工具的“后”路

报表工具很可能是企业级通用软件领域中仅有的国产软件品质远远超过国外同行的产品了.以润乾为先行者的国内厂商,在十多年的竞争中靠实力击败了国外产品.除了少量开源产品因价格优势还有较多用户外,其它国外产品主要就是些多年前的老用户了. 中国报表需求确实更复杂,无论格式和计算都繁琐得多,传统报表模型难以处理.润乾发明的非线性报表模型能够较好地解决这些问题,国内重要厂商目前都采用了该模型,而国外厂商则继续使用传统模型,产品本身品质要差很多;另外,近年来几个重要的国外厂商都发生了并购,报表工具并非收购方的主营

蒋步星:报表工具和移动端

报表工具是解决数据呈现问题的,而手机是很方便的数据呈现载体,那么报表工具显然应当提供移动端APP? 其实不然,报表工具并不该直接提供移动端APP.更严格的说法:不只是不该有,而且是不能有! 为什么不能有? 道理很简单,作为中间件的报表工具是需要被集成的,已经做成APP了咋集成? 终端用户采用的移动端APP需要做好用户登录.权限管理等功能,而这些在不同用户场景下是不同的,需要行业开发商再来定制,直接提供做死的APP反而没法用.而且,有些用户已经有了自己企业的移动端门户APP,报表功能要被嵌入到门户

常用报表工具

报表工具:是帮助用户用来展现自己输入数据,更多时候是将数据库中的数据,以客户想要的方式展现出来. 中文名 报表工具 目 的 以客户想要的方式展现出来 性 质 动态显示数据 报表工具 SVF水晶报表JReport 目录 1报表工具评述 ? 目前国内报表工具概述 ? 简述几款主流报表工具 2如何选择报表工具 1报表工具评述编辑 目前国内报表工具概述 很多国际品牌的报表工具基本上都能把数据库的数据取出来运算排列制作出动态的变长统计报表,也就是“报”的能力不错.但“表”的功能就不是很好了.所以国产报表还

报表工具的二次革命之集算器的作用

之前的文章已经大致给大家介绍过大数据计算引擎-润乾集算器了.想必很多人心里还是存在疑惑,集算器作为大数据分析系统,到底它能做些什么?这篇文章,就为大家详细介绍. 降低报表开发难度 降低开发难度从而提高开发效率是集算器的设计初衷,是最容易理解的作用,前面已有粗略介绍. 这方面的细节内容太多,我们会再做一个专门话题详细讲述集算器如何解决报表开发中的各种具体难题以及与常规手段的对比.在这里只做总结性地阐述. 比Java和SQL更易写 如前所述,集算器的设计目标是为了解决报表的数据准备,而目前这个工作一

如何基于报表工具FineReport进行二次开发

随着FineReport的发展,它提供的设计器和服务器应该能够满足绝大部分的需求,完全实现零编码的软件开发.革命性地加快软件的开发以及提高软件的稳定性.但是需求千变万化,而FineReport本身所具备的功能是报表中比较典型的,一些比较有个性的功能无法实现,那么就需要应用开发人间使用网页脚本.API接口等进行深入的开发,而这一点,FineReport报表工具是支持的,那么如何来实现插件开发呢? Ant打包 Ant是一个构建工具,它可以帮助我们将项目开发过程中需要完成的各种步骤组织起来,通过一个简

报表工具与报表性能的关系

在选择报表工具时,性能指标一向是用户非常关心的,但是,报表工具的性能和整个报表系统的性能会有多大关系呢? 要回答这个问题,首先要分析一下报表的处理过程包含哪些环节,其中有哪些环节容易出现性能问题,如何优化这些环节. 一.报表处理的一般过程分析 1.用户选择报表输入参数后,报表引擎会根据报表模板和输入参数来解析报表,并将数据计算和读取请求以SQL的方式发送给数据库. 2.数据层负责读取.计算和返回数据.数据层一般都是传统关系数据库:如Oracle.DB2等. 3.数据层通过JDBC等接口将结果数据