与Excel斗争的两天!!!

我们小组接手的项目是几个教育软件的开发。

三天前,领导给我安排新的任务了。

客户要求用Excel统计学生的学习时间,学习心得之类的。

领导问我做过吗?以前做过b/s的Response输出至Excel,我轻蔑(现在看见这两字,就想都想扁自己的臭脸)的答应了。

可后来这两天郁闷的我差点吐血。

Microsoft.Office.Interop.Excel;类来实现的

具体的实现代码,网上遍地都是。就不贴这些过时的代码了。

不过,我很讨厌用ado.net来操作Excel,真他娘的别手,格格不入。

切入重点...

首先,Excel表中可以分为多个的Sheet,客户要求:比如点击学习心得,就显示学习心得的Sheet,点击其他就显示相对应的Sheet

第一感觉是不是很简单?应该是小设置一个属性就over了吧。

Not,I'm让它愁死了。

根本就找不到这个属性,有一个Select()的方法,不管用。

我花了一天的时间尝试了各种的方法,晚上回家去阳台仰天长叹,苍天啊,赐个女人提提神吧。咳咳... Sorry 吹过了

不过确实伤死了不少脑细胞,(闭嘴)

第二天 同事无意的一个字让我茅坑(se)顿开,(还敢)

没错,我用的方法就是宏,Excel里面工具-》宏

创建宏 在模块*的编辑器中键入:

Sub StudyFind()
    Sheets("学习心得").Select
End Sub

在创建一个

Sub StudyTime()
    Sheets("学习时间").Select
End Sub

 建立完毕了,来看在C#中的调用。

 

Code


 成功了,打开Excel文件的时候会默认显示在指定的Sheet上面,

但是Excel会有一个提示,提示你...?自己不尝试说再多也白费。

 

其次,比如修改Excel的操作,修改前Excel是打开状态的,修改后应该关闭掉。问题来了:

  office的这个Excel组件提供了一个Quit()方法来关闭Excel,但是你在打开进程查看的时候这个进程依然在这里,

    Google去,找到如下代码。

 

Code

 

这个代码很好的解决了这个问题,进程以标识准确的关闭了。

代码不是我写的,但我把这段代码搬到博客是有道理的,

代码第6行excel.Hwnd 这个属性我一直找不到,百度 google搜遍了 也没解决。

有一刹那我怒发冲冠三千尺,一度想把电脑砸掉,幸好祖宗在天有灵,大叫stop,这可给我醍醐灌顶了,电脑是公司的,砸了要赔钱+走人的。 跑题了...

问题出在

Microsoft.Office.Interop.Excel;

Interop.Excel;

这两个组件的Excel类非常的类似,但是有区别。

比如:Microsoft.Office.Interop.Excel 组件有hwnd属性,取得Excel用的是Range.Text

而Interop.Excel就没有hwnd属性了,取Excel用的是Range.Value

本来我以为用的是Microsoft.Office.Interop.Excel组件的,后来才看出来原来的时候我添加了Interop.Excel;

引用Microsoft.Office.Interop.Excel组件,问题解决。

总算写完了,本来昨天就用Word 写了的,马上就要写完的时候,突然office给我关闭了,在打开一看全部成了乱码,(office2003)

唉,没法形容那股气。只是默默把开发Word 2003的微软团队集体问候了一遍。 

 

 ps:说的这点东西都是自己摸索的,如有错误或者更好的解决方案。请各位务必纠正。

QQ:549306388(如有看不明白的找我要代码)

 

posted on 2009-11-02 16:53 红鹰 阅读(4781) 评论(60) 编辑 收藏