我在Server2003中 开发的 Windows Service 调用office组件打开excel的时候不报错,也打不开;

当我打开任务管理器的时候,看到在后台启动了很的EXCEL.EXE进程,这个应该是我的Windows Service 启动的;这是怎么回事?请问怎么用Windows Service 怎么打开excel呢?或者在Service 用OLEDB打开也行,但是打开0ffice2007创建的文档为什么老出现“外部表不是预期的格式”错误?我已经使用的Microsoft.ACE.OLEDB.12.0驱动

问题描述不清楚,我很难准确回答你。

你是调用 Excel Application 打开 *.xls 文件或创建 Excel 表格吗?

还是将 Excel 电子表格当数据库用?

问题一:

默认情况下 Win32 服务进程并非运行在用户桌面(Windows 至少不止一个桌面,我们看到的界面通常是用户默认桌面),所以我们看不到 Win32 服务进程的界面,解决方法:

1)(不推荐)在 Windows 服务管理器里面,勾选“允许服务与桌面交互”(开始 -> 运行 -> 输入 services.msc 即可打开服务管理)。

2)通过编程解决(切换当前进程的工作站和桌面),需要用到 Win32 API 接口,步骤:

    1.用 OpenWindowStation 函数打开 winsta0 工作站

    2.用 SetProcessWindowStation 函数将进程(服务进程)切换到 OpenWindowStation 函数打开的工作站

    2.用 OpenDesktop 函数打开 default 桌面(用户当前桌面)

    4.用 SetThreadDesktop 设置线程(你服务的主线程)的桌面为 OpenDesktop 所打开的桌面

完成上述 4 步,即可在服务进程中显示窗口了。以上函数均为 Win32 API 在 C# 中使用,需要先申明的,具体请自己在百度搜索。

这是是 VC++ 的参考例子:http://www.vckbase.com/document/viewdoc/?id=283

如果仍然不懂,可以发消息请教我。

问题二:

用 ADO.NET 或 ADO 都可以连接 Excel 电子表格,连接字符串请上网搜一下。

追问

我就是想用Windows Service在后台打开一下office,不需要界面的,只是做一个判断,判断他是不是office文件,如果是office文件有没有加密码;如果这个excel加有密码就程序就打不开,因此会抛出一个异常;我是用C#开发,引用的Microsoft.Office.Interop.Excel ,打不开excel,也不报错;后来我就想用OLEDE以连接数据库的方式打开他,但是当打开office2007创建的文档时,老提示“外部表不是预期的格式”

追答

你有没有使用更新的 .NET 版本的 ADO.NET 试一下?

另外判断是否 Excel 文件,我觉得可以直接用 System.IO.FileStream 文件流直接读取二进制数据进行判断,不过需要了解 Excel 的文件格式(二进制格式),8过这方面资料还是是很多的。
下面是文件流直接读 Excel 的示例(还是 VC++ 例子,呵呵):
http://www.vckbase.com/document/viewdoc/?id=815

Microsoft Excel File Format(Excel 文件格式):
http://download.csdn.net/detail/hq628/854437 (下载需要有 CSDN 账号,并且需要积分)

追问

您好,关于在Windows服务中打开EXCEL的问题已经用OLEDB方法解决了,但是如果要打开word,或者PPT有什么办法吗?谢谢

追答

参见我第一次回答。

为什么窗口不可见?
答:默认情况下,服务运行在一个特殊桌面环境,运行在该桌面中,任何显示元素均不可见。
你用 Win32 服务打开 Word 实际上就是,服务创建了 Word 子进程,该 Word 进程的从 Win32 服务进程中继承了相同的“特殊桌面”环境,因此 Word 也不可见。

方法一:
为 Win32 服务指定合适的工作站和桌面(即:Winsta0 工作站的 default 桌面),然后在创建 Word 进程。

方法二:
Win32 服务调用 Win32 API 的 CreateProcess 函数创建 Word 进程,在调用 CreateProcess 函数之前要打开 Winsta0 工作站和 default 桌面,然后在调用 CreateProcess 传递桌面句柄。
参考(VC++)的:http://blog.csdn.net/phoebeyufish/article/details/1560785
至于:.NET 框架类库的 System.Diagnostics.Process 类是否可以实现上述效果,本人不知道,好像不能。

如果你不会将 VC++ 代码改成 C# 代码,请先结此贴后另开一贴,我帮你改一下。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-03
2003 是64的吗
我用2008 64位出现过类似问题,将iis的应用程序池中的高级设置中,允许32位程序运行即可
相似回答