vs2017使用rdlc实现批量打印
接着上一篇:上一篇写了安装,这篇直接搞定批量打印,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(); })));
}
}
四、设计报表一些注意事项(可以用差之毫厘失之千里来形容)
- A4竖版打印,标头设计宽,长只能小于等于宽,要是大于就会出现空白页情况。
- A4横版打印,标头设计宽,长度跟竖版一样,注意这个数字是我一点点试出来的,多一点就会出现表的列显示不全,会跑到第二页里面,大家也可以自己试试。
- 要想每一页都显示标题,只能把标题加入到页眉之中,注意页眉的底部一定要跟表重合否则到第二页跟上边距会跟第一页不一样,具体什么样自己试一下就知道了,
- 表要是想加实线,注意设计的时候,这个大家一试便知。
- 要想每一页都显示表的标题部分可以这么设计
剩下的内容的字体啊间距啊,就根据自己需求自己调吧,注意设计的时候尽量表要与两边重合,标题要与顶部重合,因为他默认是上下左右间距都是2CM,你要是有距离你打印出来就不好看了,这个自己试试就知道了。
五、结尾
把一些我参考的链接放出来,大家可以自行参考。
https://blog.csdn.net/nuptsv_ice/article/details/41821611
有个批量打印代码链接找不到了,要是找到会补上去的。
vs2017使用rdlc实现批量打印的更多相关文章
- 一个由正则表达式引发的血案 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. 一些特殊字符,如“&”,“- ...
- VS2012报表(RDLC)系列应用之单据批量打印
一.前言 最近做的项目需要单据批量打印的功能,优先想到用RDLC来实现.经过Visual Studio几个版本的发展后,RDLC愈发成熟,操作方式也变得简洁,相比vs2005的版本,有质的提升,不过仍 ...
- vs2017使用rdlc
写在前面:因为公司要求做个批量打印工具,以前用Delphi+FastReport开发的,现在因为公司就剩下一个Delphi开发工程师了,还外出,所以这是就落在我身上.因为这个打印工具不需要使用人员设计 ...
- ArcGIS中国工具应用:固定比例尺固定纸张批量打印
ArcGIS中国工具应用:固定比例尺固定纸张批量打印 下载地址:http://files.cnblogs.com/files/gisoracle/a3batchprint.zip 固定A3,比例尺1: ...
- (转: daifubing的博客 )Delphi二维码中文支持、分组、批量打印经验小结
一直也没接触到什么复杂的报表,都是一些简单的报表,在DelphI下使用QuickReport一般也就能满足需要了,由于公司现在需求的变化,对条码扫描提出了新的要求,主要是扫码要包含更多地内容,以前的一 ...
- asp.net Lodop实现批量打印
1.列表(前台) <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="w_stu ...
- .net 批量打印可实现方案
最近几年一直在教育行业工作,主要负责竞赛类系统的开发工作,包括网上报名,安排考场,在线考试,学业报告书等. 打印功能在这个信息化时代非常普遍,浏览器都自带打印功能,通常的做法是调用 window.pr ...
- [Q]关于不同比例、不同纸张大小图纸的批量打印
不同比例或不同纸张大小的图纸可以一起批量打印,但目前打图精灵不能自动识别纸张大小,纸张大小是手动指定的,且只能指定一种纸张大小,但设置打印比例为“缩放到可打印区域”或“缩放到纸张边界”仍然可以将不同比 ...
- winfrom 实现条形码批量打印以及将条形码信息生成PDF文件
最近,老大让给客户做个邮包管理程序.其中,包括一些基本信息的增.删.查和改,这些倒不是很难搞定它分分钟的事.其主要难点就在于如何生成条形码.如何批量打印条形码以及将界面条形码信息批量生成以其各自的 b ...
随机推荐
- Metasploit学习
阶段一:初步渗透 GO! msfconsole 相关漏洞 msf > search platform: windows xp sp3 查看某个漏洞后,查看漏洞详细信息 msf > info ...
- h5解决移动端上滑卡顿问题
select{ -webkit-overflow-scrolling: touch;/*解决移动端滑动卡顿问题*/ -webkit-transform: translateZ(0px);/*开启GPU ...
- QueryRunner类的八种结果处理集
package cn.jy.demo; import java.sql.Connection; import java.sql.SQLException; import java.util.List; ...
- js 实现获取当前日期/时间/星期
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- C# 遇到 which has a higher version than referenced assembly
当C#遇到这种提示: which has a higher version than referenced assembly, 说明有两个或多个工程引用的dll的版本有出现不一样, 如: A工程引用l ...
- http://itellyou.cn/
http://itellyou.cn/ 这里提供了微软MSDN上所有能下载的软件. 下载完记得检验. 这是更详细的介绍:http://wenku.baidu.com/link?url=_dZ0mYvl ...
- spring学习 三 框架的搭建
1 导入jar包 spring启来最少要5个包,四个核心包和一个依赖的日志包 2 创建配置文件 在dynamic web project下的src目录下,创建一个spring的xml配置文件,名称可以 ...
- 必看的经典金融书籍推荐zz
5. 现代企业财务管理,11th詹姆斯.C.范霍恩,经济科学出版社,2002 6. Financial market and corporate strategy,glinbratt, 四.金融计量 ...
- Codeforces 1103 简要题解(持续更新)
文章目录 A题 B题 C题 D题 传送门 又一场原地爆炸的比赛. A题 传送门 简单思维题 题意:给一个4∗44*44∗4的格子图和一个01串,你要根据01串放1∗21*21∗2的木块,如果是0就竖放 ...
- Win7 VS2017简单编译FFMPEG播放器FFPlay
Win平台简单编译FFPlay播放器,顺便纪念下雷霄骅,一年前刚学FFMPEG时还看过他的博客,昨晚再次搜FFMPEG文章时才知道人已经走了... 做成了视频放到B站 https://www.bili ...