1 (edited by mikhail_a 2019-06-19 16:40:20)

Topic: Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application"

Есть кнопка со стандартным действием "Экспорт в Excel".
В настройках кнопки указано свойство "Auto".
Для работы с таблицами установлен LibreOffice Calc. Excel не установлен.
При нажатии кнопки "Экспорт в Excel" выпадает ошибка: Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application".
Если же в свойствах кнопки указать вместо auto вывод в LibreOffice Calc, то вывод работает нормально.
Как победить ошибку при установке вывода в "auto"?
У меня сетевое приложение и у разных пользователей стоят разные программы  для работы с таблицами.
Т.е. мне нужно действительно "auto" определение в какое приложение выводить данные.
Если нельзя или долго устранять ошибку, то может быть как-то можно в самом скрипте проверять, какое приложение используется на данном ПК для работы с таблицами и посылать данные в него?

Re: Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application"

Проверьте пожалуйста, какая ошибка возникает, когда в настройках кнопки указан "Excel"


Данная ошибка возникает на всех компьютерах, на которых Excel не установлен? или только  на одном?

Dmitry.

Re: Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application"

Получается такая картина:
1. Если на ПК установлен Excel и Libre Office, то экспорт нормально срабатывает в любое приложение (если в кнопке явно указать конкретное приложение - Excel или OpenOffice(Calc) )
Однако, при указании в кнопке значения "auto", открывается Excel, а не то приложение, с которым ассоциировано расширение файла xls.
Т.е. настройка "auto" - 'это не  "auto", а "Excel".
2. Если на ПК установлен только Excel, то экспорт в него работает корректно, а при попытке послать экспорт в OpenOffice(Calc), сообщает, что эта программа не установлена.
Т.е. все ОК.
3. Если на ПК Excel не установлен, а только Libre Office, то экспорт в него делается нормально, а экспорт в "Excel" или "auto" подвешивает программу где-то на минуту, а затем появляется сообщение об ошибке:  Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application".
Проверить, как это работает на других ПК без установленного Excel пока не могу.
...
Очевидно, ошибка возникает в момент создания объекта Excel.Application, поскольку его на ПК нет.
...
Таким образом, во-первых, кнопка экспорта в режиме auto должна открывать то приложение, с которым ассоциировано расширение xls.
И второе - если Excel не установлен (или ошибка создания объекта), то сообщать, что Excel не установлен.

Re: Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application"

Режим auto не проверяет ассоциацию расширения xls, а только лишь проверяет, если установлен Excel, открываем в нем, если нету, то проверяет, установлен ли Libre Office.


Пока под рукой нет компьютера без установленного Excel для проверки, но попробую найти, т.к. возможно ошибка связана с некоректным удалением Excel.


Если у кого то из пользователей не уставновлен Excel, просьба проверить это, будет ли таже самая ошибка.

Dmitry.

Re: Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application"

На этом ПК у меня  Excel не стоял никогда.
Но, стоял WPS Office 2016.
И в него экспорт производился нормально при установке кнопки в auto.
В мое отсутствие на работе эту программу по ошибке деинсталлировали с ПК.
Возможно, сделали что-то неправильно.
Я уже поставил ее обратно, но в нее экспорт теперь уже не производится.
Т.е. возможно это проблема конкретного ПК, но надо бы добавить перехват и обработку этой ошибки.
А вообще, правильно было бы проверять ассоциацию  расширения файла и запускать привязанное по умолчанию приложение

Re: Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application"

DriveSoft wrote:

Режим auto не проверяет ассоциацию расширения xls, а только лишь проверяет, если установлен Excel, открываем в нем, если нету, то проверяет, установлен ли Libre Office.

Вопрос - к какому ключу идет обращение, чтобы понять установлен ли Excel?

Re: Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application"

Имеете ввиду ключ реестра?


Проверяется другим способом:

function CheckExcelInstalled(AValue: String): boolean;
var
  FCLSID: TCLSID;
begin
  Result := (CLSIDFromProgID(PChar(AValue), FCLSID) = S_OK);
end;

        // auto
        if CheckExcelInstalled ('Excel.Application') then Grid.ExportToExcel()
        else if CheckExcelInstalled ('com.sun.star.ServiceManager') then Grid.ExportToLibreCalc()
        else MessageBox(TForm(TdbButton(Button).Owner).Handle, PChar(Lang.Your_computer_does_not_have_Excel_or_LibreOffice), PChar(Lang.Error), MB_OK+MB_ICONINFORMATION);


в принципе вы можете реализовать режим Auto скриптами, создайте на форме две кнопки, одна для Excel, другая для LibreOffice, данные кнопки можно скрыть с формы, затем расположите еще одну кнопку, где вы сможете по своему алгоритму определять, что именно установлено у пользователя и соотвественно нажимать соотвествующую скрытую кнопку.

Dmitry.

Re: Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application"

DriveSoft wrote:

Имеете ввиду ключ реестра?


Проверяется другим способом:

function CheckExcelInstalled(AValue: String): boolean;
var
  FCLSID: TCLSID;
begin
  Result := (CLSIDFromProgID(PChar(AValue), FCLSID) = S_OK);
end;

        // auto
        if CheckExcelInstalled ('Excel.Application') then Grid.ExportToExcel()
        else if CheckExcelInstalled ('com.sun.star.ServiceManager') then Grid.ExportToLibreCalc()
        else MessageBox(TForm(TdbButton(Button).Owner).Handle, PChar(Lang.Your_computer_does_not_have_Excel_or_LibreOffice), PChar(Lang.Error), MB_OK+MB_ICONINFORMATION);

Этот код ищет в реестре программу с названием "Excel.Application".
Все ProgID должны располагаться в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Classes\
Но, в этой ветке на моем ПК нет строки "Excel.Application" (проверил вручную)
Зато есть в какой то другой ветке и без параметра CLSID
Может быть Ваш код  не учитывает отсутствие этой строки в данной ветке реестра или отсутствие у него CLSID?
И поэтому возникает ошибка.

Re: Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application"

Функция CLSIDFromProgID не является моей, она системная, к сожалению я не смогу изменить механизм ее работы.

Dmitry.