Miles' Blog

Welcome 2 My Planet

Available categories: [/] [working on downwap.] [trouble shooting] [working on Yup Mailman]

Office版本差异导致的.net调用Excel的问题 [Permalink]

Tue Mar 01 11:33:32 CST 2005

为了处理excel文件的数据导入,我使用了Excel.Application这个对象。在我的OfficeXp环境下,打开workbook的做法是这样的:

oWB=oXL.Workbooks.Open(XlsFile.FullName, missing, 
      missing, missing, missing, missing, 
      missing, missing, missing, missing, 
      missing, missing, missing, missing, 
      missing);
可是到了客户的Office2000环境下,竟然出了这个不知所云的错误:

****** [ERROR] ******
msg: 未将对象引用设置到对象的实例。
loc: at Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad) at PriceComparator_Console.Form1.parseFile()
********************


每个实例都货真价实,怎么会有空指针错误呢?经过n小时调试(装VMware和win2kp/office2k用n-1小时 /images/emoticons/cry.gif ),多方查找资料才知道原来是因为两个版本的COM对象的Open方法参数列表不一样!新版另外提供了一个_Open的方法,参数列表和旧版Open一样,以保证兼容性。所以代码变成这样:
oWB=oXL.Workbooks._Open(XlsFile.FullName, missing, 
      missing, missing, missing, missing, 
      missing, missing, missing, missing, 
      missing, missing, missing);
就太平了。另外SaveAs时候office2003和officexp/2000也不一样。同理提供了_SaveAs。

用OleViewer查了COM接口,新的Open加入了
[in, optional] VARIANT Local, 
[in, optional] VARIANT CorruptLoad, 
这样两个参数。应该是新版office提供的功能。不过长此以往,不得______Open了么?反正现在Wookbooks接口的OpenText已经到了__OpenText。。COM不熟,不知道这是不是规范使然。


问题解决了,不过确是挺郁闷。为什么要NullRefException而不是InvalidOperationException呢?但愿是因为.net和COMinterop的关系,所以产生一个正确的异常起来不像想象的那么容易。否则就真的是RPWT了。

Posted by: miles

Comments on this entry





Author (*):
Verify Code (*):8 9 7 9
E-mail:
URL:
Comment (*):
Remember me?

Available categories: [/] [working on downwap.] [trouble shooting] [working on Yup Mailman]

Powered By blojsom   RSS Feed  RSS2 Feed  RDF Feed