如何实现报表设计中的高精度报表套打?

在许多行业中票据具有严格的行业规范,格式是无法修改的,一旦格式有所改动,票据数据就会失效无效。因此通常情况下,我们会在预先设计好格式的报表的打印版中,手动填写数据信息,如常见的各类账本,报销单等填写数据。

6月27日京东商城发布了中国电子商务领域首张电子发票,同时宣布相关系统正式上线,这标志着中国电子商务的步伐又向前迈出了重要的一步。目前“电子发票”覆盖的服务范围是在北京地区购买图书、音像商品的个人消费者。消费者在进行指定品类网上消费时可选择开具普通纸质发票或电子发票。本文将揭秘如何通过葡萄城ActiveReports报表报表实现电子发票的功能。

提起分栏报表,它的数据组织形式就如同小时候使用的数学作业本一样,将数据分为多栏显示,当然写作业时有的人习惯横向写,有的人则喜欢竖着写完,在写另一栏。所有的电子技术都是采用隐喻的手法,从物理世界而来,分栏报表也是源于生活,分栏报表也可以行分栏(竖向分栏)和列分栏(横向分栏)。分栏数可以分为两栏或多栏。行分栏数据流从上往下的方向显示数据,超过固定的行数就另起一栏显示,列分栏的数据的流向是从左往右,超过固定的列数就另起一栏显示。

 

 

在使用葡萄城ActiveReports报表控件实现发票打印、发货单打印、物流清单打印、商品条码印刷、员工工卡印刷之类的功能时,您只需在设计报表阶段加载套打纸作为报表背景图片,实际打印时仅将数据打印到套打纸的相应位置。

在商业报表系统中常见的分栏报表有商品标签、员工工卡、条码打印等。由此可见,分栏报表常用于需要重复显示结构相同的条目信息,如商品标签中,标签结构相同,只是填充的商品信息不同等。采用分栏报表可以很大程度上的节省空间且美观。如此重要的报表分类要是实现操作能够简便易操作设置,就更好。本文使用葡萄城报表的分栏设置,来解决分栏报表需求。

对于套打的情况,一般出现在以下两种情况: 
1:清单类打印,一般可能是已经是在已经印刷好的纸张上打印 
2:单据发票类,一般单据格式固定,如每张打印5行数据,而且这种格式是已经印刷好的,当然机打发票除外。 

单张票据手动填写是没有任何问题的,而随着办公自动化,大量数据都需要电子化处理,不仅高效还便于保存,不易出错。在票据成为常规办公操作时,手动填写不仅无法满足而且非常低效,又因为票据的格式是无法修改的,传统的报表工具通常是用测量的方法确定数据区域的位置,来设计报表。如此一来,制作一张票据打印的报表不仅费时费力,而且很难确保票据的有效性,更是无法满足未来出现的新票据格式的要求。套打报表的出现解决了这一难题,简化了电子票据制作打印的功能。

 

图片 1

我们以第2种情况为例进行说明,因为第2种会了第1种也自然就明白了 
在这里我们使用程序代码 报表中设置背景图片的方式来实现。 

 

1、创建报表文件

创建报表,添加背景图片,并根据打印参数来显示或者隐藏背景图片

在工程中添加ActiveReports报表,报表模板选择【ActiveReports 7页面报表】,命名为rptInvoice.rdlx

图片 2

报表添加完成之后,在报表资源管理器中的【嵌入式图像】节点中添加增值税发票背景图片

图片 3

从VS工具箱中将 Image 控件添加到报表设计界面,并设置 Image 控件的值,如下所示:

图片 4

图片 5

添加完背景图片之后,我们在相应文字添加 TextBox 控件用于显示数据,最终得到的设计效果如下:

图片 6 

 

分栏报表实现

1. 新建RDL报表

图片 7

2. 绑定数据

图片 8

3. 新建数据集

SELECT * FROM 物品清单ORDER BY 行号

4. 添加表格控件

图片 9

5. 设置分栏属性

选择报表的灰色区域,点击属性对话框命令,注意设置分栏数量,一定要保证报表的纸张宽度> 单栏宽度* 分栏数量,否则分栏效果不会出来。

图片 10

