1、水晶报表的好处
1)利用水晶报表可以进行数值求平均值,画图等
2)利用水晶报表可以把文件导出不同的格式(word等)
2、水晶报表的两种格式
1)pull模式,不利用DataSet,直接从数据库中取出数据
2) push模式,使用DataSet,利用它进行数据的加载和处理等
3. 水晶报表使用的库
1)水晶报表的引擎(CREnging.dll),作用:合并数据,装换格式
2)水晶报表设计器(CRDesigner.dll),作用:设计标题,插入数据等
3)水晶报表查看控件(CRWebFormViewer.DLL)
4)需要引入的命名空间
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
4、Pull模式下使用水晶报表
1)创建rpt文件
2)拖放CrystalReportViewer
3)绑定
5、读取水晶报表文件
private void ReadCRV(cryatalReportViewer crv)
{
openFileDialog dlg=new OpenFileDialog();
dlg.Title="打开水晶报表文件";
dlg.Filter="水晶报表文件(*.rpt)|*.rpt|所有文件|*.*";
if(dlg.showDialog()==DialogResult.OK)
{
crv.ReportSource=dlg.FileName;
}
}
6. B/S下读取报表的文件
private void ReadCRV(cryatalReportViewer crv,File file)
{
string strName=file.PostedFile.FileName;
if(strName.Trim()!="")
{
crv.ReportSource=strName
Session["fileName"]=strName;
}
}
在B/S中要防止数据源的丢失
priavte void Page_Load(object sender,System.EventArgs e)
{
if(Session["fileName"]!=null)
{
crv.ReportSource=Session["fileName"].ToString();
}
}
7. 假如直接从数据库中读取数据,采用PULL模式可能出现错误(登录的用户名和密码不对)
private void ReadCRV(CrystalReportViewer crv,CrystalReport cr)
{
ReportDocument reportDoc=new ReportDocument();
reportDoc.Load(Server.MapPath(cr));//要加载的rpt文件的名字
//解决登录的问题
TableLogOnInfo logonInfo = new TableLogOnInfo();
foreach(Table tb in ReportDoc.Database.Tables)
{
logonInfo=tb.LogOnInfo;
logonInfo.ConnectionInfo.ServerName="(loacl)";
logonInfo.ConnectionInfo.DatabaseName="Pubs";
logonInfo.ConnectionInfo.UserId="sa";
logonInfo.ConnectionInfo.Password="";
tb.ApplyLogOnInfo(logonInfo);
}
crv.ReportSource=reportDoc;
}
8. 采用Push模式,直接在数据源读取
private void BindReport(CrystalReportViewer crv)
{
string strProvider="Server=(local);DataBase=pubs;uid=sa;pwd=";
CrystalReport cr=new CrystalReport();
DataSet ds=new DataSet();
SqlConnection conn=new SqlConnection(strProvider);
conn.open();
string strSql="select * from jobs";
SqlDataAdapter dap=new SqlDataAdapter(strSql,conn);
adp.Fill(ds,"jobs");
cr.SetDataSource(ds);
crv.ReportSource=cr;
}
9. 导出水晶报表的文件
private void ExportCrv(CrystalReport cr)
{
DiskFileDestionOptions dOpt=new DiskFileDestionOptions();
cr.ExportOptions.ExportDestinationType=ExportDestinationType.DiskFile();
cr.ExportOptions.ExportFormatType= ExportFormatType.PortableDocFormat;
dOpt.DiskFileName="C:/output.pdf";
cr.ExportOptions.DestinationOptions=dOpt;
cr.Export();
}
private void ExportCrv(CrystalReport cr,string strType,string strPath)
{
DiskFileDestionOptions dOpt=new DiskFileDestionOptions();
cr.ExportOptions.ExportDestinationType=ExportDestinationType.DiskFile();
switch(strType)
{
case "RTF":
cr.ExportOptions.ExportFormatType=ExportFormatType.RichText;
dOpt.DiskFileName=strPath;
break;
case "PDF":
cr.ExportOptions.ExportFormatType=ExportFormatType.PortableDocFormat;
dOpt.DiskFileName=strPath;
break;
case "DOC":
cr.ExportOptions.ExportFormatType=ExportFormatType.WordForWindows;
dOpt.DiskFileName=strPath;
break;
case "XLS":
cr.ExportOptions.ExportFormatType=ExportFormatType.Excel;
dOpt.DiskFileName=strPath;
break;
default;
break;
}
cr.ExportOptions.DestinationOptions=dOpt;
cr.Export();
}
10 B/S下水晶报表的打印
priavte void PrintCRV(CrystalReport cr)
{
string strPrinterName=@"printName";
PageMargins margins=cr.PrintOptions.PageMargins;
margins.bottomMargin = 250;
margins.leftMargin = 350;
margins.rightMargin = 350;
margins.topMargin = 450;
cr.PrintOptions.ApplyPageMargins(margins);
cr.PrintOptions.printerName=strPrinterName;
cr.PrintToPrinter(1,false,0,0)//参数设置为0,表示打印所用页
}