商务合作:179001057@qq.com

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

技术2022-05-11  1


某平台价值19860元的编程课程资料免费领取【点我领取】


<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

Ø         .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组件,以及链接它们的必要技术。

FORMULAs> FORMULAs>

利用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()函数,用来向组合框中填充数据

ONE" align=left>//向组合框中加入已经保存的模板名

ONE" align=left>         private void comboTemplateFillValue()

ONE" align=left>         {

ONE" align=left>              string strQuery = "Select rpt_id,rpt_name from report_list_data";

ONE" align=left>              SqlDataReader aReader = db.Query(strQuery);

ONE" align=left>              while(aReader.Read())

ONE" align=left>              {

ONE" align=left>                   comboTemplate.Items.Add(aReader[1].ToString()+"["+aReader[0].ToString()+"]");

ONE" align=left>              }

ONE" align=left>              aReader.Close();

         }

注:其中db.Query()为自定义的数据库操作基类中一查询方法。

2.      F1控件能完全兼容Excel格式文档,我们可以把模板利用大家都熟悉的Excel来定义模板,然后读入F1控件。在“读入模板”按键可加入如下脚本.

ONE" align=left>         private void btnRead_Click(object sender, System.EventArgs e)

ONE" align=left>         {

ONE" align=left>              if(openFileDialog1.ShowDialog() == DialogResult.OK)

ONE" align=left>              {

ONE" align=left>                   string tplName = openFileDialog1.FileName.ToString();

ONE" align=left>                  tplName = tplName.Remove(0,tplName.LastIndexOf("/")+1);

ONE" align=left>                   tplName = tplName.Substring(0,tplName.Length - 4);//去掉扩展名

ONE" align=left>                   //MessageBox.Show(FileName);

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

ONE" align=left>                   //EXCEL Files

ONE" align=left>                   axF1Book1.ReadEx(openFileDialog1.FileName.ToString());

ONE" align=left>  

ONE" align=left>                   axF1Book1.ShowEditBar = true;

ONE" align=left>                   ShowVScrollBar();

ONE" align=left>                  

ONE" align=left>                   btnDel.Enabled = false;

ONE" align=left>              }

         }

注:1.读入的模板名命名方式为“模板”+“模板名称”+“[模板ID]”形式

2. 主要语句为axF1Book1.ReadEx(openFileDialog1.FileName.ToString());功能是读取模板文件进入F1控件。

3. 脚本中GetPKID()函数的作用是取得模板唯一ID值,ShowVScrollBar();主要是保存F1控件滑动条一直存在

 

3. 读入的模块可以在控件中直接修改,也可以调用F1的服务端程序进行修改,调用服务端程序很简单.

ONE" align=left>         private void btnServer_Click(object sender, System.EventArgs e)

ONE" align=left>         {

ONE" align=left>              axF1Book1.AllowDesigner = true;

ONE" align=left>              axF1Book1.LaunchDesigner();

     }

 

 

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

最新回复(0)