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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在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# 代码,请先结此贴后另开一贴,我帮你改一下。

参考技术A 2003 是64的吗
我用2008 64位出现过类似问题,将iis的应用程序池中的高级设置中,允许32位程序运行即可

无法在 Windows Server 2012 R2 上安装 phpmyadmin

【中文标题】无法在 Windows Server 2012 R2 上安装 phpmyadmin【英文标题】:Unable to install phpmyadmin on Windows Server 2012 R2 【发布时间】:2016-08-01 04:03:21 【问题描述】:

我正在开发一个使用 PHP 和谷歌图表的数据可视化门户网站。 我在 windows server 2012 r2 上安装了 ApachePhpMysql,但无法安装 phpmyadmin

我已将 PHPMyAdmin 文件夹放入我的根目录并在我的浏览器中提供此网址:localhost/PHPMyAdmin

我收到以下错误:

Fatal error: Uncaught Error: Call to undefined function __() in C:\Apache\htdocs\phpMyAdmin\libraries\sanitizing.lib.php:135 

Stack trace: 
#0 C:\Apache\htdocs\phpMyAdmin\libraries\Message.php(586): PMA_sanitize('session_start()...', false, true) 
#1 C:\Apache\htdocs\phpMyAdmin\libraries\Message.php(650): PMA\libraries\Message::decodeBB('session_start()...') 
#2 C:\Apache\htdocs\phpMyAdmin\libraries\Error.php(167): PMA\libraries\Message->getMessage() 
#3 C:\Apache\htdocs\phpMyAdmin\libraries\ErrorHandler.php(157): PMA\libraries\Error->getHash() 
#4 C:\Apache\htdocs\phpMyAdmin\libraries\ErrorHandler.php(121): PMA\libraries\ErrorHandler->addError('session_start()...', 2, 'C:\\Apache\\htdoc...', 83, true) 
#5 [internal function]: PMA\libraries\ErrorHandler->handleError(2, 'session_start()...', 'C:\\Apache\\htdoc...', 83, Array) 
#6 C:\Apache\htdocs\phpMyAdmin\libraries\session.inc.php(83): session_start() 
#7 C:\Apache\htdocs\phpMyAdmin\libraries\common.inc.php(266): require('C:\\Apache\\htdoc...') 
#8 C:\Apache\htdocs\phpMyAdmin\inde in C:\Apache\htdocs\phpMyAdmin\libraries\sanitizing.lib.php on line 135

【问题讨论】:

请编辑您的问题,目前只是一堵巨大的文字墙,让我想立即离开...... ***.com/questions/36237930/… 您有什么想问的吗? 【参考方案1】:

检查您的会话目录是否可被 Web 服务器进程写入。

最好的方法是创建自己的 Phpinfo 文件;在任何网络可访问的文件夹中创建一个包含以下内容的文件(您可以将其命名为 test.php 或 phpinfo.php 或任何您喜欢的名称):

<?php
phpinfo();
?>

在浏览器中打开该文件(http://localhost/test.php 或类似文件)并查找行 session.save_path。那是您的会话文件夹;确保权限合适,看看是否有帮助。

就像在 Windows 上右键单击提到的文件夹并查看可以更改权限的属性。

【讨论】:

以上是关于我在Server2003中 开发的 Windows Service 调用office组件打开excel的时候不报错,也打不开;的主要内容,如果未能解决你的问题,请参考以下文章

在windows server 2003虚拟机中怎么安装IIS

什么是Windows Server 2003 R2是什么版本?

我在主机上安装了一个虚拟主机Windows server 2003,主机网络连接正常,但虚拟主机上连接不上?

Windows Server 2003 standart edition SP2 上安装SQL Server 2008 开发版 英文版 教程

LogonUser 和其他人在 Windows Server 2003 x86 中返回错误 1337

windows xp,7,10,server 2003/2008下安装oracle 10g