AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.08.2010, 13:23   #1  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1630 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 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  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
На сервере 2003 стоит или 2007?

С Уважением,
Георгий
Старый 19.08.2010, 14:27   #3  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
У меня этот тест прошел. Сначала служба АОС была под системной учеткой, ломалось, не давало создать COM, сделал запуск под пользователем с админскими правами на сервере, тест прошел. На сервере установлен 2003-й офис - файл соответственно xls.
Старый 19.08.2010, 15:12   #4  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
В данном случае у пользователя windows на клиенте скорее всего действительно нет прав просто на папку на сервере, расшарить ее в общий доступ, но это временное решение проблемы.
Намучавшись с com автоматизацией 2007 excel на сервере 2008 64-битном переписали классы COMExcelDocument_RU для работы по технологии OpenXML. Чего и вам желаю - быстродействие выше в разы, Excel на сервер можно вообще не ставить. Из минусов - в шаблонах пришлось отказаться от формул, ибо их поддержка библиотекой OpenXML похожа на закат солнца вручную.
Старый 19.08.2010, 15:42   #5  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1630 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
На компьютере стоит Windows7 32 бит. Офис 2007
не понятно, какой доступ нужно дать. Компьютер всего один, сервисы запущены под администратором. Расшарил папку для всех, попробовал по сетевому пути, результат тот же - нет доступа к файлу
А с помощью OpenXML вы можете открыть предварительно настроенный шаблон Excel и записать туда данные в определенные ячейки?
или можно только генерить новые файлы?
Старый 19.08.2010, 16:28   #6  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
Цитата:
Сообщение от trud Посмотреть сообщение
А с помощью OpenXML вы можете открыть предварительно настроенный шаблон Excel и записать туда данные в определенные ячейки?
или можно только генерить новые файлы?
Открываем файл excel и модифицируем по потребностям, класс COMExcelDocument_RU переписан, все остальное не менялось, но вся работа с xml вынесена во внешнюю сборку .net. Генерить новые файлы потребности не возникало, но это решаемо, когда за классом акспаты стоит вся "мощчь" C#

P.S. Может чтение журнала событий системы поможет узнать в чём грабли?

Последний раз редактировалось player; 19.08.2010 в 16:31.
Старый 19.08.2010, 20:42   #7  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1630 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Что-то непонятна идея с 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>
Мне надо вставить набор данных начиная допустим со строки 2. Т.е. я должен найти все объекты, которые лежат ниже, как-то обновить у них всех ссылки. На первый взгляд получается большая сложность, учитывая что могут быть объединенные ячейки и т.п.
Или вы делаете по другому?
Старый 20.08.2010, 11:11   #8  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Win server 2008 (64 bit) скрипт работает без ошибок. Клиент и AOS на одной машине , AX 2009 SP1 RU-3. AOS работает под своей учетной записью.
Старый 20.08.2010, 11:17   #9  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Если проблема действительно не в пути к файлу, то, может, User Account Control в винде задизаблить? он у вас при каждом чихе не спрашивает Run as administrator?
Старый 20.08.2010, 12:10   #10  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1630 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Задизейблил UserAccountControl. То же самое. Так же пробовал менять пользователя, под которым запущен АОС на другого(тоже администратора). Опять такая же ошибка
Добавил в начало метода код проверяющий наличие файла, код отрабатывает нормально, файл есть
X++:
if (! WinApi::fileExists_RU(template))
    {
        throw error(strFmt("File not exists"));
    }
IKA, а вы приведенный код как запускаете? добавили его в метод класса и запускаете этот класс из джоба или как-то еще?
Можете добавить в начало метода
X++:
info(strFmt("%1", xGlobal::clientKind()));

Последний раз редактировалось trud; 20.08.2010 в 12:20.
Старый 20.08.2010, 12:28   #11  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
Цитата:
Сообщение от 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>
Мне надо вставить набор данных начиная допустим со строки 2. Т.е. я должен найти все объекты, которые лежат ниже, как-то обновить у них всех ссылки. На первый взгляд получается большая сложность, учитывая что могут быть объединенные ячейки и т.п.
Или вы делаете по другому?
В библиотеке OpenXML некоторые возможности (хотя далеко не все) определены в виде библиотечных классов типа WorkSheetPart, Cell и т.д., более подробно об этом на openxmldeveloper.org. А вот с объединенными ячейками, именованными ячейками и прочими диапазонами действительно приходится возиться при вставке/удалении строк/столбцов. Трудозатраты - примерно один человеко-месяц без выходных и сверхурочных.
Старый 20.08.2010, 12:32   #12  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
Кстати, про 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  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
По теме вопроса Попробуйте -
в 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  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1630 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Смена удостоверения на конкретного пользователя помогла
Огромное спасибо, сейчас буду тестить на 64 бит
Старый 20.08.2010, 13:57   #15  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
Кстати, одна из проблем серверной автоматизации в том что на 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  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Всем привет!


Столкнулся с тем, что в 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.
Источник http://social.msdn.microsoft.com/For...6-44421818ef91

Надеюсь пригодится.

Последний раз редактировалось Dreadlock; 04.12.2011 в 19:09.
За это сообщение автора поблагодарили: Logger (5), Товарищ ♂uatr (2).
Старый 04.12.2011, 21:17   #17  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
См. также Сохранение документа Excel.
За это сообщение автора поблагодарили: Logger (5).
Старый 21.04.2014, 19:40   #18  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Еще нашел для MS Office 2010, что надо добавить в папку C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\
папку Shemas и дать на нее права .Net BusinessConnector'у
За это сообщение автора поблагодарили: Logger (3), gl00mie (2).
Старый 06.05.2014, 11:09   #19  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от 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 в общем за победу разума над ленью
Теперь стало понятнее, почему в Ax классы по взаимодействию с Excel - клиентские.
Это не косяк разработчиков аксапты, а целенаправленная политика. Вместо решения проблемы формирования Excel файлов на сервере, решили вопрос ампутацией - просто запретили работать с Excel на сервере.
Старый 09.12.2014, 09:44   #20  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
299 / 866 (29) +++++++
Регистрация: 23.10.2012
Добрый день!
Возникла проблема, при отображением изображения при формировании данных.
Данные формируются по шаблону (из ресурсов Аксапты) на сервере (DAX 2012 R2), в нем содержится изображение.
При выполнении кода на клиенте изображение отображается корректно, а при формировании данного документа в CIL, картинка не отображается.
Excel аргументирует это "часть рисунка с идентификатором отношения rId1 не найдена в файле". (это новый сервер, вчера были ошибки Excel.Application и 0x800A03EC, сделал как изложено здесь)
Теги
excel

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вывод всех меток из заданного уровня на заданных языках в Excel wojzeh DAX: Программирование 0 19.03.2010 23:45
Вывод картинки в Excel Zlojbarsuk DAX: Программирование 1 14.08.2008 14:21
Маленькое замечание про вывод в Excel NNB DAX: Программирование 11 23.06.2008 16:23
Вывод в Excel в формате XML и ширина колонок gl00mie DAX: Программирование 1 30.10.2006 10:45
Вывод в Excel в определнный Worksheet... soin DAX: Программирование 1 22.10.2004 13:53
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:49.