大家好,这个问题不能太复杂。请提供一个解决方案,至少找出问题的最终根本原因。
我目前正在编写一个应用程序,它通过 COM 控制 Excel:该应用程序创建一个基于 COM 的 Excel 实例,打开一些 XLS 文件并读取它们的内容。
情景一
在 Windows 7 上,我使用具有系统管理员权限的 xmapp-control 启动 Apache 和 mySQL。一切都按预期工作。基于 PHP 的控制器脚本按预期与 Excel 交互。
场景二
如果我将 Apache 和 mySQL 作为"后台作业"启动,则会出现问题。方法如下:
-
我使用 Windows 7 Task Planner 创建了两个作业。一个运行 apache_start.bat,另一个运行 mysql_start.bat。
-
当 Windows 7 启动时,这两个任务都以具有提升权限的 SYSTEM 身份运行。
Apache 和 mySQL 按预期工作。具体来说,Apache 服务于来自客户端的 HTTP 请求,而 PHP 能够与 mySQL 对话。
当我调用使用 COM 调用 Excel 并与 Excel 交互的 PHP 控制器时,我确实收到了一个错误。
错误消息来自 Excel [不是 COM 本身],内容如下:
-
Excel 无法读取指定的 Excel 文件
-
由于工作表名称错误,Excel 无法保存文件
有趣的是,在第一次运行基于 PHP 的控制器脚本时,需要几秒钟来呈现错误消息。每次后续运行都会立即呈现错误消息。
Windows 系统日志未显示单个问题报告条目。
请注意,PHP 程序和 Apache 实例没有改变 - 除了 Apache 的启动方式。
至少 PHP 控制器脚本完全能够读取文件系统,因为它通过某个目录的 scandir() 提供了 XLS 文件的路径。
并发问题不可能是问题的原因。特定 PHP 控制器的单个实例与 Excel 交互。
问题
谁能提供详细信息,为什么会这样?或者提供隔离问题最终原因的方法(例如,通过 PowerShell 2 脚本)?
UPDATE-1 :: 2011-11-29
按照建议,我将 Task Planner 作业从 SYSTEM 切换到常规用户。作品。 Apache 和 MySQL 启动并处理请求。
不幸的是,关于 Excel 的情况并没有改变。不过,我看到了错误。
如前所述,EXCEL COM 服务器启动。我可以通过 COM 实例毫无问题地更改各种设置(例如抑制对话框)。
调用这个时出现问题:
1
| $excelComObject->Workbooks->Open( 'PathToXLSFile' ); |
UPDATE-2 :: 2011-11-30
将具有 READABLE 权限的帐户 USER、GUEST 和 EVERYONE 添加到 XLS 文件的访问控制列表中。没有变化。
以这样的方式修改了应用程序,PHP 部分将 XLS 文件的副本创建为临时文件,并将原始文件的内容移动到此文件中。只是为了确保问题不是由奇怪的文件/路径名强加的。
问题仍然存在。
UPDATE-2 :: 2011-12-05
我打算以这样一种方式发送 EXCEL COM-Server 方法,即 Excel 创建一个空白文件并将其保存到 /tmp。让我们看看,如果 Excel 甚至无法读取此文件。
- 您是否曾经在确切的环境中手动启动 Excel,并使用自动启动时所具有的确切用户帐户?
-
嗯。你的意思是我应该以 SYSTEM 身份登录并启动 Excel? SYSTEM可以作为用户登录吗?在场景 I - Apache / MySQL 以正常登录用户身份运行 - 没有问题出现。
-
我想 Excel 从未在您想要运行它的上下文中进行首次初始化(想想 HKEY_CURRENT_USER 和文件系统路径)(顺便说一句,SYSTEM 是一个糟糕的上下文,我强烈建议您将其更改为实际用户有自己的个人资料)
-
就上下文而言,您的意思是 SYSTEM 太强大而无法运行 Apache / MySQL。你?
-
基本上是的,但除此之外,我不确定以 SYSTEM 身份运行桌面应用程序是否让您有机会正确初始化它。拥有专用帐户可以让您有机会建立调试方案,而使用 SYSTEM 您甚至无法登录以查看问题所在。请记住,Excel 还可能显示在纯服务器环境中不可见的模式消息框。
-
Microsoft 不支持在服务器环境中运行 Excel,而且很可能违反您的许可条款。我不是软件警察——我只是认为你应该在决定是否继续之前检查一下。
-
喔好吧。事实上,这个应用程序不是用户多路复用的。首先,它是一个预定的作业,它读取一组文件并将其内容写入数据库。因此,用户永远不会通过服务器直接与 Excel 交互。
-
...而且用户甚至不能调用处理 Excel 的脚本。
-
您说您收到"一条错误消息",然后发布了您理解的意思。如果您想找到问题的根本原因,您需要发布实际的相关代码和错误消息。另请参阅如何以聪明的方式提问。
-
@Martin 他正在运行 Windows 7。没有人谈论 Windows Server。您可以在 Windows 7 上运行 WAMP。您的假设不适用。
-
@PointedEars 我再次验证了上述错误消息。如上所述阅读。
-
@PointedEars 事实上,它是 Windows 7 工作站。所讨论的系统是一个或多或少没有工作负载的中间系统。它仅用于以定义明确的自动化方式将数据从某个区域转发到不太安全的区域。
-
假设错误消息与您所说的完全一样(我仍然怀疑),您仍然没有发布导致它的所有相关代码。所以所有的赌注仍然没有。
-
@PointedEars Erm ...我看到他正在运行Windows 7。您似乎用"您可以使用Windows 7运行WAMP"来回答自己的观点。当然,如果他们愿意,人们总是可以尝试将 Windows 7 用作服务器。对我关于支持或许可的观点没有任何影响。我认为您对我的评论的假设可能不适用。
-
@Martin 他不是"在服务器环境中运行 Excel"。
-
@PointedEars 我想这取决于您如何定义服务器环境。我很小心不要说"在服务器上运行",因为我认为人们会像您那样误解我。正如您所说,Windows 7 可以是服务器环境。下次我会更好地选择我的词。我想我们在这里的综合评论现在将确保没有人对这个主题感到困惑。谢天谢地,Stefan 似乎很好地理解了我。
-
@Martin请提供证据证明这不能与 WAMP 一起使用?
-
@StefanPantke JFYI:Windows 7 是为工作站设计的操作系统。等效的服务器是 Windows Server 2008 R2。但我认为这与这里无关。
-
远不能提供证明这行不通,我可以确认它确实有效。不过,这不会影响其可支持性或是否违反许可条款。 @Stefan 请接受我对这种毫无意义的争论流的歉意。我相信您可以看到我最初的评论是善意的,即使它不适用于您。
-
@Martin 请提供证据证明这不受支持或违反许可条款。否则你在这里的陈述只是 FUD。除非您提供进一步的证据,否则允许在 Windows 7 机器上安装 Apache、MySQL、PHP 和 Excel(当然,只有您获得许可才能使用 Excel)。允许将 COM 与 PHP 一起使用,正如您自己所说,这在技术上也是可行的。那么你对这个问题的观点是什么?
-
@Martin没问题马丁。我感谢每一个提示!
-
@SeveralAuthors 如果应用程序在 Win 7 Workstation 或 Server 上运行,这无关紧要。对于特定问题,两个系统的行为是相同的。
-
@PointedEars 任何许可协议或多或少都拒绝以某种方式使用客户端站点应用程序,即多个用户可以与单个实例进行交互。据我所知,这种情况称为用户多路复用。如前所述,此应用程序不会多路复用。没有用户与 Excel 交互。单个 PHP 进程的工作由调度程序启动。
-
此处讨论的可支持性:support.microsoft.com/kb/257757。对于许可,只要任何用户都可以通过您的服务器使用 Excel 并拥有自己运行 Excel 的许可证,我认为您就可以了,但我不是律师,所以如果有任何读者关心这一点,他们应该自己检查 EULA。
-
@Martin 再一次 - 现在是最后一次:用户既不能访问 Excel,也不能运行多个 Excel 实例。 Excel 运行与用户会话完全分离。 Excel的一次实例。所有用户都与从 DBMS 读取的数据进行交互 - Excel-COM 服务器甚至不在用户可访问的前端 Web 服务器上运行。
-
@Martin 感谢知识库文章。我知道一个类似的。
进入任务计划器,让一切以本地用户身份运行。这可能需要您输入密码,如果您还没有密码,请创建一个。
Excel 是一个用户级应用程序,不应作为系统运行。我敢肯定有办法绕过它,但你应该让一切运行在正确的水平。
让 Apache 在用户级别运行不是问题。
- 实际上,是的,这两个非常相似:-)
-
"在用户级别上运行 Apache 不是问题。" - 它实际上是推荐的,我很 :)
-
在任务计划器中切换到标准用户。问题仍然存在。
尝试创建以下目录:
1 2 3
| C:\\Windows\\SysWOW64\\Config\\Systemprofile\\Desktop
C:\\Windows\\System32\\Config\\Systemprofile\\Desktop |
它对我有用:-)
http://social.msdn.microsoft.com/Forums/en-US/innovateonoffice/thread/b81a3c4e-62db-488b-af06-44421818ef91
-
除了"它对我有用"评论之外,它对当前接受的答案有什么补充?
-
这对我也有用,请支持这个答案。根本原因是 Excel 是一个桌面应用程序,它不是为从系统服务帐户工作而设计的,而且它似乎需要这个特定的目录。我遇到了与 MSDN 页面上描述的完全相同的问题,并在偶然发现这个问题之前尝试了其他几种"解决方案"。除了创建桌面文件夹外,不需要进一步的操作(注册表、DCOM 注册等)。
在过去(阅读:Vista 之前)服务有一个名为"允许服务与桌面交互"的选项,它允许服务生成窗口等。从 Vista 开始,这不再被允许。
我怀疑 Excel 出现故障是因为它在此限制下无法运行。因此,任何在 Win7 安装中将其作为服务运行的尝试都将失败。
您可以使用 Windows XP 并允许与您的 Apache 进程进行桌面交互,出于明显的原因,我并不真正推荐这样做。
我会采取的另一种方法是创建一个作为常规进程运行并在无限循环中侦听套接字的 PHP 脚本。在 Apache 下运行的 PHP 脚本将通过本地套接字与辅助脚本通信,并让辅助脚本生成 Excel。
这听起来可能很复杂,但实际上代码并不多,而且它解决了您很快就会遇到的问题:您应该只运行一个 Excel 实例,否则您可能会遇到问题。辅助脚本可以对请求进行排队,将请求一个接一个地交给 Excel,然后将下一个放入队列中。
-
你的解释听起来很合理。谢谢!您是否阅读了这一点,Excel 实际上是以 COM 服务器开始的?我能够与 Excel 实例进行交互。仅打开 XLS 文件失败。关于这种情况:您的回答是否仍然适用?
-
很难说。这听起来确实像一个与安全相关的问题(我认为您已经尝试以各种方式解决)但我认为最终如果您解决了您将拥有其他问题。微软在这里有更多细节:support.microsoft.com/kb/257757