Wednesday, 31 October 2007

怎样转换VB.NET数据类型到COM类型

这次的project是在VB6中使用VB.NET的数据类型。在网上看到不少文章介绍怎样在VB.NET中生成一个COM类,参考:http://www.microsoft.com/china/msdn/library/langtool/vbnet/dnvs05VBBestPrac.mspx?mfr=true

但我的问题是,已经现有一个VB.NET类,必须使它能够被vb使用。找了些资料,发现COM类最主
要的特性就是接口和唯一性。

接口:就像所有其它类型或组件一样,一般都是public function之类的,这个不用再做修改。
唯一性:这个特别重要,因为微软上的每个COM组件都是要注册的,以保证每人有个唯一的注册号。依上面链接的指导,如果我们添加COM类,VB.NET会自动添加以下内容

“ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)_ ”
Public Class ComClass1

#Region "COM GUIDs"
' Ces GUID fournissent l'identité COM pour cette classe
' et ses interfaces COM. Si vous les modifiez, les clients
' existants ne pourront plus accéder à la classe.
Public Const ClassId As String = "896AD73D-332B-4F9F-84C0-3CCB36C9DB8C"
Public Const InterfaceId As String = "73EA9A94-5B49-4ED7-8E08-9774A8B0DE86"
Public Const EventsId As String = "C4771D07-6179-4894-A731-3672666AE092"
#End Region

' Une classe COM pouvant être créée doit avoir Public Sub New()
' sans paramètre, sinon, la classe ne sera pas
' inscrite dans le Registre COM et ne peut pas être créée
' via CreateObject.
Public Sub New()
MyBase.New()
End Sub

End Class


其实这些内容就是我们要添加到现有VB.NET类上的,例如此类名称是myClass
1.“ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId) _”添加到类型声明之前,并用“myClass”替换所有“Class1”,原因不用说了吧
2. “#Region "COM GUIDs"”添加到类型声明之后,不用做任何修改,等下告诉你们为什么
3. “Public Sub New() ”这个Constructor特别重要,因为每个COM组件都必须要由一个没有参数的New()来Instantiate。

添加好了,就万事大吉了吗?不,还要记得把之前生成的Class1从project里删除,否则就会存在两个类(myClass和Class1)有同样的ID,这也就是为什么我们不用对第二部分做任何修改,删除了Class1后,我们不就可以使用Class1的ID唯一性和可用性了吗?我是不是很聪明哈~~~

接下来就是重新regenerate project,然后在VB6里调用此COM组件啦! 对了,记得你的project要生成一个可供VB使用的DLL啊

PS:为了保证意思表达的准确性,一些不肯定的单词直接用英语了,希望大家谅解

Friday, 21 September 2007

excel的数据交换 (XML,html,MHT)

最近几天一直都在忙excel的export和import,说说看

这个项目的开发有几个前提,或者限制

1、我只讨论Microsoft Excel 2000以后的版本,因为之前的很多生成格式都不兼容。

2、不能是用MS Office的COM APIs,因为服务器端不能安装Office。

我们可以发现,如果用文本编辑器打开.xls格式的Excel文件,内容基本上是乱码,很难看懂。但是Excel给使用者提供了几种不同的保存格式:xls,xml,html,mht等等。 我们来讨论一下各种格式的优劣。

xls:不用说了,大家都知道,这是Microsoft的标准excel格式,它是用二进制编写,如果直接用记事本打开,会发现很难理解。但好像微软已经公布了此格式的标准,此链接就是个直接转化的例子
http://unruledboy.cnblogs.com/archive/2004/07/07/22093.aspx

xml:其实xml格式更准确说是一种数据存储形式,它的优势在于能够很容易的保存和读取数据,并且一小部分的结构改变不会影响到其他。但有时侯我们并不要求树状显示的数据形式,那么这个时候就需要用到xslt,也就是template的概念。可惜我不是美工的专家,xslt格式的编写简直比杀头还吓人。否则的话,对于简单的excel文件生成,xml格式真的很简单。但xml只有office 2003以后才支持,而且不支持excel中的图表,图片之类的。很显然嘛,xml并不方便添加二进制数据

html:大家如果稍微有点网页开发方面的知识,就会知道其实一个网页也是被分为各个小格,由行和列组成。这不是和excel文件很像吗?所以大家可以直接生成一个你想见到的html页面,然后加上一写MS Excel要求的attributes,就可以直接用excel打开,而且文件更小。

mht:这个其实就是网页内容集成格式,大家有过下载一个完整网页的经历吧,所有网页的内容都会被装到一个文件夹里,包括图片什么,虽然完整,但不方便,因为有很多小文件。而这个mht格式更进了一步,他将文件夹的各个文件全部用MIME附件的形式include到一个文件中。然后各个文件部分之间用一个separator来分开。但信息储存的主文件还是用html编写的。此格式也只有Office 2003支持

好了,简单的介绍完各个方法,我来主要介绍一下我用的MHT格式,一个理由:功能最强大。
一个完整的MHT格式的excel文件包括以下几部分:
1. 主文件。 其实就是Excel Classer,此文件说明整个Excel文档包括哪些Worksheets, 以及关于文档的信息,例如作者,创建日期。。。
2. 所有worksheets,相对应Excel文档的各页纸,用html语言编写。
3. 所有附件,这些文件都是用base64编码,然后作为一个普通文件包括在MHT上的。
4. filelist,这是一个xml文件,说明这个MHT文档中包含哪些文件,并且储存在哪些相对路径。
5. style.css, 很明显,此文件储存各个html文件的现实style,因为所有页面都使用这个css,所以特别优化文件大小,但不是必需的。
6. tabtrip,这个东西很好玩,也是一个html文件,大家猜猜是啥?就是Excel 文档左下的页面选项卡,哈哈。

有一点要注意,就是所有这些文件都是用quoted-printable编码,除了附件文件。这是MIME格式要求的。
此链接是很有用的一个小例子,但是其实例子中的文件并不完整。
http://www.cnblogs.com/birdshome/archive/2005/07/12/190988.html

说了这么多,其实最最简单的方法就是新建一个简单的Excel文件,然后直接保存为MHT格式,然后用文档打开看看它的内容,一切一目了然!

我的项目告一段落,Excel自动生成比较顺利,顾客们都很满意,也小小的表扬一下自己!

不多说了,继续上班,明天法国全国性罢工,希望运气好,能弄到一辆自行车。。。

Thursday, 12 July 2007

开张大吉

头篇Blog,开张大吉!!!