设为首页 收藏本站
查看: 1226|回复: 0

[经验分享] RDLC(Reportview)报表直接打印,支持所有浏览器,客户可在linux下浏览使用

[复制链接]

尚未签到

发表于 2015-3-7 01:03:28 | 显示全部楼层 |阅读模式
  最近在做一个打印清单的,但是rdlc报表自带的工具栏中的打印按钮只有在ie内核下的浏览器才可以使用(其他的就会 隐藏),这导致了使用火狐和谷歌浏览器还有使用linux系统的客户打印成了问题,于是就自己百度搜,谷歌搜,然后就解决了,下面放上源码
  打印类 PrintHelp(我需要两个table座位数据源所以参数中有两个datatable)

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.IO;
  6 using Microsoft.Reporting.WebForms;
  7 using System.Drawing.Printing;
  8 using System.Drawing.Imaging;
  9 using System.Text;
10 using System.Data;
11
12 ///
13 /// PrintHelp 的摘要描述
14 ///
15 public class PrintHelp
16 {
17   
18
19     private int m_currentPageIndex;
20     private IList m_streams;
21     ///
22     ///
23     ///
24     /// 報表路徑
25     /// 打印機名稱(使用默認打印機,不賦值)
26     /// 報表數據源1
27     /// 報表中數據源1對應名稱
28     /// 報表數據源2
29     /// 報表中數據源2對應名稱
30     public void Run(string reportPath, string printerName, DataTable dt1, string dt1SourceName, DataTable dt2, string dt2SourceName,bool isHindeLogo)
31     {
32         LocalReport report = new LocalReport();
33         report.ReportPath = reportPath;//加上报表的路径
34         report.DataSources.Add(new ReportDataSource(dt1SourceName, dt1));
35         report.DataSources.Add(new ReportDataSource(dt2SourceName, dt2));
36         report.EnableExternalImages = true;
37         ReportParameter rp = new ReportParameter("isHindeLogoImg", isHindeLogo.ToString());//这里我在报表里弄的参数
38         report.SetParameters(rp);
39         Export(report);
40         m_currentPageIndex = 0;
41         Print(printerName);
42     }
43
44     private void Export(LocalReport report)
45     {
46         string deviceInfo =
47           "" +
48           "  EMF" +
49           "  210mm" +
50           "  297mm" +
51           "  5mm" +
52           "  10mm" +
53           "  10mm" +
54           "  5mm" +
55           "";//这里是设置打印的格式 边距什么的
56         Warning[] warnings;
57         m_streams = new List();
58         try
59         {
60             report.Render("Image", deviceInfo, CreateStream, out warnings);//一般情况这里会出错的  使用catch得到错误原因  一般都是简单错误
61         }
62         catch (Exception ex)
63         {
64             Exception innerEx = ex.InnerException;//取内异常。因为内异常的信息才有用,才能排除问题。
65             while (innerEx != null)
66             {
67                 //MessageBox.Show(innerEx.Message);
68                 string errmessage = innerEx.Message;
69                 innerEx = innerEx.InnerException;
70             }
71         }
72         foreach (Stream stream in m_streams)
73         {
74             stream.Position = 0;
75         }
76     }
77
78     private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
79     {
80         //name 需要进一步处理
81         Stream stream = new FileStream(name + DateTime.Now.Millisecond + "." + fileNameExtension, FileMode.Create);//为文件名加上时间
82         m_streams.Add(stream);
83         return stream;
84     }
85
86     private void Print(string printerName)
87     {
88         //string printerName = this.TextBox1.Text.Trim();// "傳送至 OneNote 2007";
89         if (m_streams == null || m_streams.Count == 0)
90             return;
91         PrintDocument printDoc = new PrintDocument();
92         // string aa = printDoc.PrinterSettings.PrinterName;
93         if (printerName.Length > 0)
94         {
95             printDoc.PrinterSettings.PrinterName = printerName;
96         }
97         foreach (PaperSize ps in printDoc.PrinterSettings.PaperSizes)
98         {
99             if (ps.PaperName == "A4")
100             {
101                 printDoc.PrinterSettings.DefaultPageSettings.PaperSize = ps;
102                 printDoc.DefaultPageSettings.PaperSize = ps;
103                 // printDoc.PrinterSettings.IsDefaultPrinter;//知道是否是预设定的打印机
104             }
105         }
106         if (!printDoc.PrinterSettings.IsValid)
107         {
108             string msg = String.Format("Can't find printer " + printerName);
109             System.Diagnostics.Debug.WriteLine(msg);
110             return;
111         }
112         printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
113         printDoc.Print();
114     }
115
116
117     private void PrintPage(object sender, PrintPageEventArgs ev)
118     {
119         Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
120         ev.Graphics.DrawImage(pageImage, 0, 0, 827, 1169);//設置打印尺寸 单位是像素
121         m_currentPageIndex++;
122         ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
123     }
124 }
  
调用很简单 直接一句话

            new PrintHelp().Run(AppDomain.CurrentDomain.BaseDirectory + "\\Reports\\Report.rdlc", this.TextBox1.Text.Trim(), stationapplication.dthead, "headsource", stationapplication.dtmessage, "datasource", true);
  
  由于原来的工具栏没了打印按钮 所以也就没有存在的必要了  隐藏掉 自己做一个工具栏出来
  缩放、上一页下一页首页什么的

///
/// 刷新
///
///
///
protected void Button7_Click(object sender, EventArgs e)
{
this.ReportViewer1.LocalReport.Refresh();
}
///
/// 首页
///
///
///
protected void Button8_Click(object sender, EventArgs e)
{
this.ReportViewer1.CurrentPage = 1;
}
///
/// 上一页
///
///
///
protected void Button9_Click(object sender, EventArgs e)
{
if (this.ReportViewer1.CurrentPage != 1)
{
this.ReportViewer1.CurrentPage--;
}
}
///
/// 下一页
///
///
///
protected void Button10_Click(object sender, EventArgs e)
{
if (this.ReportViewer1.CurrentPage != this.ReportViewer1.LocalReport.GetTotalPages())
{
this.ReportViewer1.CurrentPage++;
}
}
///
/// 尾页
///
///
///
protected void Button11_Click(object sender, EventArgs e)
{
this.ReportViewer1.CurrentPage = this.ReportViewer1.LocalReport.GetTotalPages();
}
///
/// 缩放
///
///
///
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
this.ReportViewer1.ZoomMode = ZoomMode.Percent;
this.ReportViewer1.ZoomPercent = Convert.ToInt32(this.DropDownList1.SelectedValue);
}
  
  导出文件

  protected void Button3_Click(object sender, EventArgs e)
{
ExportFile(FileType.PDF, "out.pdf");
}
protected void Button4_Click(object sender, EventArgs e)
{
ExportFile(FileType.Image, "out.jpeg");//这里可以使用任意的图片格式  只要修改out.jpeg为其他格式的名字就可以了
}
protected void Button5_Click(object sender, EventArgs e)
{
ExportFile(FileType.Excel, "out.xls");
}
protected void Button6_Click(object sender, EventArgs e)
{
ExportFile(FileType.Word, "out.doc");
}
#region 導出文件
private void ExportFile(FileType ft, string filename)
{
CreateFile(ft, filename);
string strPath = Server.MapPath(filename);
DownloadFile(strPath, filename);
}
private void CreateFile(FileType ft, string filename)
{
Warning[] warnings;
string[] streamids;
string mimeType;
string encoding = "utf-8";
string extension;
byte[] bytes = this.ReportViewer1.LocalReport.Render(ft.ToString(), null, out mimeType,
out encoding, out extension, out streamids, out warnings);
FileStream fs = new FileStream(HttpContext.Current.Server.MapPath(filename), FileMode.Create);
fs.Write(bytes, 0, bytes.Length);
fs.Close();
fs.Dispose();
}
public void DownloadFile(string path, string name)
{
try
{
System.IO.FileInfo file = new System.IO.FileInfo(path);
Response.Clear();
Response.Charset = "utf-8";
Response.ContentEncoding = System.Text.Encoding.UTF8;
// 添加头信息,为"文件下载/另存为"对话框指定默认文件名
Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(name));
// 添加头信息,指定文件大小,让浏览器能够显示下载进度
Response.AddHeader("Content-Length", file.Length.ToString());
// 指定返回的是一个不能被客户端读取的流,必须被下载
Response.ContentType = "application/octet-stream";
// 把文件流发送到客户端
            Response.WriteFile(file.FullName);
// 停止页面的执行
            HttpContext.Current.ApplicationInstance.CompleteRequest();
}
catch (Exception ex)
{
Response.Write("alert('系统出现以下错误://n" + ex.Message + "!//n请尽快与管理员联系.')");
}
}
  发送email  传真fax  什么的就不说了 很简单  搜一下一箩筐

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-44075-1-1.html 上篇帖子: CentOS7全自动安装光盘制作详解 下篇帖子: Linux Namespaces机制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表