如何在Javascript中连接Excel事件

时间:2009-01-12 19:00:16

标签: javascript html excel activex

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

  1. 打开Excel电子表格,
  2. 将一些应用程序数据导出到Excel,
  3. 允许用户使用它,
  4. 完成后,将(可能已更改的)数据读回我的应用程序。
  5. 我希望用户能够获得流畅的体验并通过连接到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;
    }
    

    有人有任何建议吗?

3 个答案:

答案 0 :(得分:1)

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

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

即使它确实有效,我也不是特别高兴这个解决方案。层数太多了 - 从Silverlight控件调用javascript意味着我的数据必须跨越3个边界并返回: Silverlight - &gt; Javascript - &gt;托管Winform用户控件 - &gt; Excel中

消除这些界限会很好。

答案 1 :(得分:0)

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

IE作为脚本主机表现不同。 Eric Lippert提到的博客文章有一些限制:

Implementing Event Handling, Part Two

答案 2 :(得分:-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是否仍处于打开状态,如果未打开,请阅读该文件并显示它。
  4. 对不起我不能再帮忙了,我不太确定这些替代方案是否有用,但祝你好运!