LocalReport Print with C# C#打印RDLC
2 #region public static
3 /// <summary>
4 /// 获取指定ReportViewer总物理页数
5 /// guog2009-05-06新增
6 /// </summary>
7 /// <param name="reportViewer">ReportViewer控件</param>
8 /// <returns>总物理页数,默认值为0</returns>
9 public static int GetTotalPage(ReportViewer reportViewer)
10 {
11 int result = 0;
12 //设置为打印预览模式
13 reportViewer.SetDisplayMode(DisplayMode.PrintLayout);
14
15 //记录当前页
16 int currentPage = reportViewer.CurrentPage;
17 if (reportViewer.LocalReport.GetTotalPages() > 0)
18 {//自带的GetTotalPages()方法返回的是逻辑页面总数,所以这里重新处理
19
20 while (true)
21 {
22 try
23 {
24 reportViewer.CurrentPage += 1;
25 }
26 catch
27 {
28 reportViewer.CurrentPage -= 1;
29 result = reportViewer.CurrentPage;
30 break;
31 }
32 finally
33 {
34 //指定到原始位置
35 reportViewer.CurrentPage = currentPage;
36 }
37 }
38 }
39
40 return result;
41 }
42
43
44 #endregion public static
View Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using yxsoft.emcms.cs.ReportPrintBaseLib;
using yxsoft.emcms.common;
using System.Reflection;
using Microsoft.Reporting.WinForms;
using Guog.Emcms.Win.Business.GeneralDataQuery.VerifyPrintView;
using System.Drawing.Printing;
using System.IO;
using System.Drawing.Imaging;
using System.Xml;
namespace Guog.Emcms.Win.YXEmcms.Forms
{
public partial class FrmMeterVerifyPrintView : Form
{
#region 成员变量
/// <summary>
/// 打印的对象
/// </summary>
private PrintDocument m_printDocument = new PrintDocument();
/// <summary>
/// 页面设置
/// </summary>
private PageSettings m_pageSettings = new PageSettings();
/// <summary>
/// 打印文件流列表
/// </summary>
private IList<Stream> m_streams = new List<Stream>();
/// <summary>
/// 当前呈现的页
/// </summary>
private int m_currentPageIndex = 0;
/// <summary>
/// 是否横向打印,true表示横向,false表示纵向
/// </summary>
private bool m_isLandSapce = false;
/// <summary>
/// 打印输出的对象
/// </summary>
private ReportPrintBase m_reportPrintBase = null;
/// <summary>
/// 要打印输出的记录总数
/// </summary>
private int m_chkedCount = 0;
/// <summary>
/// 空白页
/// </summary>
private bool m_isBlank = true;
/// <summary>
/// 双面打印
/// </summary>
private bool m_duplex = false;
#endregion 成员变量
#region 窗体事件
public FrmMeterVerifyPrintView(ReportPrintBase reportPrintBase,int chkedCount)
{
InitializeComponent();
this.m_chkedCount = chkedCount;
this.m_reportPrintBase = reportPrintBase;
this.m_isLandSapce=this.IsLandSapces(this.m_reportPrintBase.MainReport.ReportFileStream);
this.DoubleBuffered = true;
}
private void FrmMeterVerifyPrintView_Load(object sender, EventArgs e)
{
BindPrinters();
}
private void FrmMeterVerifyPrintView_Shown(object sender, EventArgs e)
{
if (m_reportPrintBase != null && m_reportPrintBase.MainReport != null &&
m_reportPrintBase.MainReport.Validate)
{
BindReportData(this.m_reportPrintBase);
}
this.rptView.SetDisplayMode(DisplayMode.PrintLayout);
this.rptView.ZoomMode = ZoomMode.PageWidth;
//this.rptView.ZoomPercent = 100;
}
#region 加载报表数据
private void BindReportData(ReportPrintBase reportPrintBase)
{
//报表信息有效
if (reportPrintBase != null && reportPrintBase.MainReport != null && reportPrintBase.MainReport.Validate)
{//支持的打印类型
#region 添加子报表加载事件,向子报表提供数据源支持
if (reportPrintBase.subreportProcessingEventHandler != null)
{
//加载子报表指定的事件,每个子报表加载时通过此事件指向的方法添加对应的数据源
this.rptView.LocalReport.SubreportProcessing += reportPrintBase.subreportProcessingEventHandler;
}
#endregion 加载子报表事件
#region 添加报表
//加载主报表文件流
this.rptView.LocalReport.LoadReportDefinition(reportPrintBase.MainReport.ReportFileStream);
//添加主报表数据源
this.rptView.LocalReport.DataSources.Add(reportPrintBase.MainReport.DataSource);
if (reportPrintBase.SubReports != null && reportPrintBase.SubReports.Count > 0)
{
foreach (ReportBaseInfo rpt in reportPrintBase.SubReports)
{
//加载子报表文件流
this.rptView.LocalReport.LoadSubreportDefinition(rpt.Name, rpt.ReportFileStream);
}
}
#endregion 添加报表
//重新呈现(刷新)ReportViewer
this.rptView.RefreshReport();
}//报表信息有效
}
#endregion 加载报表数据
private void FrmMeterVerifyPrintView_FormClosing(object sender, FormClosingEventArgs e)
{
this.rptView.Reset();
CloseStreams();
Application.DoEvents();
}
/// <summary>
/// 关闭当前所有文件流
/// </summary>
private void CloseStreams()
{
if (this.m_streams != null && this.m_streams.Count > 0)
{
foreach (Stream s in this.m_streams)
{
s.SetLength(0);
s.Flush();
s.Close();
}
this.m_streams.Clear();
}
}
#endregion
#region 获取所有打印机
/// <summary>
/// 获取当前安装在计算机上的所有打印机名称
/// </summary>
/// <returns></returns>
public static PrinterSettings.StringCollection GetAllPrintNames()
{
return System.Drawing.Printing.PrinterSettings.InstalledPrinters;
}
#endregion 获取所有打印机
#region 绑定打印机列表
private void BindPrinters()
{
cmbSelectPrinter.Items.Clear();
cmbSelectPrinter.DropDownStyle = ComboBoxStyle.DropDownList;
string printerName;
//获取默认打印机
string defaultPrinterName = this.m_printDocument.PrinterSettings.PrinterName;
for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++)
{
printerName = PrinterSettings.InstalledPrinters[i];
cmbSelectPrinter.Items.Add(printerName);
if (printerName == defaultPrinterName)
{
cmbSelectPrinter.SelectedIndex = i;
}
}
}
#endregion 绑定打印机列表
View Code
#region 打印
#region 判断是否为横向
/// <summary>
/// 判断是否为横向
/// </summary>
/// <param name="stm">Rdlc文件流</param>
/// <returns></returns>
private bool IsLandSapces(Stream stm)
{
string strPageWidth = "";
string strPageHeight = "";
XmlReader xmlReader = XmlReader.Create(stm);
if (xmlReader.ReadToFollowing("PageWidth"))
{
strPageWidth = xmlReader.ReadElementString("PageWidth");
}
xmlReader.Close();
return strPageWidth == "29.7cm";
}
#endregion 读取XML文件
/// <summary>
/// 提供 Stream 对象以进行呈现的 CreateStreamCallback 委托指向的方法
/// 这里为将报表的每一个页面作为一个EMF图片存放,通常用于报表呈现
/// </summary>
/// <param name="name">流的名称</param>
/// <param name="fileNameExtension">创建文件流时要使用的文件扩展名</param>
/// <param name="encoding">指定流的字符编码的 Encoding 枚举器值。如果流不包含字符,则此值可能为 null。</param>
/// <param name="mimeType">一个包含流的 MIME 类型的 string</param>
/// <param name="willSeek">指示流是否需要支持查找的 Boolean 值。如果值为 false,则流将为只前推,并将按其创建顺序发送到块区中的客户端。如果值为 true,则流可以任何顺序写入。</param>
/// <returns>ReportViewer 控件可以写入数据的 Stream 对象</returns>
private Stream CreateStream(string name,string fileNameExtension, Encoding encoding,
string mimeType, bool willSeek)
{
Stream stream = new FileStream(Path.GetTempPath() + name +"." + fileNameExtension, FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite);
//Stream stream = new FileStream(Path.GetTempFileName(), FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite,8000,true);
m_streams.Add(stream);
return stream;
}
/// <summary>
/// 导出报表的每一个页面到一个EMF文件
/// </summary>
/// <param name="report">ReportViewer.LocalReport</param>
/// <param name="pageSettings">页面设置</param>
private void Export(LocalReport report,PageSettings pageSettings)
{
StringBuilder sbDeviceInfo = new StringBuilder();
if (pageSettings != null)
{
sbDeviceInfo.AppendLine("<DeviceInfo>");
sbDeviceInfo.AppendLine(" <OutputFormat>EMF</OutputFormat>");
sbDeviceInfo.AppendLine(String.Format(" <PageWidth>{0}cm</PageWidth>", FromInchToCM(pageSettings.PaperSize.Width)));
sbDeviceInfo.AppendLine(String.Format(" <PageHeight>{0}cm</PageHeight>", FromInchToCM(pageSettings.PaperSize.Height)));
sbDeviceInfo.AppendLine(String.Format(" <MarginTop>{0}cm</MarginTop>", FromInchToCM(pageSettings.Margins.Top)));
sbDeviceInfo.AppendLine(String.Format(" <MarginLeft>{0}cm</MarginLeft>", FromInchToCM(pageSettings.Margins.Left)));
sbDeviceInfo.AppendLine(String.Format(" <MarginRight>{0}cm</MarginRight>", FromInchToCM(pageSettings.Margins.Right)));
sbDeviceInfo.AppendLine(String.Format(" <MarginBottom>{0}cm</MarginBottom>", FromInchToCM(pageSettings.Margins.Bottom)));
sbDeviceInfo.AppendLine("</DeviceInfo>");
}
else
{
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>EMF</OutputFormat>" +
" <PageWidth>21cm</PageWidth>" +
" <PageHeight>29.7cm</PageHeight>" +
" <MarginTop>2.5cm</MarginTop>" +
" <MarginLeft>2.5cm</MarginLeft>" +
" <MarginRight>2.5cm</MarginRight>" +
" <MarginBottom>2.5cm</MarginBottom>" +
"</DeviceInfo>";
sbDeviceInfo.AppendLine(deviceInfo);
}
Warning[] warnings;
m_streams = new List<Stream>();
report.Render("Image", sbDeviceInfo.ToString(), new CreateStreamCallback(CreateStream), out warnings);
foreach (Stream stream in m_streams)
stream.Position = 0;
}
/// <summary>
/// 当前页打印的输出
/// </summary>
/// <param name="sender"></param>
/// <param name="ev"></param>
private void PrintPage(object sender, PrintPageEventArgs ev)
{
if (this.m_duplex)
{//双面打印
#region 双面打印
//获取每份页数
int pagePerCopy = GetPageCountPerCopy(this.m_streams.Count, this.m_chkedCount);
if (this.m_currentPageIndex > 0 && (this.m_currentPageIndex + 1) % pagePerCopy == 1 && this.m_isBlank && pagePerCopy % 2 != 0)
{//输出空白页
//当前页面不是第一页,且当前页面为此份报表第一页,且每份报表页数为奇数
Bitmap emptyImage = new Bitmap(10, 10);
if (ev.PageSettings.Landscape)
{
ev.Graphics.DrawImage(emptyImage, new Rectangle(0, 0, ev.PageBounds.Height, ev.PageBounds.Width));
}
else
{
ev.Graphics.DrawImage(emptyImage, ev.PageBounds);
}
//标记已经打印空白页
this.m_isBlank = false;
}
else
{
Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
if (ev.PageSettings.Landscape)
{
ev.Graphics.DrawImage(pageImage, new Rectangle(0, 0, ev.PageBounds.Height, ev.PageBounds.Width));
}
else
{
ev.Graphics.DrawImage(pageImage, ev.PageBounds);
}
m_currentPageIndex++;
//标记等待打印下一个空白页
this.m_isBlank = true;
}
#endregion 双面打印
}
else
{//单面打印
#region 单面打印
Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
if (ev.PageSettings.Landscape)
{
ev.Graphics.DrawImage(pageImage, new Rectangle(0, 0, ev.PageBounds.Height, ev.PageBounds.Width));
}
else
{
ev.Graphics.DrawImage(pageImage, ev.PageBounds);
}
m_currentPageIndex++;
#endregion 单面打印
}
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
}
/// <summary>
/// 打印开始
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BeginPrint(object sender, PrintEventArgs e)
{
this.btnPrint.Enabled = false;
}
/// <summary>
/// 打印结束
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void EndPrint(object sender, PrintEventArgs e)
{
this.btnPrint.Enabled = true;
}
View Code
from:http://www.cnblogs.com/rwecho/archive/2010/04/08/1707507.html
LocalReport Print with C# C#打印RDLC相关推荐
- python怎么只打印其中一行_如何在Python中让两个print()函数的输出打印在一行内?...
1.两个连续的print()函数为什么在输出时内容会分行显示? 解:print()中有两个默认参数sep和end,其中sep是代替分隔符,end是代替末尾的换行符,默认使用','代替空格,且默认末尾加 ...
- window.print() 表格打印 完美实现分页
问题描述: 采用js打印页面,表格过长 会出现分页,表格就会被裁减(那种每行固定就一行展示的简单,每个分页给他多少条数据就完事了),这里的问题是数据从后台获取,而且每一列都可能出现换行,多的可能达到1 ...
- css打印适应纸张_CSS print 样式 css控制打印样式 分页 页面大小
显示器(screen)和打印机(printer)是两种差别很大的设备,所以从浏览器里看到的页面,打印出来也许和你看到的样子有很大的差距.screen一般使用逻辑单位比如px,而打印机则应该使用物理单位 ...
- print中的逗号“,”打印出来相当于空格
一.print中的逗号","打印出来相当于空格 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >& ...
- python一行输出多个数据_如何在Python中让两个print()函数的输出打印在一行内?
1.两个连续的print()函数为什么在输出时内容会分行显示? 解:print()中有两个默认参数sep和end,其中sep是代替分隔符,end是代替末尾的换行符,默认使用','代替空格,且默认末尾加 ...
- android 佳能 打印机,佳能(中国)- 打印机 - 喷墨机丰富功能 - Canon PRINT Inkjet/SELPHY移动打印...
佳能Inkjet/SELPHY移动打印 有了这个移动打印软件,您手中的智能设备不仅可以无线打印.扫描照片或文档,畅享云端的丰富打印素材与模板,打印更精彩的生活,Android手机还能实现网页打印等丰富 ...
- vue @media print使用js插入打印页不同尺寸打印,可自定义尺寸大小,打印机配置
业务需求 在开发时,遇到需求打印时既能切换A4纸张,又能切换成凭证纸张.而使用 @media 设置尺寸后,影响所有页面,无法实现打印多尺寸的问题. 打印技术 使用浏览器自带的 print 打印技术 打 ...
- html 多个分页连续打印机,web使用window.print()实现分页批量打印。
写了有关于web客户端打印物料条码的功能.想着以后可能会用到,就把他给写下来了. 主要参考了:https://blog.csdn.net/ww130929/article/details/719771 ...
- web使用window.print()实现分页批量打印。
写了有关于web客户端打印物料条码的功能.想着以后可能会用到,就把他给写下来了. 主要参考了:https://blog.csdn.net/ww130929/article/details/719771 ...
最新文章
- python如何读写文件-Python之写入文件(1)
- android dts配置_AndroidLinux关于DTS设备树源码的介绍
- atoi函数_每日一道 LeetCode (50):字符串转换整数 (atoi)
- 49 -算法 -LeetCode 107 107. 二叉树的层序遍历 II 栈队列vector
- 使用这些思路与技巧,我读懂了多个优秀的开源项目
- C#中的程序集和命名空间
- C++标识符的命名规则
- Android NDK开发之 Neon优化
- ubuntu使用笔记一
- STM32 CAN波特率设置
- 推荐一款开源游戏开发平台
- 保护生态 高山流水 直播伴侣 一对一引流互动脚本 源码
- 95%的码农都在用的编程神器,值得一看!
- 地理数据处理之矢量数据
- CREO学习笔记【常见表面处理工艺】
- mysql报错1194_MYSQL ERROR 1194 (HY000)
- 易捷行云EasyStack入选2021信创云TOP10
- 基于STM32F407的ADC解析-ADC1多通道扫描模式电压采集实验(启用DMA传输数据)
- eclipse 显示繁体中文问题
- 西门子S7-1200PLC和KTP700触摸屏通过USS协议控制MM420变频器
热门文章
- php开发领域,PHP-MySQL相关领域
- 多版本php共存 linux,linux下多版本php共存的原理、方法
- 微型计算机使用环境,计算机的日常使用环境
- left join 索引失效无条件_技术分享 | MySQL 优化:JOIN 优化实践
- html5相对父元素定位,layer弹出层设置相对父级元素定位
- mysql大量重复值建立索引_对于有大量重复数据的表添加唯一索引
- c语言编译器怎么用scanfkl,C语言一些笔记
- django_form表单的提交
- xstream解析xml字符串和生成对象
- myabatis oracle 调用存储过程返回list结果集