在客户端Web应用程序中,我想:
我希望用户能够获得流畅的体验并通过连接到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 :(得分: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提到的博客文章有一些限制:
答案 2 :(得分:-1)
我不相信这是可能的。原因是,当您调用以下代码时:
var excel = new ActiveXObject("Excel.Application");
您实际上是在打开Excel。所以使用以下行:
workbook.BeforeClose = BeforeCloseEventHandler;
就像你告诉Excel应用程序运行Javascript一样,这是不可能的。我已经尝试过研究替代方案,比如创建一个事件对象,定义它背后的代码,然后将它分配给workbook.BeforeClose,但我会遇到同样的问题:javascript无法检测到Excel事件。主要是因为它作为一个单独的过程运行。
所以这里有一些你可以考虑的替代方案:
对不起我不能再帮忙了,我不太确定这些替代方案是否有用,但祝你好运!