代码实现报表打印

简介:

   代码实现报表打印

   

复制代码
     //初始化报表信息
private void SetReportInfo(string reportPath,string sourceName,DataTable dataSource,bool isFengPi)
{
if (!File.Exists(reportPath))
{
MessageBox.Show(
"报表文件:" + reportPath + " 不存在!","提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}

if (dataSource == null || dataSource.Rows.Count == 0)
{
MessageBox.Show(
"没有找到案卷号为:"+txtArchiveNum.Text.Trim()+"的相关目录信息", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
pos
= 1;
LocalReport report1
= new LocalReport();
//设置需要打印的报表的文件名称。
report1.ReportPath = reportPath;
if (isFengPi)
{
//设置参数
string archveTypeName = GetArchiveTypeName();
ReportParameter archiveType
= new ReportParameter("ArchiveType", archveTypeName);
report1.SetParameters(archiveType);
}
//创建要打印的数据源
ReportDataSource source = new ReportDataSource(sourceName, dataSource);
report1.DataSources.Add(source);
//刷新报表中的需要呈现的数据
report1.Refresh();
pos
= 2;
m_streams
= new List<Stream>();
string deviceInfo ="<DeviceInfo>" +
" <OutputFormat>EMF</OutputFormat>" +
" <PageWidth>21cm</PageWidth>" +
" <PageHeight>29.7cm</PageHeight>" +
" <MarginTop>2.0066cm</MarginTop>" +
" <MarginLeft>2.0066cm</MarginLeft>" +
" <MarginRight>2.0066cm</MarginRight>" +
" <MarginBottom>2.0066cm</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
//将报表的内容按照deviceInfo指定的格式输出到CreateStream函数提供的Stream中。
report1.Render("Image", deviceInfo, CreateStream, out warnings);
}

//声明一个Stream对象的列表用来保存报表的输出数据
//LocalReport对象的Render方法会将报表按页输出为多个Stream对象。
private List<Stream> m_streams;
//用来提供Stream对象的函数,用于LocalReport对象的Render方法的第三个参数。
private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)

{
pos
= 3;
//如果需要将报表输出的数据保存为文件,请使用FileStream对象。
Stream stream = new MemoryStream();
m_streams.Add(stream);
return stream;
}

//用来记录当前打印到第几页了
private int m_currentPageIndex;

#region 打印报表
private void Print()
{
pos
= 4;
m_currentPageIndex
= 0;
if (m_streams == null || m_streams.Count == 0)
return;
//声明PrintDocument对象用于数据的打印
PrintDocument printDoc = new PrintDocument();
//指定需要使用的打印机的名称,使用空字符串""来指定默认打印机
// printDoc.PrinterSettings.PrinterName = "";
//判断指定的打印机是否可用
if (!printDoc.PrinterSettings.IsValid)
{
MessageBox.Show(
"没有找到打印机!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
return;
}
pos
= 5;
printDoc.PrintPage
+= new PrintPageEventHandler(PrintPage);
//执行打印操作,Print方法将触发PrintPage事件。
printDoc.Print();

//释放资源
foreach (Stream stream in m_streams)
{
stream.Dispose();
stream.Close();
}
m_streams
= null;
}

private void PrintPage(object sender, PrintPageEventArgs ev)
{
pos
=6;
//Metafile对象用来保存EMF或WMF格式的图形,
//我们在前面将报表的内容输出为EMF图形格式的数据流。
m_streams[m_currentPageIndex].Position = 0;
Metafile pageImage
= new Metafile(m_streams[m_currentPageIndex]);
//指定是否横向打印
ev.PageSettings.Landscape = false;
//这里的Graphics对象实际指向了打印机
ev.Graphics.DrawImage(pageImage, ev.PageBounds);
m_streams[m_currentPageIndex].Close();
m_currentPageIndex
++;
//设置是否需要继续打印
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
}
#endregion

//打印封皮
private void btPrint_Click(object sender, EventArgs e)
{
string reportPath = Application.StartupPath + "\\Files\\ReportEnvelop.rdlc";
SetReportInfo(reportPath,
"DataSet1", GetDataSource(true), true);
Print();

}
复制代码
本文转自啊汉博客园博客,原文链接:http://www.cnblogs.com/hlxs/archive/2010/11/18/2087988.html
目录
相关文章
|
4月前
|
SQL 开发框架 前端开发
在Winform系统开发中,对表格列表中的内容进行分组展示
在Winform系统开发中,对表格列表中的内容进行分组展示
|
4月前
|
IDE Go 开发工具
spew - 更直观地打印变量
spew - 更直观地打印变量
46 0
|
6月前
|
XML 小程序 Java
java小程序代码详细展示
java小程序代码详细展示
44 0
|
JavaScript 前端开发 容器
微搭低代码实现表单打印功能
微搭低代码实现表单打印功能
|
机器人 C++
【什么是摆线减速器?设计、3D 打印和测试】
在本教程中,我们将学习什么是摆线驱动器,它是如何工作的,解释如何设计我们自己的模型和 3D 打印模型,以便我们可以在真实现场看到它并更好地了解它是如何工作的。
175 0
|
JSON 移动开发 小程序
小程序中实现二维数组的展示
小程序中实现二维数组的展示
|
图形学 C++
Qt实现Qchart的打印和打印预览的几种方法
Qt实现Qchart的打印和打印预览的几种方法
|
前端开发 容器
微搭低代码实现查询功能
微搭低代码实现查询功能
微搭低代码实现查询功能
|
运维 小程序 前端开发
基于小程序云开开发(统计学生信息并导出excel)1.0版本
基于小程序云开开发(统计学生信息并导出excel)1.0版本
128 0
基于小程序云开开发(统计学生信息并导出excel)1.0版本
|
Web App开发 JavaScript 前端开发
javascript原生代码实现页面查找功能
javascript、原生、页面查找
1777 0