接着上一篇:上一篇写了安装,这篇直接搞定批量打印,A4纸横版竖版页面设计,正式开始。(我的表达不怎么好,我尽量发图片都是程序员一点就通)

一、界面展示

忽略界面设计丑

查看预览界面,因为有数据就不截全屏了,盒号是我自己加的,我们自己的业务逻辑。

三、核心代码,批量打印(参考代码链接,放到文章结尾处)

   public class BillPrint : IDisposable
{
/// <summary>
/// 当前打印页号
/// </summary>
static int m_currentPageIndex; /// <summary>
/// RDCL转换stream一页对应一个stream
/// </summary>
static List<Stream> m_streams; /// <summary>
/// 把report输出成stream
/// </summary>
/// <param name="report">传入需要Export的report</param>
private void Export(LocalReport report)
{
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>EMF</OutputFormat>" +
//" <PageWidth>2in</PageWidth>" +
//" <PageHeight>20in</PageHeight>" +
//" <MarginTop>0in</MarginTop>" +
//" <MarginLeft>0in</MarginLeft>" +
//" <MarginRight>0in</MarginRight>" +
//" <MarginBottom>0in</MarginBottom>" +
"</DeviceInfo>";
m_streams = new List<Stream>();
report.Render("Image", deviceInfo, CreateStream, out Warning[] warnings);
foreach (Stream stream in m_streams)
stream.Position = ;
} /// <summary>
/// 创建具有指定的名称和格式的流。
/// </summary>
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;
} /// <summary>
/// 打印输出
/// </summary>
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);
}
/// <summary>
/// 设置横版打印
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Document_QueryPageSettings(object sender, QueryPageSettingsEventArgs e)
{
e.PageSettings.Landscape = false;
int index = -;
for (int i = ; i < e.PageSettings.PrinterSettings.PaperSizes.Count; i++)
{
if (e.PageSettings.PrinterSettings.PaperSizes[i].PaperName == "A4")
{
index = i;
break;
}
}
if (index != -)
{
e.PageSettings.PaperSize = e.PageSettings.PrinterSettings.PaperSizes[index];
}
} /// <summary>
/// 打印预处理
/// </summary>
private void Print(string printerName = null)
{
PrintDocument printDoc = new PrintDocument();
if (string.IsNullOrEmpty(printerName))
{
printerName = printDoc.PrinterSettings.PrinterName;
}
if (m_streams == null || m_streams.Count == )
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); //设置横版打印
printDoc.QueryPageSettings += new QueryPageSettingsEventHandler(Document_QueryPageSettings); StandardPrintController spc = new StandardPrintController();
printDoc.PrintController = spc;
printDoc.Print();
} /// <summary>
/// 对外接口,启动打印
/// </summary>
/// <param name="report"></param>
/// <param name="printerName">默认打印机</param>
public static void Run(LocalReport report, string printerName = null)
{
m_currentPageIndex = ;
BillPrint billPrint = new BillPrint();
billPrint.Export(report);
billPrint.Print();
billPrint.Dispose();
} /// <summary>
/// 获取打印机状态
/// </summary>
/// <param name="printerName">打印机名称</param>
/// <param name="status">输出打印机状态</param>
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 = ;
IntPtr buffer = IntPtr.Zero;
Win32.GetPrinter(liHandle, level, buffer, , out uint 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;
}
} /// <summary>
/// 对外接口,调去打印机信息
/// </summary>
/// <param name="printerName">打印机名称</param>
/// <returns>返回打印机当前状态</returns>
public static string GetPrinterStatus(string printerName)
{
uint intValue = ;
PrintDocument pd = new PrintDocument();
printerName = printerName == "" ? pd.PrinterSettings.PrinterName : printerName;
GetPrinterStatus2(printerName, ref intValue);
string strRet = string.Empty;
switch (intValue)
{
case :
strRet = "准备就绪(Ready)";
break;
case :
strRet = "被打开(Lid Open)";
break;
case :
strRet = "打印纸用完(Out of Paper)";
break;
case :
strRet = "被打开并且打印纸用完(Out of Paper && Lid Open)";
break;
case :
strRet = "打印中(Printing)";
break;
case :
strRet = "初始化(Initializing)";
break;
case :
strRet = "手工送纸(Manual Feed in Progress)";
break;
case :
strRet = "脱机(Offline)";
break;
default:
strRet = "未知状态(unknown state)";
break;
}
return strRet;
} public void Dispose()
{
if (m_streams != null)
{
foreach (Stream stream in m_streams)
stream.Close();
m_streams = null;
}
}
} 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;
}
}

代码使用

   using (ReportViewer rvDoc = new ReportViewer())
{
rvDoc.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", 你的数据));
//注意自己的路径,这块我写到配置文件,来区分测试跟线上路径。
if (PublicProperty.RdlcPath == "Debug")
{
rvDoc.LocalReport.ReportPath = @"..\..\ReportForm\GTTKWenShuArchives.rdlc";
}
else
{
rvDoc.LocalReport.ReportPath = Application.StartupPath + "\\ReportForm\\GTTKWenShuArchives.rdlc";
}
//开始打印,第二个参数是选择打印机名称
BillPrint.Run(rvDoc.LocalReport, (string)printerList.Invoke(new obj_delegate(() => { return printerList.SelectedItem.ToString(); })));
}
}

