我怎样才能连接到Javascript中的Excel事件

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

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

我希望用户有一个stream畅的体验,并通过连接到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; } 

有没有人有什么build议?

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

一个想法是,我创build了一个包装Windows窗体用户控件,它将托pipe在Web应用程序的<object>标记中。 用户控件将调用Excel并接收事件,并将事件重新提交给JavaScript,我可以使用<script for="..." event="...">机制。 不知道这会工作,但我会尝试。

即使这样做,我也不是特别满意这个解决scheme。 有太多的图层 – 从Silverlight控件调用JavaScript,这意味着我的数据必须跨越3个边界: Silverlight – > Javascript – >托pipeWinform用户控件 – > Excel

消除这些边界将是很好的。

我想也是你的第二种方法使用在IE中托pipe的Windows来控制将无法正常工作。

IE的行为与脚本主机不同。 Eric Lippert在博客中提到:

实现事件处理,第二部分

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

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

你实际上打开Excel。 所以用下面这行:

 workbook.BeforeClose = BeforeCloseEventHandler; 

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

所以这里有更多的select你可以考虑:

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

对不起,我不能再帮忙,我不太确定这些替代scheme是否有效,但祝你好运!