RDLC 报表打印

RDLC 报表打印报表 rdlc 怎样直接打印 原帖地址 http bbs csdn net topics

报表rdlc怎样直接打印? 原帖地址:

http://bbs.csdn.net/topics/

http://bbs.csdn.net/topics/

http://bbs.csdn.net/topics/

报表rdlc怎样直接打印? [问题点数:100分,结帖人zhao_zps]

 using System; using System.Collections.Generic; using System.Data; using System.Drawing.Imaging; using System.Drawing.Printing; using System.IO; using System.Runtime.InteropServices; using System.Text; using Microsoft.Reporting.WinForms; namespace RDLCPrinter { ///  /// 通过RDLC向默认打印机输出打印报表 ///  public class BillPrint:IDisposable { ///  /// 当前打印页号 ///  static int m_currentPageIndex; ///  /// RDCL转换stream一页对应一个stream ///  static List 
  
    m_streams; 
   ///  
   /// 把report输出成stream 
   ///  
   /// 传入需要Export的report 
   private 
   void 
   Export(LocalReport report) { 
   string deviceInfo = 
   " 
    
      " 
     + 
   " 
    
      EMF 
    " + 
   //" 
    
      2in 
    " + 
   //" 
    
      20in 
    " + 
   " 
    
      0in 
    " + 
   " 
    
      0in 
    " + 
   " 
    
      0in 
    " + 
   " 
    
      0in 
    " + 
   ""; Warning[] warnings; m_streams = 
   new List 
   
     (); report.Render( 
    "Image", deviceInfo, CreateStream, 
    out warnings); 
    foreach (Stream stream 
    in m_streams) stream.Position = 
    0; } 
    ///  
    /// 创建具有指定的名称和格式的流。 
    ///  
    private Stream 
    CreateStream( 
    string name, 
    string fileNameExtension, Encoding encoding, 
    string mimeType, 
    bool willSeek) { Stream stream = 
    new FileStream(name + 
    "." + fileNameExtension, FileMode.Create); m_streams.Add(stream); 
    return stream; } 
    ///  
    /// 打印输出 
    ///  
    private 
    void 
    PrintPage( 
    object sender, PrintPageEventArgs ev) { Metafile pageImage = 
    new Metafile(m_streams[m_currentPageIndex]); ev.Graphics.DrawImage(pageImage, ev.PageBounds); m_currentPageIndex++; ev.HasMorePages = (m_currentPageIndex < m_streams.Count); } 
    ///  
    /// 打印预处理 
    ///  
    private 
    void 
    Print() { PrintDocument printDoc = 
    new PrintDocument(); 
    string printerName = printDoc.PrinterSettings.PrinterName; 
    if (m_streams == 
    null || m_streams.Count == 
    0) 
    return; printDoc.PrinterSettings.PrinterName = printerName; 
    if (!printDoc.PrinterSettings.IsValid) { 
    string msg = String.Format( 
    "Can't find printer \"{0}\".", printerName); 
    throw 
    new Exception(msg); } printDoc.PrintPage += 
    new PrintPageEventHandler(PrintPage); StandardPrintController spc = 
    new StandardPrintController(); printDoc.PrintController = spc; printDoc.Print(); } 
    public 
    void 
    Dispose() { 
    if (m_streams != 
    null) { 
    foreach (Stream stream 
    in m_streams) stream.Close(); m_streams = 
    null; } } 
    ///  
    /// 对外接口,启动打印 
    ///  
    /// 打印报表对应的数据源 
    /// 打印报表名称 
    public 
    static 
    void 
    Run(LocalReport report) { 
    //LocalReport report = new LocalReport(); 
    //report.ReportPath = @"..\..\" + sReport; 
    //ReportDataSource dataset = new ReportDataSource("DataSet1", dtSource); 
    //report.DataSources.Add(dataset); m_currentPageIndex = 
    0; BillPrint billPrint = 
    new BillPrint(); billPrint.Export(report); billPrint.Print(); billPrint.Dispose(); } 
    ///  
    /// 获取打印机状态 
    ///  
    /// 打印机名称 
    /// 输出打印机状态 
    private 
    static 
    void 
    GetPrinterStatus2( 
    string printerName, 
    ref 
    uint status) { 
    try { 
    string lcPrinterName = printerName; IntPtr liHandle = IntPtr.Zero; 
    if (!Win32.OpenPrinter(lcPrinterName, 
    out liHandle, IntPtr.Zero)) { Console.WriteLine( 
    "print is close"); 
    return; } UInt32 level = 
    2; UInt32 sizeNeeded = 
    0; IntPtr buffer = IntPtr.Zero; Win32.GetPrinter(liHandle, level, buffer, 
    0, 
    out sizeNeeded); buffer = Marshal.AllocHGlobal(( 
    int)sizeNeeded); 
    if (!Win32.GetPrinter(liHandle, level, buffer, sizeNeeded, 
    out sizeNeeded)) { Console.WriteLine(Environment.NewLine + 
    "Fail GetPrinter:" + Marshal.GetLastWin32Error()); 
    return; } Win32.PRINTER_INFO_2 info = (Win32.PRINTER_INFO_2)Marshal.PtrToStructure(buffer, 
    typeof(Win32.PRINTER_INFO_2)); status = info.Status; Marshal.FreeHGlobal(buffer); Win32.ClosePrinter(liHandle); } 
    catch (Exception ex) { 
    throw ex; } } 
    ///  
    /// 对外接口,调去打印机信息 
    ///  
    /// 打印机名称 
    ///  
      返回打印机当前状态 
    public 
    static 
    string 
    GetPrinterStatus( 
    string printerName) { 
    uint intValue = 
    0; PrintDocument pd = 
    new PrintDocument(); printerName = printerName == 
    "" ? pd.PrinterSettings.PrinterName : printerName; GetPrinterStatus2(printerName, 
    ref intValue); 
    string strRet = 
    string.Empty; 
    switch (intValue) { 
    case 
    0: strRet = 
    "准备就绪(Ready)"; 
    break; 
    case 
    : strRet = 
    "被打开(Lid Open)"; 
    break; 
    case 
    144: strRet = 
    "打印纸用完(Out of Paper)"; 
    break; 
    case 
    : strRet = 
    "被打开并且打印纸用完(Out of Paper && Lid Open)"; 
    break; 
    case 
    1024: strRet = 
    "打印中(Printing)"; 
    break; 
    case 
    32768: strRet = 
    "初始化(Initializing)"; 
    break; 
    case 
    160: strRet = 
    "手工送纸(Manual Feed in Progress)"; 
    break; 
    case 
    4096: strRet = 
    "脱机(Offline)"; 
    break; 
    default: strRet = 
    "未知状态(unknown state)"; 
    break; } 
    return strRet; } } 
    public 
    class Win32 { [DllImport( 
    "winspool.drv", CharSet = CharSet.Auto, SetLastError = 
    true)] 
    public 
    static 
    extern 
    bool 
    OpenPrinter( 
    string printer, 
    out IntPtr handle, IntPtr printerDefaults); [DllImport( 
    "winspool.drv")] 
    public 
    static 
    extern 
    bool 
    ClosePrinter(IntPtr handle); [DllImport( 
    "winspool.drv", CharSet = CharSet.Auto, SetLastError = 
    true)] 
    public 
    static 
    extern 
    bool 
    GetPrinter(IntPtr handle, UInt32 level, IntPtr buffer, UInt32 size, 
    out UInt32 sizeNeeded); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
    public 
    struct PRINTER_INFO_2 { 
    public 
    string pServerName; 
    public 
    string pPrinterName; 
    public 
    string pShareName; 
    public 
    string pPortName; 
    public 
    string pDriverName; 
    public 
    string pComment; 
    public 
    string pLocation; 
    public IntPtr pDevMode; 
    public 
    string pSepFile; 
    public 
    string pPrintProcessor; 
    public 
    string pDatatype; 
    public 
    string pParameters; 
    public IntPtr pSecurityDescriptor; 
    public UInt32 Attributes; 
    public UInt32 Priority; 
    public UInt32 DefaultPriority; 
    public UInt32 StartTime; 
    public UInt32 UntilTime; 
    public UInt32 Status; 
    public UInt32 cJobs; 
    public UInt32 AveragePPM; } } } 
    
  

