-Музыка

 -Подписка по e-mail

 

 -Поиск по дневнику

Поиск сообщений в Flashr

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 26.02.2007
Записей:
Комментариев:
Написано: 6574


Microsoft.Office.Interop

Среда, 09 Февраля 2011 г. 18:07 + в цитатник
Давно не выкладывал технических постов, а они, как показывает статистика, приносят наибольшее число просмотров через поисковики. Поэтому сегодня опишу общно и без детальных картинок проблематику взаимодействия с документами MS Office 2007 из веб-сайта при помощи поставляемых в комплекте библиотек-прослоек Office.Interop. Эта история интересна тем, что ее решение содержит кучу проблем, но нигде я не видел целостного описания их преодоления.
  • Во-первых, вам понадобится установить на сервер офис. Берем пиратскую энтерпрайс. Так как некоторые версии могут отказаться ставится на сервере через терминал (RDP).
  • После того как в программе сделали Reference, написали нужны код, скопировали на сервер у вас появится: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005 Решение - запускаем DCOMCNFG, выставляем пользователю NetworkServices права на запуск компонентов MicrosoftOffice(Word/Excel) или для того пользователя от лица которого работает ApplicationPool.
  • Запускаем повторно, вылезает (0x800A03EC): Microsoft Office cannot open or save any more documents because there is not enough available memory or disk Решение - Создать системные папки
    C:\Windows\SysWOW64\config\systemprofile\Desktop (для x64) C:\Windows\System32\config\systemprofile\Desktop (для x86)
    и выставить права для NetworkServices на папку - systemprofile.
  • На этом квест не заканчивает. При повторном запуске программа выдаст (0x80028018): Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD)) http://support.microsoft.com/kb/320369 Что говорит о разнице в локализации вашего кода и компонента. Решается переключением локализации вызывающего потока перед вызовов функций COM объекта
    System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture; System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); //вызовы Office.Interop

Вот пожалуй все, однако, на win2003x64 IIS6 EN даже вышеописанное не помогло.
Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку