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

类别:.NET开发 点击:0 评论:0 推荐:

Ø         .NET中利用FORMULA ONE实现动态报表技术()

 

         相信对大家Formula One (简称F1) 不会太陌生,它是一个优秀第三方报表制作控件,本人以前一直使用它与PB结合制作动态报表。现在有一.NET项目,有大量报表要实现,那么利用原先的FORMULA ONE制作的报表技术能否在.NET中继续延用呢? 经过几天的摸索终于把原来利用Formula One的动态报表解决方案完全的移植到.NET中。

         .NET调用COM组件基本原理

         在微软.NET通用语言运行时(CLR)中运行的代码称为托管代码,不在CLR中动行的代码被称为非托管代码。可以说所有的COM组件都是非托管代码。而托管代码组件不只依赖CLR,它们还要求与之交互的组件也要依赖于CLR。微软的解决方案是RCW(运行时可调用封装器)----用于从托管代码调用非托管代码的特殊类型的代理。下图显示了如果利用RCWs调用非托管组件。此图包括一个名为NetUI.exe.NET程序,两个名为BackEnd.dll Service.dllCOM组件,以及链接它们的必要技术。

利用TLBIMP转换元数据

         并不是.NET首先使用元数据描述公有接口。COM类型库也有描述COM组件公用接口的元数据。其实RCW的功能主要是将COM类型的元数据转换为.NET的元数据。.NET FrameWork 软件开发工具包中有一工具tlbimp(类型库导入器)用来进行此转换。TlbImpCOM类型库中读取元数据并创建与CLR匹配部件以调用COM组件。

也可以利用VS.NET工具以便直接引用COM组件(其实仍然是利用RCW),下面例程使用此方法。

 

报表模板管理模块实例分析

下面以一个具体的报表模板管理模块为实例,说明怎么在.NET中利用Formula One 技术。

         说明:每一张定义的报表有一张对应的模板,模板可在外部利用Excel定义。模板管理是对报表对应的模板增、删、改进行管理的模块。

一、准备工作

1.   确认安装了VS.NET2002VS.NET2003

2.   安装或注册了F1

3.   安装了SQLSERVER并建Report_List_Data表,表结构如下:

CREATE REPORT_LIST_DATA

(

    NUM              INT                    NOT  NULL    , --主键

    RPT_ID      INT                 NOT  NULL    , --报表表号ID

    RPT_NAME    VARCHAR(60)         NOT  NULL    , --报表名

    RPT_DATA    IMAGE               NULL         , --报表内容

    USER_NAME   VARCHAR(40)         NULL         , --制表人

    RPT_DATE    DATETIME            NULL         , --报表日期

    CONSTRAINT T_RPT_LIB_PK PRIMARY KEY (NUM)

);

          二、界面设计

1.        选择工具箱àWindow窗体控件à添加/移除项àCOM组件,选择Tidestone Formula One 6.0 WorkBook

2.        新建一窗体,把新增加进入工具箱的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)

              {

                   string tplName = openFileDialog1.FileName.ToString();

                  tplName = tplName.Remove(0,tplName.LastIndexOf("\\")+1);

                   tplName = tplName.Substring(0,tplName.Length - 4);//去掉扩展名

                   //MessageBox.Show(FileName);

                   comboTemplate.Text = "模板"+tplName+"["+GetPKID("report_list_data","rpt_id").ToString()+"]";

                   //EXCEL Files

                   axF1Book1.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;

              axF1Book1.LaunchDesigner();

     }

 

 

本文地址:http://com.8s8s.com/it/it45186.htm