111,126
社区成员
发帖
与我相关
我的任务
分享 //打印
private void btnPrint_Click(object sender, EventArgs e)
{
//this.m_pageSettings.Landscape = true;
//获取当前默认打印机
m_printDocument = new PrintDocument();
//设置要使用的打印机的名称
this.m_printDocument.PrinterSettings.PrinterName = cmbSelectPrinter.SelectedItem.ToString();
if (this.m_printDocument.PrinterSettings.IsValid)
{
#region 页面设置
//获取当前报表的所需的页面设置
ReportPageSettings rptPageSettings = this.rptView.LocalReport.GetDefaultPageSettings();
this.m_pageSettings.Margins = rptPageSettings.Margins;
this.m_pageSettings.PaperSize = rptPageSettings.PaperSize;
//页面边距设定
this.m_pageSettings.Margins.Bottom = rptPageSettings.Margins.Bottom;
this.m_pageSettings.Margins.Left = rptPageSettings.Margins.Left;
this.m_pageSettings.Margins.Right = rptPageSettings.Margins.Right;
this.m_pageSettings.Margins.Top = rptPageSettings.Margins.Top;
//页面尺寸设定
PaperSize paperSize = new PaperSize();
if (this.m_isLandSapce)
{
//横向
paperSize.Height = rptPageSettings.PaperSize.Width;
paperSize.Width = rptPageSettings.PaperSize.Height;
}
else
{
paperSize.Height = rptPageSettings.PaperSize.Height;
paperSize.Width = rptPageSettings.PaperSize.Width;
}
paperSize.PaperName = rptPageSettings.PaperSize.PaperName;
paperSize.RawKind = rptPageSettings.PaperSize.RawKind;
this.m_pageSettings.PaperSize = paperSize;
//打印方向
this.m_pageSettings.Landscape = m_isLandSapce;
#endregion 页面设置
//根据打印机物理边距(可打印区域距离纸张边距)重新调整页边距,以适应不同的打印机
unchecked
{
this.m_pageSettings.Margins.Left -= (int)m_printDocument.DefaultPageSettings.HardMarginX;//左边距减去打印机可打印区域边距
this.m_pageSettings.Margins.Top -= (int)m_printDocument.DefaultPageSettings.HardMarginY;//上边距减去可打印区域边距
}
//设置默认打印机页面
m_printDocument.DefaultPageSettings = (PageSettings)m_pageSettings.Clone();
//保存当前打印机设置
//导出后打印
Export(rptView.LocalReport, this.m_pageSettings);
Application.DoEvents();
this.m_currentPageIndex = 0;
Print(rptView.LocalReport);
}
else
{
this.btnPrint.Enabled = true;
this.Cursor = Cursors.Default;
string msg = String.Format("由于当前打印机安装有问题,无法打印。\r\n\"{0}\"请检查打印机设置或重新选择打印机。", this.m_printDocument.PrinterSettings.PrinterName);
MessageBox.Show(msg, "报表打印");
}
}
#endregion 打印
#region 单位转换
/// <summary>
/// 英尺到厘米的转换
/// 1 inch = 2.5400 cm
/// </summary>
/// <param name="inch">英尺数</param>
/// <returns>厘米数,两位小数</returns>
public static decimal FromInchToCM(decimal inch)
{
//由于Printing空间中的所有纸张尺寸都是以百分之一英寸为单位,所以需要除以100
return Math.Round((System.Convert.ToDecimal((inch / 100)) * System.Convert.ToDecimal(2.5400)), 2);
}
#endregion 单位转换
#region 不用的代码///Guog,2009,3.30,以后可用
//首页
private void btnFirstPage_Click(object sender, EventArgs e)
{
}
//尾页
private void btnLastPage_Click(object sender, EventArgs e)
{
}
//上一页
private void btnPrePage_Click(object sender, EventArgs e)
{
if (this.rptView.CurrentPage > 1)
{
this.rptView.CurrentPage--;
}
}
//下一页
private void btnNextPage_Click(object sender, EventArgs e)
{
try
{
this.rptView.CurrentPage++;
}
catch (Exception ex)
{
this.rptView.CurrentPage--;
}
}
//导出
private void btnExport_Click(object sender, EventArgs e)
{
string strFileName = "";
SaveFileDialog saveDlg = new SaveFileDialog();
saveDlg.AddExtension = true;
saveDlg.CheckPathExists = true;
saveDlg.DefaultExt = ".xls";
saveDlg.Filter = "Excel 文件 (*.xls)|*.xls|PDF 文件 (*.pdf)|*.pdf";
saveDlg.ShowHelp = false;
saveDlg.Title = "请选择导出路径及文件名称";
if (saveDlg.ShowDialog(this) == DialogResult.OK)
{
strFileName = saveDlg.FileName;
if (ReportExport(strFileName))
{
if (MessageBox.Show("文件保存完成!\r\n" + strFileName + "\r\n 要现在打开文件吗?", "导出成功", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
System.Diagnostics.Process.Start(strFileName);
}
}
}
}
#region 导出
/// <summary>
/// 导出Excel或Pdf文件,通过文件扩展名自动识别
/// </summary>
/// <param name="name">文件路径及名称(包括扩展名)</param>
/// <returns>导出成功返回true,否则返回false</returns>
private bool ReportExport(string name)
{
bool result = false;
string Name = name;
string strFileName;//文件名
string strExtend=".xls";//扩展名
string strFormat="Excel";//文件格式
bool validate = false;
if (name != null || name.Trim() != String.Empty)
{
Name = name.Trim();
strFileName = Path.GetFileName(Name);
if (strFileName.Trim() != String.Empty)
{
strExtend = Path.GetExtension(Name).Trim().ToLower();
switch (strExtend)
{
case ".xls":
strFormat = "EXcel";
break;
case ".pdf":
strFormat = "PDF";
break;
default:
strFormat = "Excel";
break;
}
validate = true;
}
}
if (validate)
{
Warning[] Warnings;
string[] strStreamIds;
string strMimeType;
string strEncoding;
string strFileNameExtension;
byte[] bytes = this.rptView.LocalReport.Render(strFormat, null, out strMimeType,
out strEncoding, out strFileNameExtension, out strStreamIds, out Warnings);
using (System.IO.FileStream fs = new FileStream(Name, FileMode.Create))
{
fs.Write(bytes, 0, bytes.Length);
}
result = true;
}
return result;
}
#endregion 导出
#endregion 不用的代码///Guog,2009,3.30,以后可用
}
} #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>
/// 关闭当前所有文件流
/// </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();
}
}
/// <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)
{
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++;
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
}
private void BeginPrint(object sender, PrintEventArgs e)
{
this.btnPrint.Enabled = false;
}
private void EndPrint(object sender, PrintEventArgs e)
{
this.btnPrint.Enabled = true;
}
private void QueryPageSettings(object sender, QueryPageSettingsEventArgs e)
{
e.PageSettings = (PageSettings)this.m_pageSettings.Clone();
}
private void Print(LocalReport report)
{
string printerName = this.m_printDocument.DefaultPageSettings.PrinterSettings.PrinterName;
//const string printerName = "Microsoft Office Document Image Writer";
if (m_streams == null || m_streams.Count == 0)
return;
//PrintDocument printDoc = new PrintDocument();
if (this.m_printDocument != null && this.m_printDocument.PrinterSettings.IsValid)
{
//this.m_printDocument.PrinterSettings.PrinterName = printerName;
this.m_printDocument.BeginPrint+=new PrintEventHandler(BeginPrint);
this.m_printDocument.EndPrint+=new PrintEventHandler(EndPrint);
//this.m_printDocument.QueryPageSettings += new QueryPageSettingsEventHandler(QueryPageSettings);
this.m_printDocument.PrintPage += new PrintPageEventHandler(PrintPage);
try
{
this.m_printDocument.Print();
}
catch (Exception ex)
{
this.btnPrint.Enabled = true;
this.Cursor = Cursors.Default;
string msg = String.Format("由于当前打印机安装有问题,无法打印。\r\n\"{0}\"请检查打印机设置或重新选择打印机。\n", printerName);
MessageBox.Show(msg, "打印错误");
}
}
else
{
this.btnPrint.Enabled = true;
this.Cursor = Cursors.Default;
string msg = String.Format("由于当前打印机安装有问题,无法打印。\r\n\"{0}\"请检查打印机设置或重新选择打印机。", printerName);
MessageBox.Show(msg, "报表打印");
}
}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>
/// 总计页数
/// </summary>
private int m_TotalPages = 0;
/// <summary>
/// 是否横向打印,true表示横向,false表示纵向
/// </summary>
private bool m_isLandSapce = false;
/// <summary>
/// 打印输出的对象
/// </summary>
private ReportPrintBase m_reportPrintBase = null;
#endregion 成员变量
#region 窗体事件
public FrmMeterVerifyPrintView(ReportPrintBase reportPrintBase)
{
InitializeComponent();
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.Percent;
this.rptView.ZoomPercent = 120;
}
#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();
}
#endregion
#region 获取所有打印机
/// <summary>
/// 获取当前安装在计算机上的所有打印机名称
/// </summary>
/// <returns></returns>
public static PrinterSettings.StringCollection GetAllPrintNames()
{
return System.Drawing.Printing.PrinterSettings.InstalledPrinters;
}
#endregion 获取所有打印机
#region 绑定打印机列表