ActiveReports区域报表实现自定义打印操作

发布时间:2013/12/19 00:12 发布者:jian

返回博客中心

ActiveReports 的报表浏览器中内置了打印功能,同时,用户还可以通过GrapeCity.ActiveReports.SystemPrinter自己控制打印操作,比如和实现缩放打印,连续打印,附加信息打印等操作。本文主要演示如何通过该方法实现按照报表内容高度选择纸张打印。

按照报表内容高度选择纸张打印的详细需求是这样的,在报表中往往最后一页可能只使用到一张纸的部分区域,那么在使用针式打印机打印时,为了节省纸张,我们希望只打印有数据的区域,空白区域就不打印。以下是详细实现步骤。

首先,创建一个商品清单报表,该报表运行之后有两页内容,第二页数据没有占满整张纸,我们希望在显示时就不显示空白区域,如下样式:

image

要实现这个效果,我们可以在报表的ReportEnd事件中动态设置最后一页的纸张高度。基本思路是记录每页中数据占用的实际高度,在ReportEnd事件中设置最后一页的高度:

    // 记录当前页实际高度
    public float ActualPageHeight = 0;
    private void SectionReport1_ReportEnd(object sender, EventArgs e)
    {
        // 在报表运行结束之后调整最后一页的高度
        ActualPageHeight = ActualPageHeight
                        + this.PageSettings.Margins.Top
                        + this.PageSettings.Margins.Bottom
                        + this.pageHeader.Height;
        this.Document.Pages[this.Document.Pages.Count - 1].Height = ActualPageHeight;
    }
    private void detail_AfterPrint(object sender, EventArgs e)
    {
        // 记录每条数据占用的高度
        ActualPageHeight += this.detail.Height;
    }
    private void SectionReport1_PageStart(object sender, EventArgs e)
    {
        // 每页开始时对实际高度做清零操作
        ActualPageHeight = 0;
    }

然后,我们实现连续打印操作,在打印时需要将报表内容分为两部分进行打印,代码如下:

    private void 连续打印ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        // 连续打印报表
        GrapeCity.ActiveReports.Document.Section.Page aPage = new GrapeCity.ActiveReports.Document.Section.Page();
        aPage.Width = rpt.PageSettings.PaperWidth;
        aPage.Height = rpt.PageSettings.PaperHeight;
        // 创建SystemPrinter对象
        GrapeCity.ActiveReports.SystemPrinter m_myARPrinter = new GrapeCity.ActiveReports.SystemPrinter();
        m_myARPrinter.PrintDialog();
        m_myARPrinter.PaperSize = new System.Drawing.Printing.PaperSize("Custom Size", Convert.ToInt32(aPage.Width * 100), Convert.ToInt32(aPage.Height * 100));
        // 启动打印任务
        m_myARPrinter.StartJob("连续打印");
        System.Drawing.RectangleF rec;
        int nCount = rpt.Document.Pages.Count;
        for (int i = 0; i < nCount - 1; i++)
        {
            m_myARPrinter.StartPage();
            m_myARPrinter.Graphics.PageUnit = GraphicsUnit.Pixel;
            aPage = rpt.Document.Pages[i];
            m_myARPrinter.PaperSize = new System.Drawing.Printing.PaperSize("Custom Size", Convert.ToInt32(aPage.Width * 100), Convert.ToInt32(aPage.Height * 100));
            rec = new RectangleF(0, 0, aPage.Width, aPage.Height);
            aPage.Draw(m_myARPrinter.Graphics, rec, 1f, 1f);
            m_myARPrinter.EndPage();
        }
        m_myARPrinter.EndJob();
        aPage = rpt.Document.Pages[nCount - 1];
        m_myARPrinter.PaperSize = new System.Drawing.Printing.PaperSize("Custom Size", Convert.ToInt32(aPage.Width * 100), Convert.ToInt32(aPage.Height * 100));
        m_myARPrinter.StartJob("连续打印");
        m_myARPrinter.StartPage();
        m_myARPrinter.Graphics.PageUnit = GraphicsUnit.Pixel;
        rec = new RectangleF(0, 0, aPage.Width, aPage.Height);
        aPage.Draw(m_myARPrinter.Graphics, rec, 1f, 1f);
        m_myARPrinter.EndPage();
        m_myARPrinter.EndJob();
    }

运行截图:

image

源码下载:VS2010 + ActiveReports 7


关于葡萄城

赋能开发者!葡萄城是专业的集开发工具、商业智能解决方案、低代码开发平台于一身的软件和服务提供商,为超过 75% 的全球财富 500 强企业提供服务。葡萄城专注控件软件领域30年,希望通过模块化的开发控件、灵活的低代码应用开发平台等一系列开发工具、解决方案和服务,帮助开发者快速响应复杂多变的业务需求,最大程度地发挥开发者的才智和潜能,让开发者的 IT 人生更从容更美好。

了解详情,请访问葡萄城官网