Среда, 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 даже вышеописанное не помогло.
Метки:
code
-
Запись понравилась
-
0
Процитировали
-
0
Сохранили
-