zoukankan      html  css  js  c++  java
  • RDLC(Reportview)报表直接打印,支持所有浏览器,客户可在linux下浏览使用

    最近在做一个打印清单的,但是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 /// <summary>
     13 /// PrintHelp 的摘要描述
     14 /// </summary>
     15 public class PrintHelp
     16 {
     17   
     18 
     19     private int m_currentPageIndex;
     20     private IList<Stream> m_streams;
     21     /// <summary>
     22     /// 
     23     /// </summary>
     24     /// <param name="reportPath">報表路徑</param>
     25     /// <param name="printerName">打印機名稱(使用默認打印機,不賦值)</param>
     26     /// <param name="dt1">報表數據源1</param>
     27     /// <param name="dt1SourceName">報表中數據源1對應名稱</param>
     28     /// <param name="dt2">報表數據源2</param>
     29     /// <param name="dt2SourceName">報表中數據源2對應名稱</param>
     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           "<DeviceInfo>" +
     48           "  <OutputFormat>EMF</OutputFormat>" +
     49           "  <PageWidth>210mm</PageWidth>" +
     50           "  <PageHeight>297mm</PageHeight>" +
     51           "  <MarginTop>5mm</MarginTop>" +
     52           "  <MarginLeft>10mm</MarginLeft>" +
     53           "  <MarginRight>10mm</MarginRight>" +
     54           "  <MarginBottom>5mm</MarginBottom>" +
     55           "</DeviceInfo>";//这里是设置打印的格式 边距什么的
    
    56 Warning[] warnings; 57 m_streams = new List<Stream>(); 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);

    由于原来的工具栏没了打印按钮 所以也就没有存在的必要了  隐藏掉 自己做一个工具栏出来

    缩放、上一页下一页首页什么的

     /// <summary>
        /// 刷新
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button7_Click(object sender, EventArgs e)
        {
            this.ReportViewer1.LocalReport.Refresh();
    
        }
    
        /// <summary>
        /// 首页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button8_Click(object sender, EventArgs e)
        {
            this.ReportViewer1.CurrentPage = 1;
    
        }
        /// <summary>
        /// 上一页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button9_Click(object sender, EventArgs e)
        {
            if (this.ReportViewer1.CurrentPage != 1)
            {
                this.ReportViewer1.CurrentPage--;
    
            }
        }
        /// <summary>
        /// 下一页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button10_Click(object sender, EventArgs e)
        {
            if (this.ReportViewer1.CurrentPage != this.ReportViewer1.LocalReport.GetTotalPages())
            {
                this.ReportViewer1.CurrentPage++;
    
            }
        }
    
        /// <summary>
        /// 尾页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button11_Click(object sender, EventArgs e)
        {
            this.ReportViewer1.CurrentPage = this.ReportViewer1.LocalReport.GetTotalPages();
        }
    
        /// <summary>
        /// 缩放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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("<script>alert('系统出现以下错误://n" + ex.Message + "!//n请尽快与管理员联系.')</script>");
            }
        }

    发送email  传真fax  什么的就不说了 很简单  搜一下一箩筐

  • 相关阅读:
    Code Forces 650 C Table Compression(并查集)
    Code Forces 645B Mischievous Mess Makers
    POJ 3735 Training little cats(矩阵快速幂)
    POJ 3233 Matrix Power Series(矩阵快速幂)
    PAT 1026 Table Tennis (30)
    ZOJ 3609 Modular Inverse
    Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
  • 原文地址:https://www.cnblogs.com/bfyx/p/3279385.html
Copyright © 2011-2022 走看看