6. 预览

图片 11

转载请注明出自:葡萄城报表

 

相关阅读:

在线报表设计实战系列 – 制作表格类报表
在线报表设计实战系列 – 制作复杂表头报表
在线报表设计实战系列 – 制作图表类报表

 

1、纸张尺寸类型很难控制客户端的,那就用A4纸,计算设置较大右边距和下边距,以适合你的单据尺寸;

套打报表
套打也被称作定位打印,即在一张预设格式的票据上,零误差打印上需要填写的数据内容。预设票据纸张可以理解为,在报表制作过程中,为报表设置为特定的报表背景(票据电子版),然后根据此背景设置需要填写的数据项及匹配的数据控件。因此打印时只打印数据,而整个背景不会输出到打印机中。套打报表也可以通俗的理解为“套格式打印”。套打报表功能是报表开发工具提供的最基本最常用且最考验报表专业性的功能。

2、自定义 WebViewer 控件

自定义 WebViewer 控件,在工具栏中添加【套打】按钮,当用户点击【套打】时运行报表(不显示背景图)并打印

在工程的ASPX页面中添加两个 WebViewer 控件,一个用于报表预览,一个用于报表打印. 添加完成之后设置两个WebViewer控件的ViewerType为FlashViewer, 并设置FlashViewerOptions中的UseClientApi为True.

在页面中添加以下 JavaScript ,用于报表的打印操作:

 1     <script language="javascript" type="text/javascript">
 2         var viewer, viewerforprint;
 3         var pages;
 4 
 5         window.onload = function () {
 6             GrapeCity.ActiveReports.Viewer.OnLoad("<%=WebViewer1.ClientID %>", function () {
 7                 viewer = GrapeCity.ActiveReports.Viewer.Attach("<%=WebViewer1.ClientID %>");
 8                 viewer.setEventsHandler({
 9                     OnToolClick: function (e) {
10                         if (e.Tool == "套打") {
11                             printreport();
12                             return false;
13                         }
14                     },
15                     OnLoadProgress: function (e) {
16                         if (e.State == "Completed") {
17                             pages = e.PageCount;
18                         }
19                     }
20                 });
21             });
22 
23             GrapeCity.ActiveReports.Viewer.OnLoad("<%=WebViewer2.ClientID %>", function () {
24                 viewerforprint = GrapeCity.ActiveReports.Viewer.Attach("<%=WebViewer2.ClientID %>");
25             });
26         }
27 
28         function printreport() {
29             var orient = "None";
30             var scale = "None";
31             var from = 1;
32             var to = pages;
33             var ops = viewerforprint.CreatePrintOptions();
34             ops.AdjustPaperOrientation = orient;
35             ops.ScalePages = scale;
36             ops.ClearPageRanges();
37             ops.AddPageRange(from, to);
38 
39             viewerforprint.Print(ops);
40 
41         }
42 
43     </script>

 

切换到ASPX后台代码视图, 添加以下代码在 WebViewer 工具栏中添加[套打]按钮:

 

 1     private void CustomizeToolbar()
 2     {
 3         // 隐藏打印范围按钮
 4         ToolBase btnRang = WebViewer1.FlashViewerToolBar.Tools["PageRangeButton"];
 5         btnRang.Visible = false;
 6 
 7         // 隐藏打印按钮
 8         ToolBase btnPrint = WebViewer1.FlashViewerToolBar.Tools["PrintButton"];
 9         btnRang.Visible = false;
10 
11         ToolButton btnCPrint = Tool.CreateButton("套打");
12         btnCPrint.Caption = "套打";
13         btnCPrint.ToolTip = "套打";
14 
15         WebViewer1.FlashViewerToolBar.Tools.Insert(0, btnCPrint);
16     }

2、页面设置,精确计算左边距与上边距,放好你需打印的组件与不需打印的组件(Top与Left);

 

3、运行程序

图片 12

 

3、窗体上,三个控件:CrystalReport控件、CrystalReportViewer控件和PrintDialog控件,让CrystalReportViewer控件的ShowPrintButton=false,以免客户从它启动打印;

