博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RDLC报表 自定义打印按钮(解决rdlc只有在IE下才显示打印按钮的问题)
阅读量:4709 次
发布时间:2019-06-10

本文共 5992 字,大约阅读时间需要 19 分钟。

using System;

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

using System.IO;

using Microsoft.Reporting.WebForms;

///     /// PrintHelper 的摘要描述    ///     public class PrintHelper    {        private int m_currentPageIndex;        private IList
m_streams; private bool isLandSapces=false; ///
/// /// ///
rdlc路径 ///
打印机名称 ///
数据表集数据 ///
数据对应rdlc中的数据集名称 ///
报表参数集合 ///
是否隐藏 ///
输出信息 ///
报表长度(单位:mm) public void Run(string reportPath, string printerName, DataTable dt1, string dt1SourceName, List
paramesList, bool isHindeLogo, out string msg, int reportWidth = 430) { LocalReport report = new LocalReport(); report.ReportPath = reportPath;//加上报表的路径 report.DataSources.Add(new ReportDataSource(dt1SourceName, dt1)); report.EnableExternalImages = true; report.SetParameters(paramesList); //ReportParameter rp = new ReportParameter("isHindeLogoImg", isHindeLogo.ToString());//这里我在报表里弄的参数 //report.SetParameters(rp); isLandSapces = report.GetDefaultPageSettings().IsLandscape; Export(report, reportWidth); m_currentPageIndex = 0; Print(printerName, out msg); } ///
/// /// ///
///
报表长度(单位:mm) private void Export(LocalReport report,int reportWidth=430) { string deviceInfo = "
" + "
EMF
" + "
" + reportWidth + "mm
" + "
297mm
" + "
5mm
" + "
10mm
" + "
10mm
" + "
5mm
" + "
";//这里是设置打印的格式 边距什么的 Warning[] warnings; m_streams = new List
(); try { report.Render("Image", deviceInfo, CreateStream, out warnings);//一般情况这里会出错的 使用catch得到错误原因 一般都是简单错误 } catch (Exception ex) { Exception innerEx = ex.InnerException;//取内异常。因为内异常的信息才有用,才能排除问题。 while (innerEx != null) { //MessageBox.Show(innerEx.Message); string errmessage = innerEx.Message; innerEx = innerEx.InnerException; } } foreach (Stream stream in m_streams) { stream.Position = 0; } } string ssss = "--"; private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) { //name 需要进一步处理 Stream stream = null; try { stream = new FileStream("c:\\users\\administrator\\documents\\visual studio 2010\\Projects\\WebApplication1\\WebApplication1\\Report\\" + name + DateTime.Now.Millisecond + "." + fileNameExtension, FileMode.Create);//为文件名加上时间 m_streams.Add(stream); } catch (Exception ex) { ssss = ex.Message; } return stream; } private void Print(string printerName, out string msg) { msg = ""; //string printerName = this.TextBox1.Text.Trim();// "傳送至 OneNote 2007"; if (m_streams == null || m_streams.Count == 0) { msg = "没有要打印的数据,请重试"; return; } PrintDocument printDoc = new PrintDocument(); if (printerName.Length > 0) { printDoc.PrinterSettings.PrinterName = printerName; printDoc.DefaultPageSettings.Landscape = isLandSapces; } foreach (PaperSize ps in printDoc.PrinterSettings.PaperSizes) { if (ps.PaperName == "A4") { printDoc.DefaultPageSettings.PaperSize = ps; // printDoc.PrinterSettings.IsDefaultPrinter;//知道是否是预设定的打印机 } } if (!printDoc.PrinterSettings.IsValid) { msg = String.Format("找不到打印机: " + printDoc.PrinterSettings.PrinterName); System.Diagnostics.Debug.WriteLine(msg); return; } printDoc.PrintPage += new PrintPageEventHandler(PrintPage); printDoc.Print(); } private void PrintPage(object sender, PrintPageEventArgs ev) { Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]); //设置高质量插值法 ev.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量,低速度呈现平滑程度 ev.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; ev.Graphics.DrawImage(pageImage, new System.Drawing.Rectangle(0, 0, ev.PageBounds.Width, ev.PageBounds.Height), new System.Drawing.Rectangle(0, 0, pageImage.Width, pageImage.Height), System.Drawing.GraphicsUnit.Pixel); m_currentPageIndex++; ev.HasMorePages = (m_currentPageIndex < m_streams.Count); }

调用:  new PrintHelper().Run(reportPath, printName, dtRep, "EleCostDetails", paramsList, true, out msg, reportWidth);

注意:

 

report.Render()的时候,如果设置的reportWidth长度不够,则会生成几张拼接的图片,那么在打印的时候,不管怎么设置,打印出来的也是列表欠缺的报表,如上图所示

public void Render(string format, string deviceInfo, CreateStreamCallback createStream, out Warning[] warnings);微软介绍与例子:

    CreateStreamCallback委托(为 ReportViewer 控件提供流以进行呈现)。 微软的介绍: 

    附上PrinterSettings类的微软介绍:

转载于:https://www.cnblogs.com/pear-liang/p/6402157.html

你可能感兴趣的文章
Kafka如何保证数据不丢失
查看>>
cat命令
查看>>
matlab求定积分和不定积分
查看>>
找规律(hdu2502)
查看>>
LinkedList源码分析
查看>>
IDBC
查看>>
中国剩余定理
查看>>
DOM基础3
查看>>
如何将ppt转换为高清图片?
查看>>
spring注入方式和数据的注入
查看>>
win10+python3.5,使用requests抓取信息遇到chunked乱码的诡异问题。python2.7则不乱码...
查看>>
面向对象 组合
查看>>
UIScrollView的缩放原理
查看>>
runtime
查看>>
VS2008中宽字节和普通字节的使用
查看>>
父类 子类 构造方法
查看>>
vs2015下编译duilib的几个问题
查看>>
获取周的日期范围
查看>>
css案例学习之盒子模型
查看>>
postMan模拟get和post请求,支持局域网和外网
查看>>