2009-01-12 63 views
7

在客户端Web应用程序,我想:我如何挂钩到Excel事件在Javascript

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

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

有没有人有任何建议?

+0

起初我还以为你是疯了...现在我不能等待答案。 – 2009-01-13 03:06:50

回答

-1

我不相信这是可能的。原因是,当你拨打以下代码:

你实际上打开了Excel。因此,使用以下行:

workbook.BeforeClose = BeforeCloseEventHandler; 

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

所以这里有一些更多的选择,你可以考虑:

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

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

+1

我没有关于JavaScript的线索,所以我没有理由怀疑你在这里 - 并通过JavaScript钩住Excel确实“听起来”不可能!但是,退出过程不应该是一个问题。使用标准的进程外自动化使用VB6,VB.NET或C#你绝对可以钩住Excel事件。 – 2009-01-13 14:47:04

+0

作为示例,请参阅“如何:使用Visual C#.NET为Excel处理事件”,网址为http://support.microsoft.com/kb/823981。但我仍然没有线索如何通过JavaScript做到这一点,我也不知道它是否可以完成... – 2009-01-13 14:48:54

1

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

一个想法是我创建了一个包装Windows窗体用户控件,该控件将托管在Web应用程序中的<object>标记中。用户控件会调用Excel并接收事件,并将事件重新提交给javascript,我可以使用该机制来联系到这些内容。不确定这会起作用,但我会尝试。

即使它工作,我也不是特别满意这个解决方案。有太多的图层 - javascript是从silverlight控件调用的,这意味着我的数据必须跨越3个边界,并且返回:Silverlight - > Javascript - >托管Winform用户控件 - > Excel

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

0

我想你的第二种方法是使用IE中托管的Windows From控件无效。

IE的行为与脚本宿主不同。有一定的局限性的博客文章由埃里克利珀提到:

Implementing Event Handling, Part Two