19.08.2010, 13:23 | #1 |
Участник
|
Вывод в Excel на сервере
Есть задача -
На сервере открыть файл шаблона Excel, записать туда что-нибудь, сохранить На 3.0, 4.0 все работало отлично На 2009 не работает. Объект Application создается, но при попытке открытия файла появляется ошибка Method 'add' in COM object of class 'Workbooks' returned error code 0x800A03EC (<unknown>) which means: Нет доступа к файлу 'c:\MyData\test.xlsx' При изменении запуска класса на client все работает. АОС и Клиент установленны на одной машине, работают под одним пользователем(администратором). С чем вообще может быть связана такая ошибка? Если это принципиально не возможно, то Microsoft конечно подложило большую свинью, так как пользователи практически всех веб-порталов любили всякие модификации, которые генерят ексельки на портале Пример кода для воспроизведения: X++: static server void openFile() { COM comWorkBooks; COMVariant varTemlateName; COM m_comApplication; // COM interface to MS Office application COM m_comDocument; // COM interface to MS Office documnet str template = 'c:\\MyData\\test.xlsx'; Set permissionSet; ; permissionSet = new Set(Types::Class); permissionSet.add(new FileIoPermission(template,'rw')); permissionSet.add(new InteropPermission(InteropKind::ComInterop)); CodeAccessPermission::assertMultiple(permissionSet); m_comApplication = new COM('Excel.Application'); m_comApplication.Visible(false); comWorkBooks = m_comApplication.workBooks(); varTemlateName = new COMVariant(COMVariantInOut::IN, COMVariantType::VT_BSTR); varTemlateName.bStr(template); m_comDocument = comWorkBooks.add(varTemlateName); info('ok'); } Последний раз редактировалось trud; 19.08.2010 в 13:26. |
|
19.08.2010, 14:13 | #2 |
Модератор
|
На сервере 2003 стоит или 2007?
С Уважением, Георгий |
|
19.08.2010, 14:27 | #3 |
Участник
|
У меня этот тест прошел. Сначала служба АОС была под системной учеткой, ломалось, не давало создать COM, сделал запуск под пользователем с админскими правами на сервере, тест прошел. На сервере установлен 2003-й офис - файл соответственно xls.
|
|
19.08.2010, 15:12 | #4 |
Участник
|
В данном случае у пользователя windows на клиенте скорее всего действительно нет прав просто на папку на сервере, расшарить ее в общий доступ, но это временное решение проблемы.
Намучавшись с com автоматизацией 2007 excel на сервере 2008 64-битном переписали классы COMExcelDocument_RU для работы по технологии OpenXML. Чего и вам желаю - быстродействие выше в разы, Excel на сервер можно вообще не ставить. Из минусов - в шаблонах пришлось отказаться от формул, ибо их поддержка библиотекой OpenXML похожа на закат солнца вручную. |
|
19.08.2010, 15:42 | #5 |
Участник
|
На компьютере стоит Windows7 32 бит. Офис 2007
не понятно, какой доступ нужно дать. Компьютер всего один, сервисы запущены под администратором. Расшарил папку для всех, попробовал по сетевому пути, результат тот же - нет доступа к файлу А с помощью OpenXML вы можете открыть предварительно настроенный шаблон Excel и записать туда данные в определенные ячейки? или можно только генерить новые файлы? |
|
19.08.2010, 16:28 | #6 |
Участник
|
Цитата:
P.S. Может чтение журнала событий системы поможет узнать в чём грабли? Последний раз редактировалось player; 19.08.2010 в 16:31. |
|
19.08.2010, 20:42 | #7 |
Участник
|
Что-то непонятна идея с OpenXML. Допустим я открываю файл шаблона. В нем например строка 4 вида
X++: <x:row r="4" spans="1:3"> <x:c r="C4" t="s"> <x:v>4</x:v> </x:c> </x:row> Или вы делаете по другому? |
|
20.08.2010, 11:11 | #8 |
Участник
|
Win server 2008 (64 bit) скрипт работает без ошибок. Клиент и AOS на одной машине , AX 2009 SP1 RU-3. AOS работает под своей учетной записью.
|
|
20.08.2010, 11:17 | #9 |
Участник
|
Если проблема действительно не в пути к файлу, то, может, User Account Control в винде задизаблить? он у вас при каждом чихе не спрашивает Run as administrator?
|
|
20.08.2010, 12:10 | #10 |
Участник
|
Задизейблил UserAccountControl. То же самое. Так же пробовал менять пользователя, под которым запущен АОС на другого(тоже администратора). Опять такая же ошибка
Добавил в начало метода код проверяющий наличие файла, код отрабатывает нормально, файл есть X++: if (! WinApi::fileExists_RU(template)) { throw error(strFmt("File not exists")); } Можете добавить в начало метода X++: info(strFmt("%1", xGlobal::clientKind())); Последний раз редактировалось trud; 20.08.2010 в 12:20. |
|
20.08.2010, 12:28 | #11 |
Участник
|
Цитата:
Сообщение от trud
Что-то непонятна идея с OpenXML. Допустим я открываю файл шаблона. В нем например строка 4 вида
X++: <x:row r="4" spans="1:3"> <x:c r="C4" t="s"> <x:v>4</x:v> </x:c> </x:row> Или вы делаете по другому? |
|
20.08.2010, 12:32 | #12 |
Участник
|
Кстати, про fileExists - на 64-х битном сервере WinApi::fileExists_RU
заменил на X++: static public boolean fileExists_CLR(FilenameOpen _fileName) { InteropPermission perm = new InteropPermission(InteropKind::ClrInterop); boolean ret; ; perm.assert(); ret = ClrInterop::getAnyTypeForObject(System.IO.File::Exists(_filename)); return ret; } |
|
|
За это сообщение автора поблагодарили: S.Kuskov (10). |
20.08.2010, 12:36 | #13 |
Участник
|
По теме вопроса Попробуйте -
в dcomcnfg нужно в "настройка DCOM\Component services\Microsoft Excel Application" в свойствах поиграть с удостоверением вместо "Текущий пользователь" поставить "Запускающий пользователь" или явно указанный пользователь. Последний раз редактировалось player; 20.08.2010 в 12:39. |
|
|
За это сообщение автора поблагодарили: trud (1), db (3), arty (1). |
20.08.2010, 13:39 | #14 |
Участник
|
Смена удостоверения на конкретного пользователя помогла
Огромное спасибо, сейчас буду тестить на 64 бит |
|
20.08.2010, 13:57 | #15 |
Участник
|
Кстати, одна из проблем серверной автоматизации в том что на server 2008 этот "конкретный" пользователь обязательно должен быть админом и у него обязательно должно быть право Interact with Desktop, и еще вроде бы валилось с невозможностью получения прав доступа по GUID объекта который отсутствовал в списке component services (типа лист Microsoft excel или что-то подобное), что в комплексе с вываливаниями при открывающихся в excel диалоговых окон, запуск -надцати excel и выползание в swap при попытке активно смотреть отчеты натолкнуло на вышеозначенную реализацию.
P.S. К слову, сам Microsoft активно открещивается от серверной автоматизации с помощью Excel, что нетрудно гуглится, например _http://support.microsoft.com/kb/257757. Прочитав ужаснулся, но поскольку на server 2003 32bit работало, не трогал. Спасибо server 2008 64-bit в общем за победу разума над ленью Последний раз редактировалось player; 20.08.2010 в 14:04. |
|
|
За это сообщение автора поблагодарили: Logger (10), Dreadlock (1). |
04.12.2011, 19:04 | #16 |
Участник
|
Всем привет!
Столкнулся с тем, что в WS2008 64bit в компонентах нет Microsoft Excel Application, а есть лишь только GUID значения которого нельзя поменять. В общем, если при экспорте или импорте Excel файла на портале будут выдаваться ошибки: Метод "open" в COM-объекте класса "Workbooks" возвратил код ошибки 0x800A03EC (<неизвестно>), который означает: Нет доступа к файлу '\\Сетевой\путь\tmpExcel.xls'. Это может быть вызвано одной из следующих причин. • Имени файла или пути не существует. • Файл используется другой программой. • Имя книги, которую вы пытаетесь сохранить, совпадает с именем открытой в данный момент книги. Нужно выполнить следующее: Цитата:
This solution is ...
・Windows 2008 Server x64 Please make this folder. C:\Windows\SysWOW64\config\systemprofile\Desktop ・Windows 2008 Server x86 Please make this folder. C:\Windows\System32\config\systemprofile\Desktop ...instead of dcomcnfg.exe. Надеюсь пригодится. Последний раз редактировалось Dreadlock; 04.12.2011 в 19:09. |
|
|
За это сообщение автора поблагодарили: Logger (5), Товарищ ♂uatr (2). |
04.12.2011, 21:17 | #17 |
Участник
|
См. также Сохранение документа Excel.
|
|
|
За это сообщение автора поблагодарили: Logger (5). |
21.04.2014, 19:40 | #18 |
Участник
|
Еще нашел для MS Office 2010, что надо добавить в папку C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\
папку Shemas и дать на нее права .Net BusinessConnector'у |
|
|
За это сообщение автора поблагодарили: Logger (3), gl00mie (2). |
06.05.2014, 11:09 | #19 |
Участник
|
Цитата:
Сообщение от player
Кстати, одна из проблем серверной автоматизации в том что на server 2008 этот "конкретный" пользователь обязательно должен быть админом и у него обязательно должно быть право Interact with Desktop, и еще вроде бы валилось с невозможностью получения прав доступа по GUID объекта который отсутствовал в списке component services (типа лист Microsoft excel или что-то подобное), что в комплексе с вываливаниями при открывающихся в excel диалоговых окон, запуск -надцати excel и выползание в swap при попытке активно смотреть отчеты натолкнуло на вышеозначенную реализацию.
P.S. К слову, сам Microsoft активно открещивается от серверной автоматизации с помощью Excel, что нетрудно гуглится, например _http://support.microsoft.com/kb/257757. Прочитав ужаснулся, но поскольку на server 2003 32bit работало, не трогал. Спасибо server 2008 64-bit в общем за победу разума над ленью Это не косяк разработчиков аксапты, а целенаправленная политика. Вместо решения проблемы формирования Excel файлов на сервере, решили вопрос ампутацией - просто запретили работать с Excel на сервере. |
|
09.12.2014, 09:44 | #20 |
Участник
|
Добрый день!
Возникла проблема, при отображением изображения при формировании данных. Данные формируются по шаблону (из ресурсов Аксапты) на сервере (DAX 2012 R2), в нем содержится изображение. При выполнении кода на клиенте изображение отображается корректно, а при формировании данного документа в CIL, картинка не отображается. Excel аргументирует это "часть рисунка с идентификатором отношения rId1 не найдена в файле". (это новый сервер, вчера были ошибки Excel.Application и 0x800A03EC, сделал как изложено здесь) |
|