编码实现套打代码,工作量大不说,实现逻辑非常复杂,精准度无法掌控。如下图中的打印,很明显为了对齐大写的“现金支付”栏目,其他项目的打印都已经偏离。

在线演示及源码下载地址:

http://www.gcpowertools.com.cn/products/activereports_demo.htm
图片 13

相关阅读:

【报表福利大放送】100余套报表模板免费下载 

 矩表 - 现代数据分析中必不可少的报表工具

 

4、在制作报表的时候,把你不需要打印的部分使用图片代替。

图片 14

如下图。

 

 图片 15

使用场景

使用了图片来代替固定数据。如上图中的“仓储企业名称”等标题。

套打功能在各行各业的报表打印中都有很广泛的应用。如发票打印,发货运单,以及常见的各种凭证等,下面我们就来看一些行业套打报表的示例。
财务系统中发票打印就是非常典型的套打报表的实例。在报表设计过程中只需要将比如:名称、抬头、地址电话等信息,而整个背景不会输出到打印机中。

5、报表打印类:

图片 16

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Easipay.Controls.Printer;

using System.Drawing.Printing;



namespace Warehouse.Report

{

    public class ReportAllocateBLM : ReportBase, IPrintReport

    {

        // <summary>

        /// 生成报表对象

        /// </summary>

        /// <returns></returns>

        public object Report()

        {

            return new rptAllocateBLMTHD();

        }



        /// <summary>

        /// 打印预览, 设置报表数据的方法:

        /// </summary>

        /// <param name="rpt">报表</param>

        /// <param name="reportData">需要打印的数据</param>

        /// <param name="boolBackgroupPic">是否打印背景图片</param>

        public void PrePrint(ref CrystalDecisions.CrystalReports.Engine.ReportDocument rpt, object reportData, bool boolBackgroupPic)

        {

            ProtionOutHeadReport info = GetDataSet(reportData);



            AddBarNo(ref rpt);



            rpt.SetDataSource(info);

            System.Drawing.Printing.PrintDocument pd = new PrintDocument();

            System.Drawing.Printing.PaperSize paperSize = new System.Drawing.Printing.PaperSize("ProtionInHeadReport", 827, 1200);

        }

        ///<summary>

        ///生成报表所需要的DataSet

        ///</summary>

        ///<param name="reportData">由界面中传过来的数据</param>

        ///<returns></returns>

        private ProtionOutHeadReport GetDataSet(object reportData)

        {

            ProtionOutHeadReport outBillDs = new ProtionOutHeadReport();

            Easipay.WGQ.Entitys.ProtionOutHead head = reportData as Easipay.WGQ.Entitys.ProtionOutHead;

            if (head != null)

            {

                FillDataTable<Easipay.WGQ.Entitys.ProtionOutHead>(GetHeadList(head), outBillDs.ProtionOutHead);

            }

            if (head.ProtionOutODetail != null)

            {

                FillDataTable<Easipay.WGQ.Entitys.ProtionOutODetail>(GetDetailList(head), outBillDs.ProtionOutODetail);

            }

            if (head.ProtionOutMDetail != null)

            {

                FillDataTable<Easipay.WGQ.Entitys.ProtionOutMDetail>(GetMDetailList(head), outBillDs.ProtionOutMDetail);

            }

            return outBillDs;

        }

        /// <summary>

        /// 获取报表头

        /// </summary>

        /// <param name="head">进区凭单表头信息</param>

        /// <returns></returns>

        private List<Easipay.WGQ.Entitys.ProtionOutHead> GetHeadList(Easipay.WGQ.Entitys.ProtionOutHead head)

        {

            List<Easipay.WGQ.Entitys.ProtionOutHead> list = new List<Easipay.WGQ.Entitys.ProtionOutHead>();

            list.Add(head);

            return list;

        }

        /// <summary>

        /// 获取报表体

        /// </summary>

        /// <param name="head">进区凭单带表体的表头信息类</param>

        /// <returns></returns>

        private List<Easipay.WGQ.Entitys.ProtionOutODetail> GetDetailList(Easipay.WGQ.Entitys.ProtionOutHead head)

