我怎样才能连接到Javascript中的Excel事件
在客户端的Web应用程序中,我想:
- 打开一个Excel电子表格,
- 将一些应用程序数据导出到Excel,
- 允许用户使用它
- 当它们完成时,将(可能改变的)数据读回到我的应用程序中。
我希望用户有一个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你可以考虑:
- 将Excel数据保存在用户的计算机上,然后当用户丢失Excel时,让他们单击某处调用第一个方法的地方,即读取该文件并显示该方法。
- 从Excel文件读取数据,然后显示它。
- 不要closures你的Excel对象(这可能会使excel在你的计算机上作为一个进程打开),并在JavaScript中有一个计时器事件。 每5秒钟检查一次Excel是否仍然打开,如果没有打开,请阅读文件并显示它。
对不起,我不能再帮忙,我不太确定这些替代scheme是否有效,但祝你好运!