之后调用Run(localReport)就能执行了


以上是原帖,

以下是我补充的几点:

1.打印的时候其实下面留的位置是很小的:

原代码效果

修改代码:

 private void Export(LocalReport report) { ··· " 
    
      1in 
    " + " 
    
      0in 
    " + " 
    
      0in 
    " + " 
    
      1in 
    " + ··· }

2.在button click按下去之后打印
 private void cmdPrint_Click(object sender, EventArgs e) { ReportViewer rvDoc = new ReportViewer(); rvDoc = this.reportViewer1; rvDoc.LocalReport.DataSources.Add(rds); rvDoc.LocalReport.ReportPath = @"..\..\Report1.rdlc"; //rvDoc.RefreshReport(); /* 也可以不refresh啦 */ /*自动打印*/ RDLCPrinter.BillPrint.Run(rvDoc.LocalReport);  }

这句话挺关键的:

rvDoc = this.reportViewer1;

3.补充一下上面说的调用那个类

2)在要用这个类的时候,先using RDLCPrinter;
然后调用函数的时候就可以写成:

RDLCPrinter.BillPrint.Run(rvDoc.LocalReport); 

恩 就可以用了!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205712.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午5:23
下一篇 2026年3月19日 下午5:23


相关推荐

  • java输入输出流实例代码

    java输入输出流实例代码1.编写一个程序,读取源代码文件的内容并在控制台输出。如果源文件不存在,则显示相应的错误信息。packagesrc;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;publicclasstest01{

    2022年5月25日
    44
  • spring配置c3p0数据源时出现org.springframework.beans.factory.BeanCreationException异常

    spring配置c3p0数据源时出现org.springframework.beans.factory.BeanCreationException异常

    2021年5月27日
    110
  • java栈内存初始化,阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧…

    java栈内存初始化,阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧…内存分配机制逐步分析类加载检查:虚拟机遇到一条new指令(new关键字、对象的克隆、对象的序列化等)时,会先去检查这个指令的参数在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否应被加载过,如果没有那么就去加载该类分配内存类加载完毕后会给对象分配内存空间。对象的所需的内存大小在类加载完毕后就便可完全确认,为对象分配内存大小的空间等同于把一块确定大小的内存从java堆中划分出来。如何划分…

    2022年5月14日
    39
  • php7 垃圾回收机制[通俗易懂]

    php7 垃圾回收机制

    2022年2月12日
    174
  • Java 中哈希码的说明「建议收藏」

    Java 中哈希码的说明「建议收藏」在Java中,哈希码代表对象的特征。例如下面代码对象根据HashCode由此可得出str1!=str2,str1==str3哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。2:String类的hashCode.根据String类包含的字符串的

    2025年7月23日
    4
  • hashmap的扩容原理_HashMap

    hashmap的扩容原理_HashMap本篇文章分别讲解JDK1.7和JDK1.8下的HashMap底层实现原理文章目录一、什么是HashMap?二、为什么要使用HashMap?三、HashMap扩容为什么总是2的次幂四、JDk1.7扩容死循环问题五、JDK1.8的新结构1.为什么非要使用红黑树呢?2.什么是红黑树?3.红黑树的特性一、什么是HashMap?HashMap数据结构为数组+链表(JDk1.7),JDK1.8中增加了红黑树,其中:链表的节点存储的是一个Entry对象,每个Entry对象存储四个属性(hash,key,v

    2026年2月11日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号