Как я могу подключиться к событиям Excel в Javascript - PullRequest
7 голосов
/ 12 января 2009

В клиентском веб-приложении я хотел бы:

  1. открыть электронную таблицу Excel,
  2. экспорт некоторых данных приложения в Excel,
  3. позволяет пользователю работать с ним, а
  4. когда они будут готовы, прочитайте (потенциально измененные) данные обратно в мое приложение.

Я бы хотел, чтобы пользователь имел плавный опыт и определял, когда они выполнены с помощью Excel, подключившись к событию BeforeClose, но обнаружил, что не могу подключиться к событиям Excel в javascript / HTML.

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 ]

1 голос
/ 14 января 2009

Проведя некоторое исследование, я обнаружил, что не могу подключить события к динамическим объектам ActiveX (то есть тем, которые создаются конструктором new ActiveXObject) в javascript.

Одна идея состоит в том, что я создаю пользовательский элемент управления Windows Form-оболочки, который будет размещен внутри тега <object> в веб-приложении. Пользовательский элемент управления будет вызывать Excel и получать события и возвращать события обратно в javascript, который я мог бы подключить, используя механизм <script for="..." event="...">. Не уверен, что это сработает, но я попробую.

Даже если это работает, я не особенно рад этому решению. Слишком много слоев - javascript вызывается из элемента управления silverlight, что означает, что мои данные должны пересекать 3 границы туда и обратно: Silverlight -> Javascript -> Пользовательский элемент управления Winform -> Excel .

Было бы неплохо устранить некоторые из этих границ.

0 голосов
/ 14 января 2009

Я думаю, что ваш второй подход с использованием элемента управления Windows From, размещенного в IE, не будет работать.

IE ведет себя по-разному в качестве хоста сценариев. Эрик Липперт упоминает, что в блоге есть определенные ограничения:

Реализация обработки событий, часть вторая

0 голосов
/ 13 января 2009

Я не верю, что это возможно. Причина в том, когда вы звоните по следующему коду:

var excel = new ActiveXObject("Excel.Application");

Вы на самом деле открываете Excel. Так со следующей строкой:

workbook.BeforeClose = BeforeCloseEventHandler;

Это похоже на то, что вы говорите приложению Excel запустить Javascript, что невозможно. Я попытался исследовать альтернативы, такие как создание объекта события, определение кода за ним, а затем присвоение его workbook.BeforeClose, но я столкнулся с той же проблемой: события Excel не могут быть обнаружены с помощью javascript. Главным образом потому, что он работает как отдельный процесс.

Итак, вот еще несколько альтернатив, которые вы можете рассмотреть:

  1. Сохраните данные Excel на компьютере пользователя, затем, когда пользователь потеряет Excel, сделайте так, чтобы они щелкнули где-нибудь, что вызывает ваш первый метод, который читает этот файл и отображает его.
  2. Считайте данные из файла excel и затем отобразите их.
  3. Не закрывайте свой объект Excel (это, вероятно, оставит Excel открытым как процесс на вашем компьютере), и имейте событие таймера в javascript. Каждые 5 секунд проверяйте, открыт ли Excel, и если он не открыт, прочитайте файл и отобразите его.

Извините, что больше не могу помочь, и я не уверен, сработает ли какая-либо из этих альтернатив, но удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...