7

在客户端 Web 应用程序中,我想:

  1. 打开 Excel 电子表格,
  2. 将一些应用程序数据导出到 Excel,
  3. 允许用户使用它,并且
  4. 完成后,将(可能更改的)数据读回我的应用程序。

我希望用户拥有流畅的体验,并通过连接到 BeforeClose 事件来检测他们何时使用 excel 完成,但我发现我无法连接到 javascript/HTML 中的 Excel 事件。

function BeforeCloseEventHandler(cancel) {
    // TODO: read values from spreadsheet
    alert("Closing...");
}

function openExcel() {
    var excel = new ActiveXObject("Excel.Application");
    var workbook = excel.Workbooks.Add();
    var worksheet = workbook.Worksheets(1);
    worksheet.Cells(1, 1).Value = "First Cell";
    worksheet.Cells(1, 2).Value = "Second Cell";
    workbook.BeforeClose = BeforeCloseEventHandler;  // THIS DOESN'T WORK
    excel.Visible = true;
    excel.UserControl = true;
}

有没有人有什么建议?

4

3 回答 3

1

new ActiveXObject在做了一些研究之后,我发现我无法在 javascript 中将事件连接到动态 ActiveX 对象(即由构造函数创建的对象)。

一个想法是,我创建了一个包装 Windows 窗体用户控件,该控件将托管在<object>Web 应用程序的标记内。用户控件将调用 Excel 并接收事件,并将事件返回到 javascript,我可以使用该<script for="..." event="...">机制来连接。不确定这是否可行,但我会尝试。

即使它确实有效,我对这个解决方案也不是特别满意。有太多层——javascript 是从 silverlight 控件调用的,这意味着我的数据必须跨越 3 个边界并返回:Silverlight -> Javascript -> Hosted Winform User Control -> Excel

消除其中一些界限会很好。

于 2009-01-13T21:04:21.670 回答
0

我认为您使用 IE 中托管的 Windows From 控件的第二种方法也行不通。

IE 作为脚本主机的行为有所不同。正如 Eric Lippert 的一篇博文中提到的那样,存在某些限制:

实现事件处理,第二部分

于 2009-01-13T22:18:19.493 回答
-1

我不相信这是可能的。原因是,当您调用以下代码时:

var excel = new ActiveXObject("Excel.Application");

您实际上是在打开 Excel。因此,使用以下行:

workbook.BeforeClose = BeforeCloseEventHandler;

就像您在告诉 Excel 应用程序运行 Javascript,这是不可能的。我尝试过研究替代方案,例如创建一个事件对象,定义其背后的代码,然后将其分配给 workbook.BeforeClose,但我会遇到同样的问题:javascript 无法检测到 Excel 事件。主要是因为它作为一个单独的进程运行。

因此,您可以考虑以下一些替代方案:

  1. 将 Excel 数据保存在用户的计算机上,然后当用户丢失 Excel 时,让他们单击调用您的第一个方法的某个位置,该方法读取该文件并显示它。
  2. 从excel文件中读取数据,然后显示。
  3. 不要关闭您的 excel 对象(这可能会使 excel 在您的计算机上作为一个进程打开),并在 javascript 中有一个计时器事件。每 5 秒检查一次 Excel 是否仍然打开,如果没有打开,则读取文件并显示它。

抱歉,我无法再提供帮助了,我也不确定这些替代方案是否可行,但祝你好运!

于 2009-01-13T08:04:58.983 回答