7

クライアント側のWebアプリケーションでは、次のことを行います。

  1. Excelスプレッドシートを開き、
  2. 一部のアプリケーションデータをExcelにエクスポートします。
  3. ユーザーがそれを操作できるようにし、
  4. それらが完了したら、(変更された可能性のある)データをアプリケーションに読み戻します。

ユーザーに流動的なエクスペリエンスを提供し、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;
}

誰か提案はありますか?

4

3 に答える 3

1

new ActiveXObjectいくつかの調査を行った後、javascript で 動的 ActiveX オブジェクト (つまり、コンストラクターによって作成されたオブジェクト) にイベントを接続できないことがわかりました。

1 つのアイデアは<object>、Web アプリのタグ内でホストされるラッパー Windows フォーム ユーザー コントロールを作成することです。ユーザー コントロールは、Excel を呼び出してイベントを受信し、イベントを発生させて JavaScript に戻します。これを<script for="..." event="...">メカニズムを使用して接続できます。これが機能するかどうかはわかりませんが、試してみます。

うまくいったとしても、私はこの解決策に特に満足しているわけではありません。レイヤーが多すぎます - javascript が Silverlight コントロールから呼び出されているということは、データが 3 つの境界を越えなければならないことを意味します: Silverlight -> Javascript -> Hosted Winform User Control -> Excel

これらの境界の一部を排除するとよいでしょう。

于 2009-01-13T21:04:21.670 に答える
0

IE でホストされている Windows From コントロールを使用した 2 番目のアプローチも機能しないと思います。

IE はスクリプト ホストとは異なる動作をします。Eric Lippert によるブログ投稿が言及しているように、特定の制限があります。

イベント処理の実装、パート 2

于 2009-01-13T22:18:19.493 に答える