        {

            List<Easipay.WGQ.Entitys.ProtionOutODetail> list = new List<Easipay.WGQ.Entitys.ProtionOutODetail>();

            foreach (Easipay.WGQ.Entitys.ProtionOutODetail item in head.ProtionOutODetail)

            {

                list.Add(item);

            }



            return list;

        }

        /// <summary>

        /// 获取报表体

        /// </summary>

        /// <param name="head">进区凭单带表体的表头信息类</param>

        /// <returns></returns>

        private List<Easipay.WGQ.Entitys.ProtionOutMDetail> GetMDetailList(Easipay.WGQ.Entitys.ProtionOutHead head)

        {

            string pid = string.Empty;

            List<Easipay.WGQ.Entitys.ProtionOutMDetail> list = new List<Easipay.WGQ.Entitys.ProtionOutMDetail>();

            foreach (Easipay.WGQ.Entitys.ProtionOutMDetail item in head.ProtionOutMDetail)

            {                

                pid = item.pid;

             if (pid=="2")

             {

                 list.Add(item);

             }



            }

//每页要打印八条记录,如果不足8条,则补空行

            while (list.Count < 8)

            {



                Easipay.WGQ.Entitys.ProtionOutMDetail detail = new Easipay.WGQ.Entitys.ProtionOutMDetail();

                detail.pid = pid;

                System.Threading.Thread.Sleep(1);



                detail.id = (DateTime.UtcNow.Ticks % 100000000000).ToString();               

                list.Add(detail);

            }

            return list;

        }

        string m_PrintTypeBarName;

        /// <summary>

        /// 报表打印类型

        /// </summary>

        public string PrintTypeBarName

        {

            get

            {

                if (string.IsNullOrEmpty(m_PrintTypeBarName))

                {

                    return "分拨货物提货单";

                }

                return m_PrintTypeBarName;



            }

            set

            {

                m_PrintTypeBarName = value;

            }

        }

    /// <summary>

        /// 按需要隐藏报表上的某些控件,这里隐藏的都是图片控件,其他的可以自行添加:

        /// </summary>



        public void HidePicture(ref CrystalDecisions.CrystalReports.Engine.ReportDocument rpt)

        {

            try

            {

                foreach (CrystalDecisions.CrystalReports.Engine.Section section in rpt.ReportDefinition.Sections)

                {

                    foreach (CrystalDecisions.CrystalReports.Engine.ReportObject rptObject in section.ReportObjects)

                    {

                        if (rptObject is CrystalDecisions.CrystalReports.Engine.PictureObject)

                        {

                            //图片背景

                            (rptObject as CrystalDecisions.CrystalReports.Engine.PictureObject).ObjectFormat.EnableSuppress = true;

                        }

                    }

                }



            }

            catch

            {

            }

        }



    }

}






6、打印方法:
/// <summary>

/// 打印报表

/// </summary>

/// <param name="strPrintName">打印机名称</param>

/// <param name="shInt">打印份数</param>

/// <returns>true成功,false失败</returns>

private bool blnPrint(string strPrintName,string shInt)

{

bool blnPrintScuss=false;

int intCopies=0;

try

{

intCopies=int.Parse(shInt);

}

catch

{

intCopies=1;

}

try

{

                if (ipr == null)

                {                  

                    MessageBox.Show("打印报表出错");

                    blnPrintScuss = false;

                    return blnPrintScuss;

                }

// m_BillNewRpt.PrintOptions.PaperSize=CrystalDecisions.Shared.PaperSize.PaperA4;

                ipr.HidePicture(ref m_BillNewRpt);

m_BillNewRpt.PrintOptions.PrinterName = strPrintName;

m_BillNewRpt.PrintToPrinter(intCopies,false,1,m_intMaxPage);

blnPrintScuss=true;

}

catch (Exception ex)

{

blnPrintScuss=false;

MessageBox.Show("打印报表出错:" ex.Message);

}

return blnPrintScuss;

}

发货运单是电子商务系统中非常典型的套打报表,打印时只会打印数据,比如:客户编码、寄件公司、联络人、地址等信息。

 

图片 17

 

本文由糖果派对电玩城发布于用户体验,转载请注明出处:如何实现报表设计中的高精度报表套打?

您可能还会对下面的文章感兴趣: