一套软件,应该是离不开报表的,以前一直是接触的是水晶报表、Grid Report报表等,这篇博客说一下Fast Report报表。
1、 初步了解:
引用Fast Report.dll
整体上,他的界面风格还是比较好看的,他的右边是数据源,通过访问数据库即可得到,可以对数据直接拖拽放在显示区域,很是方便,同时他还提供了强大的第三方类库,假如你觉得这个方法不好,可以对方法进行覆盖或者是重写。
具体的模板操作,详见链接:Fast Report操作手册
2 、比较常用的代码,如下:
<span style="font-family:FangSong_GB2312;font-size:24px;"> public class AutoPrintFastReport
{
private FastReport.Report freport;
private EnvironmentSettings ES;
private ORG.DataUtility.BLL.AutoPrintReport bll;
private string sysdescription = string.Empty;
private string report = string.Empty;
private string funcName=string.Empty;
private string styleid=string.Empty;
public void Dispose()
{
this.freport.Dispose();
this.freport.Clear();
this.ES.Dispose();
}
public AutoPrintFastReport()
{
Init();
}
/// <summary>
/// 初始化报表风格
/// </summary>
private void Init()
{
this.freport = new FastReport.Report();
this.bll = new BLL.AutoPrintReport();
//report
//风格
this.ES = new EnvironmentSettings();
//窗体logo
if (File.Exists(@"images/fr.png"))
{
Image image = Image.FromFile(@"images/fr.png");
this.ES.DesignerSettings.Icon = System.Drawing.Icon.FromHandle(((Bitmap)image).GetHicon());
this.ES.PreviewSettings.Icon = System.Drawing.Icon.FromHandle(((Bitmap)image).GetHicon());
}
//窗体title
this.ES.DesignerSettings.Text = "";
//界面风格
ES.UIStyle = FastReport.Utils.UIStyle.Office2007Blue;
//语言导入
FastReport.Utils.Res.LoadLocale(@"Chinese (Simplified).frl");
}
/// <summary>
/// 获取模版信息
/// </summary>
private void GetTempInf()
{
if (!string.IsNullOrEmpty(this.funcName)&& !string.IsNullOrEmpty(this.styleid))
{
DataSet ds = this.bll.GetReport(this.funcName,this.styleid);
if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
this.report = ds.Tables[0].Rows[0]["report"].ToString();
this.sysdescription = ds.Tables[0].Rows[0]["reportDesc"].ToString();
}
}
//设置模版名称
this.freport.FileName = this.sysdescription;
}
/// <summary>
/// 开启设计报表
/// </summary>
/// <param name="dt"></param>
/// <param name="name"></param>
/// <param name="TempID"></param>
public void Design(DataTable dt,string name,string funcName,string styleid)
{
//重做“保存”和“另存为”事件
this.ES.DesignerSettings.CustomSaveDialog += new OpenSaveDialogEventHandler(CustomSaveDialog_Handler);
this.ES.DesignerSettings.CustomSaveReport += new OpenSaveReportEventHandler(CustomSaveReport_Handler);
//禁用“新建”菜单
this.ES.DesignerSettings.Restrictions.DontCreateReport = true;
//禁用“打开”菜单
this.ES.DesignerSettings.Restrictions.DontLoadReport = true;
//禁用"最近打开的文档"列表
this.ES.DesignerSettings.Restrictions.DontShowRecentFiles = true;
// 注册报表数据
this.freport.RegisterData(dt, name);
//加载可用的数据源
this.freport.GetDataSource(name).Enabled = true;
//数据库对应的模版
this.funcName = funcName;
this.styleid = styleid;
this.sysdescription = name;
//设置模版数据
this.GetTempInf();
//report为空时不导入
if (!string.IsNullOrEmpty(this.report))
{
//导入模版数据
this.freport.LoadFromString(this.report);
}
this.freport.Design();
// 释放使用的资源
this.ES.DesignerSettings.CustomSaveDialog -= new OpenSaveDialogEventHandler(CustomSaveDialog_Handler);
this.ES.DesignerSettings.CustomSaveReport -= new OpenSaveReportEventHandler(CustomSaveReport_Handler);
this.freport.Dispose();
this.freport.Clear();
this.ES.Dispose();
}
/// <summary>
/// FastReport的“保存”功能重载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CustomSaveReport_Handler(object sender, OpenSaveReportEventArgs e)
{
try
{
this.report = e.Report.SaveToString();
bool ch = this.bll.UpdateReport(this.funcName, this.styleid, this.report);
if (ch)
{
MessageBox.Show(FRLang.MSG0004, AppMessage.MSG0000, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show(FRLang.MSG0005, AppMessage.MSG0000, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// FastReport的“另存为”功能重载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CustomSaveDialog_Handler(object sender, OpenSaveDialogEventArgs e)
{
if (MessageBox.Show(FRLang.MSG0003, AppMessage.MSG0000, MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
e.Cancel = false;
//e.FileName = @"saleProofdetail.frx";
}
else
{
e.Cancel = true;
}
}
/// <summary>
/// 打印报表
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="name">数据源别名</param>
/// <param name="TempID">模版ID</param>
public void Print(DataTable dt, string name, string funcName,string styleid)
{
//数据库对应的模版
this.funcName = funcName;
this.styleid = styleid;
//设置模版数据
this.GetTempInf();
//report为空时报错
if (!string.IsNullOrEmpty(this.report))
{
//导入模版数据
this.freport.LoadFromString(this.report);
}
//注册数据源
this.freport.RegisterData(dt, name);
//启用数据源
this.freport.GetDataSource(name).Enabled = true;
// 运行报表打印
this.freport.Print();
// 释放使用的资源
this.freport.Dispose();
this.freport.Clear();
}
/// <summary>
/// 预览报表
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="name">数据源别名</param>
/// <param name="TempID">模版ID</param>
public void Preview(DataTable dt, string name, string funcName, string styleid)
{
//数据库对应的模版
this.funcName = funcName;
this.styleid = styleid;
//设置模版数据
this.GetTempInf();
//report为空时报错
if (!string.IsNullOrEmpty(this.report))
{
//导入模版数据
this.freport.LoadFromString(this.report);
}
//注册数据源
this.freport.RegisterData(dt, name);
//启用数据源
this.freport.GetDataSource(name).Enabled = true;
// 运行报表预览
this.freport.Show();
// 释放使用的资源
this.freport.Dispose();
this.freport.Clear();
}
}</span>
假如遇到报表乱码的问题,应该是语言的原因,可以在代码中设置语言为中文,或者是在报表中设置为中文哦。
假如报表在保存后,里面的一些信息是我们想要的,或者是我们需要修改的。我们可以在报表保存的时候,截获他保存的信息,这样可以在上面加以改动,我是通过截取保存的XML文件来进行修改,变成自己想要的样子。