Fork me on GitHub
套打

 

水晶报表实现套打

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

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

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

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

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

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

如下图。

 

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

5、报表打印类:

复制代码
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Easipay.Controls.Printer;

using System.Drawing.Printing;

 

namespace Easipay.WGQ.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;

}
复制代码

 

 

 

 

7、套打,只打印数据的效果。如下图。

 

 

 

8、非套打,全部打印的效果。如下图。

 

 

 
 
分类: 水晶报表

 

 

、Google Code Prettify:实现代码高亮的JS库

 

介绍

  • code prettify 解释为 “代码修饰”。
  • 他由JS代码和CSS代码构成,用来高亮显示HTML页面中的代码。
  • 支持:C, Java, Python, Bash, HTML, XML, Javascript, Makefiles, Ruby, PHP, Awk, Perl, Basic, Clojure, CSS, Dart, Erlang, Go, Haskell, Lisp, Scheme, LLVM, Lua, Matlab, Pascal, R, Scala, SQL, LaTeX等语言。

开始使用

  • 在使用之前我建议将prettify.css中 li 的样式中添加:list-style-type:decimal 使得每行都有行号,而不是每5行有一个号。
  • 加入主要的CSS文件和JS文件:
<linkrel="stylesheet"href="css/prettify.css"/><!-- 设置代码主题,此文件为默认主题,你可以换成其他主题-->
<scriptsrc="js/prettify.js"type="text/javascript"></script>
  • 在<body>标签中加入onload="prettyPrint();"
<bodyonload="prettyPrint()">
  • 将代码放在<pre class="prettyprint linenums">标签内,其中 linenums 表示为代码添加行号,可以不写。
  • 注意:像html中的特殊字符需要转义,比如<a>应该写成 &lt a &gt

例子

代码主题选择

 

 

默认在prettify中有5种选择:

  • prettify.css
  • sunburst.css
  • desert.css
  • doxy.css
  • sons-of-obsidian.css

比如你想使用sunburst.css,则我们只需要将:

<linkrel="stylesheet"href="css/prettify.css"/>

替换成

<linkrel="stylesheet"href="css/sunburst.css"/>

扩展样式可以从 http://jmblog.github.io/color-themes-for-google-code-prettify/ 下载。

语言支持

  • prettify默认支持类C语言(如java等)等,我们可以通过添加额外的JS文件来使得prettify支持该语言的代码高亮(额外的JS文件从此处下载)。比如添加 lang_go.js 并<pre class="prettyprint lang_go">可以使得支持go语言。

参考文献

[1] 官方文档:http://google-code-prettify.googlecode.com/svn/trunk/README.html

[2] 扩展的Prettify主题CSS样式:http://jmblog.github.io/color-themes-for-google-code-prettify/

[3] 代码格式化工具:http://tool.oschina.net/codeformat

作者:xiazdong
出处:http://www.cnblogs.com/xiazdong
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 
标签: Web
posted on 2014-03-02 23:35  HackerVirus  阅读(404)  评论(0编辑  收藏  举报