用微软的RDLC报表直接打印不预览

直接上代码。

 //打印清单
System.Data.DataTable dt = print_QD(dr);
ReportViewer rvDoc = new ReportViewer();
rvDoc.LocalReport.ReportEmbeddedResource = "SD_bcso.Report.rdlc";//加上报表的路径
rvDoc.LocalReport.DataSources.Add(new ReportDataSource(dt.TableName, dt));
PrintStream(rvDoc.LocalReport);
 /// <summary>
/// 用来记录当前打印到第几页了
/// </summary>
private int m_currentPageIndex; /// <summary>
/// 声明一个Stream对象的列表用来保存报表的输出数据,LocalReport对象的Render方法会将报表按页输出为多个Stream对象。
/// </summary>
private IList<Stream> m_streams; private bool isLandSapces = false; /// <summary>
/// 用来提供Stream对象的函数,用于LocalReport对象的Render方法的第三个参数。
/// </summary>
/// <param name="name"></param>
/// <param name="fileNameExtension"></param>
/// <param name="encoding"></param>
/// <param name="mimeType"></param>
/// <param name="willSeek"></param>
/// <returns></returns>
private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
{
//如果需要将报表输出的数据保存为文件,请使用FileStream对象。
Stream stream = new MemoryStream();
m_streams.Add(stream);
return stream;
} /// <summary>
/// 为Report.rdlc创建本地报告加载数据,输出报告到.emf文件,并打印,同时释放资源
/// </summary>
/// <param name="rv">参数:ReportViewer.LocalReport</param>
public void PrintStream(LocalReport rvDoc)
{
//获取LocalReport中的报表页面方向
isLandSapces = rvDoc.GetDefaultPageSettings().IsLandscape;
Export(rvDoc);
PrintSetting();
Dispose();
} private void Export(LocalReport report)
{
string deviceInfo =
@"<DeviceInfo>
<OutputFormat>EMF</OutputFormat>
</DeviceInfo>";
Warning[] warnings;
m_streams = new List<Stream>();
//将报表的内容按照deviceInfo指定的格式输出到CreateStream函数提供的Stream中。
report.Render("Image", deviceInfo, CreateStream, out warnings);
foreach (Stream stream in m_streams)
stream.Position = ;
} private void PrintSetting()
{
if (m_streams == null || m_streams.Count == )
throw new Exception("错误:没有检测到打印数据流");
//声明PrintDocument对象用于数据的打印
PrintDocument printDoc = new PrintDocument();
//获取配置文件的清单打印机名称
System.Configuration.AppSettingsReader appSettings = new System.Configuration.AppSettingsReader();
printDoc.PrinterSettings.PrinterName = appSettings.GetValue("QDPrint", Type.GetType("System.String")).ToString();
printDoc.PrintController = new System.Drawing.Printing.StandardPrintController();//指定打印机不显示页码
//判断指定的打印机是否可用
if (!printDoc.PrinterSettings.IsValid)
{
throw new Exception("错误:找不到打印机");
}
else
{
//设置打印机方向遵从报表方向
printDoc.DefaultPageSettings.Landscape = isLandSapces;
//声明PrintDocument对象的PrintPage事件,具体的打印操作需要在这个事件中处理。
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
m_currentPageIndex = ;
//设置打印机打印份数
printDoc.PrinterSettings.Copies = ;
//执行打印操作,Print方法将触发PrintPage事件。
printDoc.Print();
}
} /// <summary>
/// 处理程序PrintPageEvents
/// </summary>
/// <param name="sender"></param>
/// <param name="ev"></param>
private void PrintPage(object sender, PrintPageEventArgs ev)
{
//Metafile对象用来保存EMF或WMF格式的图形,
//我们在前面将报表的内容输出为EMF图形格式的数据流。
Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]); //调整打印机区域的边距
System.Drawing.Rectangle adjustedRect = new System.Drawing.Rectangle(
ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
ev.PageBounds.Width,
ev.PageBounds.Height); //绘制一个白色背景的报告
//ev.Graphics.FillRectangle(Brushes.White, adjustedRect); //获取报告内容
//这里的Graphics对象实际指向了打印机
ev.Graphics.DrawImage(pageImage, adjustedRect);
//ev.Graphics.DrawImage(pageImage, ev.PageBounds); // 准备下一个页,已确定操作尚未结束
m_currentPageIndex++; //设置是否需要继续打印
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
} public void Dispose()
{
if (m_streams != null)
{
foreach (Stream stream in m_streams)
stream.Close();
m_streams = null;
}
}

最新文章

  1. 项目中遇到的关于兄弟controller之间传值的问题解决
  2. Java知识积累3-XML的DOM解析修改和删除方法
  3. 推荐一个自动抽取pdf高亮笔记的web应用
  4. mysql 函数编程大全(持续更新)
  5. 【第二课】深入理解Handler
  6. 深度学习入门教程UFLDL学习实验笔记二:使用向量化对MNIST数据集做稀疏自编码
  7. 微软WTL模板库完整版安装(VS2010+windows7X64位环境下)分享
  8. windows下顽固软件卸载不了的解决方法
  9. 迷宫城堡--HDOJ 1269
  10. &lt;META http-equiv=Content-Type content=&quot;text/html; charset=gb2312&quot;&gt;
  11. Linux shell用法和技巧(转)
  12. 如何用Linux外接显示器或投影仪
  13. const与readonly
  14. 关于A2C算法
  15. js 面向对象的三大特性:封装,继承、多态
  16. Kademlia、DHT、KRPC、BitTorrent 协议、DHT Sniffer
  17. 普林斯顿微积分读本 大纲与重点 (by zzd)
  18. java获取视频缩略图
  19. 格式化p6spy的输出日志
  20. bind,live,delegate

热门文章

  1. NodeJS Hello world
  2. WEBAPP开发技巧总结
  3. Hibernate各种主键生成器策略与配置详解(转载)
  4. AdaBoost算法简介
  5. bigautocomplete实现联想输入,自动补全
  6. atitit.hbnt orm db 新新增更新最佳实践o99
  7. atitit. hb 原生sql跨数据库解决原理 获得hb 数据库类型运行期获得Dialect
  8. mysql输入密码后闪退怎么办?
  9. 关于 ‘--exec’ 参数( find 命令)及介绍 ‘xargs ’命令区别(新版)
  10. [推荐]dubbo分布式服务框架知识介绍