在.NET中利用FORMULA ONE实现动态报表技术

  • 格式:pdf
  • 大小:119.47 KB
  • 文档页数:12

二、界面设计1.选择工具箱àWindow窗体控件à添加/移除项…àCOM组件,选择Tidestone Formula One6.0 WorkBook2.新建一窗体,把新增加进入工具箱的F1控件,和一些相关的控件加入窗体,界面设计如下图所示:三、系统设计及编码1.一打开模块,模块窗体组合框中检索出所有的数据库中的模板。

在TemplateManger类构造函数中加入comboTemplateFillValue()函数,用来向组合框中填充数据//向组合框中加入已经保存的模板名private void comboTemplateFillValue(){string strQuery="Select rpt_id,rpt_name from report_list_data";SqlDataReader aReader=db.Query(strQuery); while(aReader.Read()){comboTemplate.Items.Add(aReader[1].ToString()+"["+aReader[0].ToString()+"]");}aReader.Close();}注:其中db.Query()为自定义的数据库操作基类中一查询方法。

2.F1控件能完全兼容Excel格式文档,我们可以把模板利用大家都熟悉的Excel来定义模板,然后读入F1控件。

在“读入模板”按键可加入如下脚本.private void btnRead_Click(object sender,System.EventArgs e){if(openFileDialog1.ShowDialog()==DialogResult.OK){ &nbs p;string tplName=openFileDialog1.FileName.ToString();tplName=tplName.Remove(0,stIndexOf("\\")+1);tplName=tplName.Substring(0,tplName.Length-4);//去掉扩展名//MessageBox.Show(FileName);comboTemplate.Text="模板"+tplName+"["+GetPKID("report_list_data","rpt_id").ToString()+"]";//读EXCEL FilesaxF1Book1.ReadEx(openFileDialog1.FileName.ToString());axF1Book1.ShowEditBar=true;ShowVScrollBar();btnDel.Enabled=false; }}注:1.读入的模板名命名方式为“模板”+“模板名称”+“[模板ID]”形式2.主要语句为axF1Book1.ReadEx(openFileDialog1.FileName.ToString());功能是读取模板文件进入F1控件。

3.脚本中GetPKID()函数的作用是取得模板唯一ID值,ShowVScrollBar();主要是保存F1控件滑动条一直存在3.读入的模块可以在控件中直接修改,也可以调用F1的服务端程序进行修改,调用服务端程序很简单.private void btnServer_Click(object sender,System.EventArgs e){axF1Book1.AllowDesigner=true;unchDesigner();}4.读入的模板用二进制流的形式存入数据库中,F1提供一个WriteToBlobEx(),和WriteToBlob()方法,帮助文档中定义的语法为:phBlob=F1Book1.WriteToBlobEx(nReservedBytes)本来可以很轻松的把模板文件写入二进制流,但转换了.NET可调用的组件后定义的语法成了:public virtual new System.Int32WriteToBlobEx(System.Int16nReservedBytes)phBlob类型成了System.Int32类型!因此我们只能转用另外的方法。

首先把当前模板保存也一临时文件//把当前模板保存到临时文件axF1Book1.WriteEx("F1Temp.VTS",TTF160.F1FileTypeConstants.F1FileFormulaOne6);再利用.NET函数转换成二进制流,之后再删除临时文件.//取得临时文件二进制流byte[]Data=FileToByte("F1Temp.VTS");//删除临时文件File.Delete("F1Temp.VTS");//文件-->Byte[]private byte[]FileToByte(string FileName){byte[]FileData;try{using(FileStream fs=File.OpenRead(FileName)){FileData=new byte[fs.Length];fs.Read(FileData,0,(int)fs.Length);}}catch(Exception e){MessageBox.Show("把文件生成二进制流错误!原因:"+e.Message);return null;}return FileData;}取得二进制流后,判断数据库中是不是已经有此模板,如果已经有此模板则对其进行更新,否则进行新增操作。

新增操作代码如下:#region插入当前模板到数据库strSQL="Insert Into Report_List_Data(num,rpt_id,rpt_name,user_name,rpt_date,rpt_data)";strSQL+=" Values(@PKID,@rptID,@rptName,@rptUserName,GetDate(),@rptData)";SqlCommand command=new SqlCommand(strSQL,funcLib.aConn); //插入参数SqlParameter paramPKID=new SqlParameter("@PKID",SqlDbType.Int);paramPKID.Value=GetPKID("Report_List_Data","num"); command.Parameters.Add(paramPKID);SqlParameter paramRptID=new SqlParameter("@rptID",SqlDbType.Int);paramRptID.Value=tplInfo[1];command.Parameters.Add(paramRptID);SqlParameter paramRptName=new SqlParameter("@rptName",SqlDbType.NVarChar);paramRptName.Value=tplInfo[0];command.Parameters.Add(paramRptName); SqlParameter paramRptUserName=new SqlParameter("@rptUserName",SqlDbType.NVarChar);paramRptUserName.Value="HY";command.Parameters.Add(paramRptUserName);SqlParameter paramRptData=new SqlParameter("@rptData",SqlDbType.Image);paramRptData.Value=Data;command.Parameters.Add(paramRptData); &nb sp;if(funcLib.aConn.State!=ConnectionState.Open) funcLib.aConn.Open();command.ExecuteNonQuery();}catch(Exception err){MessageBox.Show("插入当前模板不成功!原因:"+err.Message);return;}#endregion对模板进行更新操作代码如下所示:#region把修改后的模板保存到数据库try{strSQL="Update Report_List_Data Set rpt_data=@rptData where rpt_id="+tplInfo[1]+"and rpt_name='"+tplInfo[0]+"'";SqlCommand command=new SqlCommand(strSQL,funcLib.aConn);//插入参数SqlParameter paramRptData=new SqlParameter("@rptData",SqlDbType.Image);paramRptData.Value=Data;command.Parameters.Add(paramRptData);if(funcLib.aConn.State!=ConnectionState.Open)funcLib.aConn.Open();command.ExecuteNonQuery();break;}catch(Exception err){ MessageBox.Show("保存当前模板不成功!原因:"+err.Message,"错误");return;}#endregion注:其中funcLib为对数据库操作的基类funcLib.aConn为取得当前连接的实例,GetPKID("Report_List_Data","num")函数功能是取得指定表名和其主键字段名的最大主键值。