在不预览的情况下打印RDLC报表

来源:互联网 发布:淘宝教育网 编辑:程序博客网 时间:2024/04/30 18:10

  水晶报表是相当不错的报表,不管是在报表浏览器中还是直接打印方式下,编程都相当方便,但有一点在web下好象权限管理有些麻烦,影响了正常打印,所以换成Microsoft Sql Server Report,但有一个问题又出现了,他没有直接打印功能。头痛。后在msdn中找到了解决方案.

代码如下:

 using System;

using System.IO;

using System.Data;

using System.Text;

using System.Drawing.Imaging;

using System.Drawing.Printing;

using System.Collections.Generic;

using System.Windows.Forms;

using Microsoft.Reporting.WinForms;

publicclass Demo : IDisposable

{   

privateint m_currentPageIndex;   

private IList<Stream> m_streams;   

private DataTable LoadSalesData()   

{       

// Create a new DataSet and read sales data file        

//    data.xml into the first DataTable.       

DataSet dataSet =new DataSet();       

dataSet.ReadXml(@"..\..\data.xml");       

return dataSet.Tables[0];   

 }   

// Routine to provide to the report renderer, in order to   

//    save an image for each page of the report.   

private Stream CreateStream(string name,     string fileNameExtension, Encoding encoding,     string mimeType, bool willSeek)   

 {       

Stream stream =new MemoryStream();       

m_streams.Add(stream);       

return stream;   

}   

 // Export the given report as an EMF (Enhanced Metafile) file.   

privatevoid Export(LocalReport report)   

 {       

string deviceInfo =         @"<DeviceInfo>               

<OutputFormat>EMF</OutputFormat>               

<PageWidth>8.5in</PageWidth>               

<PageHeight>11in</PageHeight>               

<MarginTop>0.25in</MarginTop>               

<MarginLeft>0.25in</MarginLeft>               

<MarginRight>0.25in</MarginRight>                <MarginBottom>0.25in</MarginBottom>          

  </DeviceInfo>";       

Warning[] warnings;       

m_streams = new List<Stream>();       

report.Render("Image", deviceInfo, CreateStream,          out warnings);       

foreach (Stream streamin m_streams)           

 stream.Position = 0;   

}   

// Handler for PrintPageEvents   

 privatevoid PrintPage(object sender, PrintPageEventArgs ev)   

 {       

Metafile pageImage =new           Metafile(m_streams[m_currentPageIndex]);       

// Adjust rectangular area with printer margins.       

Rectangle adjustedRect =new Rectangle(           

ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,           

ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,            ev.PageBounds.Width,           

 ev.PageBounds.Height);       // Draw a white background for the report        ev.Graphics.FillRectangle(Brushes.White, adjustedRect);       // Draw the report content       

ev.Graphics.DrawImage(pageImage, adjustedRect);       // Prepare for the next page. Make sure we haven't hit the end.       

 m_currentPageIndex++;        ev.HasMorePages = (m_currentPageIndex < m_streams.Count);   

}   

privatevoid Print()   

 {       

 if (m_streams ==null || m_streams.Count == 0)           

thrownew Exception("Error: no stream to print.");       

PrintDocument printDoc =new PrintDocument();       

 if (!printDoc.PrinterSettings.IsValid)       

 {           

thrownew Exception("Error: cannot find the default printer.");       

 }       

 else       

 {           

printDoc.PrintPage +=new PrintPageEventHandler(PrintPage);           

m_currentPageIndex = 0;           

printDoc.Print();       

 }   

 }   

// Create a local report for Report.rdlc, load the data,   

 //    export the report to an .emf file, and print it.   

 privatevoid Run()   

{       

LocalReport report =new LocalReport();       

report.ReportPath =@"..\..\Report.rdlc";       

report.DataSources.Add(new ReportDataSource("Sales", LoadSalesData()));       

Export(report);       

Print();   

}   

publicvoid Dispose()   

 {       

if (m_streams !=null)       

{           

foreach (Stream streamin m_streams)               

stream.Close();           

m_streams =null;       

}   

 }   

publicstaticvoid Main(string[] args)   

 {       

using (Demo demo =new Demo())       

 {           

 demo.Run();       

 }   

}

}

}

 

你可以修改以上代码来完成你的需求(有个问题。Microsoft为什么不封装这些,成为一个功能可选项呢)

 

【代码】来源于MSDNhttp://msdn.microsoft.com/zh-cn/library/ms252091.aspx

 

原创粉丝点击