我在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位程序运行即可

...Service 调用office组件打开excel的时候不报错,也打不开;
1)(不推荐)在 Windows 服务管理器里面,勾选“允许服务与桌面交互”(开始 -> 运行 -> 输入 services.msc 即可打开服务管理)。2)通过编程解决(切换当前进程的工作站和桌面),需要用到 Win32 API 接口,步骤:1.用 OpenWindowStation 函数打开 winsta0 工作站 2.用 SetProcessWindowStation 函数...

打开excel时提示安装office组件,打开word就提示宏
点击 更改;在弹出的窗口中选择 添加或删除功能 点击 下一步;在自定义安装界面将 excel 前面的勾取消勾选,点击 更新;更新完成后,请点击 开始-运行-regedit 点击 确定 进入注册表,并删除注册表中的如下项:HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\11.0\\excel HKEY_CURRENT_USER\\Softw...

为什么我的excel2003打开的时候提示安装excel组件?
如果你使用excel的windows帐户与安装excel时的windows帐户不一致,首次使用时会出现这种情况,安装以下即可。有时是程序文件损坏,也会出现。弹出一个对话框提示无法访问你试图使用的功能所在的网络位置时,在下面框中通过下拉框中的树形目录选择 office 2003的安装盘位置。如果你的安装盘是正版的,直接选中光...

每次双击打开excel,都会出现windows正在配制office2003及正在收集所需...
修复安装OFFICE,但是,这通常是由于某些病毒干扰造成的,这是经常的,因为某些病毒都是通过EXCEL等运行一些特殊的VB代码,所以,你首先要确定的是你的系统中有没有病毒,然后修复你的OFFICE。

刚安装的office2003,但是打开EXCEL显示不是有效的WIN32应用程序。_百度...
电脑中了Win32病毒,查杀病毒,在远行那里输入MSCONFIG进入,把服务全部停用,在删除OFFICE重新安装一次或者直接重装系统.

Microsoft Office Excel 2003打开XLS工作表提示不是有效的win32程序
打开Microsoft Office Excel 2003,点帮助,选择检测并修复,在两个选项同进勾上,再按开始,待计算机检测完后,即用Microsoft Office Excel 2003

我的Office2003无法打开Excel,word文档,总提示‘无法打开文件,因为病毒...
你重装Office时用的是原来的那个程序文件吗?如果是这样从网上重新下载吧,因为原有的程序文件可能损坏,(安装时看起来正常运行但是实际不是)这样也不行装一下Office2007看看 这也不行要么那个文件被病毒破坏了另一种可能系统漏洞下载一些杀毒软件如:金山安全卫士挺不错可以有效地弥补漏洞。

打开EXCEL2003时一直出现“某个对象程序库(stdole32.tlb)丢失或损坏,请...
1、首先打开电脑桌面左下角的Windows图标按钮,在出现的菜单栏中打开“运行”。2、之后在出现的运行窗口中,点击打开后面的输入框,键入msconfig,按下“enter”回车键。3、之后在出现的界面中,打开后面的“工具”设置页面。4、然后在里面找到“UAC设置”(User Account Control : 用户账户控制),接着...

每次打开office 2003时一直提示正在安装microsoft excel
1、首先打开电脑桌面,在键盘上同时按下“Windows+R”组合键调出运行。2、运行的窗口中输入“regedit”命令之后弹出注册表编辑器。3、注册表编辑器界面中,我们依次展开“HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\14.0\\Word\\Options”。4、然后需要新建一个”NoRereg”的项。5、鼠标右键点击弹出菜单,...

...时就出现“Microsoft Office Excel已停止工作”。
1、右击桌面上“我的电脑”→属性→高级→错误报告→错误汇报→勾选“禁用错误汇报”→“但在发生严重错误时通知我”复选框→确定。这样处理对于一些小错误,Windows XP就不会弹出错误提示了。 2、如果不行彻底关闭错误报告服务。开始→运行中输入→services.msc→打开“服务”窗口→找到“Error Reporting Service”→...

相似回答