四、设计报表一些注意事项(可以用差之毫厘失之千里来形容)

  1. A4竖版打印,标头设计宽,长只能小于等于宽,要是大于就会出现空白页情况。
  2. A4横版打印,标头设计宽,长度跟竖版一样,注意这个数字是我一点点试出来的,多一点就会出现表的列显示不全,会跑到第二页里面,大家也可以自己试试。
  3. 要想每一页都显示标题,只能把标题加入到页眉之中,注意页眉的底部一定要跟表重合否则到第二页跟上边距会跟第一页不一样,具体什么样自己试一下就知道了,
  4. 表要是想加实线,注意设计的时候,这个大家一试便知。
  5. 要想每一页都显示表的标题部分可以这么设计
  6. 剩下的内容的字体啊间距啊,就根据自己需求自己调吧,注意设计的时候尽量表要与两边重合,标题要与顶部重合,因为他默认是上下左右间距都是2CM,你要是有距离你打印出来就不好看了,这个自己试试就知道了。

五、结尾

把一些我参考的链接放出来,大家可以自行参考。

https://blog.csdn.net/nuptsv_ice/article/details/41821611

有个批量打印代码链接找不到了,要是找到会补上去的。

vs2017使用rdlc实现批量打印的更多相关文章

  1. 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器

    1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...

  2. VS2012报表(RDLC)系列应用之单据批量打印

    一.前言 最近做的项目需要单据批量打印的功能,优先想到用RDLC来实现.经过Visual Studio几个版本的发展后,RDLC愈发成熟,操作方式也变得简洁,相比vs2005的版本,有质的提升,不过仍 ...

  3. vs2017使用rdlc

    写在前面:因为公司要求做个批量打印工具,以前用Delphi+FastReport开发的,现在因为公司就剩下一个Delphi开发工程师了,还外出,所以这是就落在我身上.因为这个打印工具不需要使用人员设计 ...

  4. ArcGIS中国工具应用:固定比例尺固定纸张批量打印

    ArcGIS中国工具应用:固定比例尺固定纸张批量打印 下载地址:http://files.cnblogs.com/files/gisoracle/a3batchprint.zip 固定A3,比例尺1: ...

  5. (转: daifubing的博客 )Delphi二维码中文支持、分组、批量打印经验小结

    一直也没接触到什么复杂的报表,都是一些简单的报表,在DelphI下使用QuickReport一般也就能满足需要了,由于公司现在需求的变化,对条码扫描提出了新的要求,主要是扫码要包含更多地内容,以前的一 ...

  6. asp.net Lodop实现批量打印

    1.列表(前台) <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="w_stu ...

  7. .net 批量打印可实现方案

    最近几年一直在教育行业工作,主要负责竞赛类系统的开发工作,包括网上报名,安排考场,在线考试,学业报告书等. 打印功能在这个信息化时代非常普遍,浏览器都自带打印功能,通常的做法是调用 window.pr ...

  8. [Q]关于不同比例、不同纸张大小图纸的批量打印

    不同比例或不同纸张大小的图纸可以一起批量打印,但目前打图精灵不能自动识别纸张大小,纸张大小是手动指定的,且只能指定一种纸张大小,但设置打印比例为“缩放到可打印区域”或“缩放到纸张边界”仍然可以将不同比 ...

  9. winfrom 实现条形码批量打印以及将条形码信息生成PDF文件

    最近,老大让给客户做个邮包管理程序.其中,包括一些基本信息的增.删.查和改,这些倒不是很难搞定它分分钟的事.其主要难点就在于如何生成条形码.如何批量打印条形码以及将界面条形码信息批量生成以其各自的 b ...

随机推荐

  1. linux-ubuntu 下R无法安装HH包的原因及解决方案

    错误信息: configure: error: GNU MP not found, or not 4.1.4 or up, see http://gmplib.org ERROR: configura ...

  2. iphone手机safari浏览器访问网站滚动条不显示问题解决办法

    近排有公司同事出差在外需使用OA系统,发现iphone手机safari浏览器在该出现滚动条的页面没有显示滚动条,导致无法正常使用. 系统前端页面是采用jeasyui搭建的框架,使用iframe变更主页 ...

  3. applicationContext-common.xml]; nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal

    14:59:16,747 ERROR ContextLoader:350 - Context initialization failedorg.springframework.beans.factor ...

  4. 【Java】使用Apache POI生成和解析Excel文件

    概述 Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,分别有jxl和poi,2种方式. HSSF is the POI Project's pure ...

  5. UDDI

    什么是 UDDI? UDDI 是一个独立于平台的框架,用于通过使用 Internet 来描述服务,发现企业,并对企业服务进行集成. UDDI 指的是通用描述.发现与集成服务 UDDI 是一种用于存储有 ...

  6. 48.UIButton上的字体居右对齐

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; button.titleLabel.textAlignment = NSTe ...

  7. 2019.01.02 poj3046 Ant Counting(生成函数+dp)

    传送门 生成函数基础题. 题意:给出nnn个数以及它们的数量,求从所有数中选出i∣i∈[L,R]i|i\in[L,R]i∣i∈[L,R]个数来可能组成的集合的数量. 直接构造生成函数然后乘起来f(x) ...

  8. springboot+cfx实现webservice功能

    一.开发服务端 1.新建工程 cfx-webservice ,最终的完整工程如下: pom.xml如下: <?xml version="1.0" encoding=" ...

  9. s5-1 CPU调度

    基本概念 通过多道程序设计得到 CPU 的最高利用率 (CPU-- I/O 脉冲周期 - - 进程的执行包括进程在 CPU 上执行和等待 I/O ) 进程的执行以 CPU 脉冲开始,其后跟着 I/O ...

  10. es6 字符串方法

    1.字符串的新方法  includes() 包含属性 startsWith() 头部开始是否包含 endWith() 字符串是否在尾部   ========三个返回值都为布尔值  第二参数为数字  e ...