22.08.2011, 11:04 | #1 |
Участник
|
проблема использования Excel через clr
Доброго времени суток!
Возникла проблема вызова объектов Excel, используя объекты clr. Пример кода был взят из ветки форума. Ссылка. И написан джобик (просто открываем, а затем пересохраняем файл): X++: static void test_clr_excel(Args _args) { Microsoft.Office.Interop.Excel._Application excel; Microsoft.Office.Interop.Excel.Workbooks workbooks; Microsoft.Office.Interop.Excel._Workbook workbook; System.Type type; System.Reflection.FieldInfo fieldInfo; System.Object missing; Microsoft.Office.Interop.Excel.XlFileFormat fileFormat; Microsoft.Office.Interop.Excel.XlSaveAsAccessMode saveAsAccessMode; FileName textFileName; FileName path; FileName name; FileName extention; FileName _excelFileName = "С:\\test.xls"; ; new InteropPermission(InteropKind::ClrInterop).assert(); [path, name, extention] = fileNameSplit(_excelFileName); textFileName = path + name + '.csv'; if (System.IO.File::Exists(textFileName)) System.IO.File::Delete(textFileName); type = System.Type::GetType('System.Reflection.Missing'); fieldInfo = type.GetField('Value'); missing = fieldInfo.GetValue(null); fileFormat = ClrInterop::parseClrEnum('Microsoft.Office.Interop.Excel.XlFileFormat', 'xlTextWindows'); saveAsAccessMode = ClrInterop::parseClrEnum('Microsoft.Office.Interop.Excel.XlSaveAsAccessMode', 'xlNoChange'); try { excel = new Microsoft.Office.Interop.Excel.ApplicationClass(); workbooks = excel.get_Workbooks(); // при попытке открыть файл объект Excel просто вылетает workbook = workbooks._Open(_excelFileName, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); workbook.SaveAs(textFileName, fileFormat, missing, missing, missing, missing, saveAsAccessMode, missing, missing, missing, missing, missing); } catch { info("catched"); } try { // также не удаётся закрыть объект workbooks.Close(); } catch { info("excel wasnt closed"); } CodeAccessPermission::revertAssert(); } Система: Win Srv 2008 R2, DAX 2009, Excel 2010 Возможно кто-то уже сталкивался с аналогичной проблемой. Возможно, что будет необходимо "подкрутить" какие-либо настройки системы. |
|
22.08.2011, 14:52 | #2 |
Участник
|
Сразу после создания экземпляра Excel в целях тестирования сделайте его видимым
X++: excel = new Microsoft.Office.Interop.Excel.ApplicationClass(); excel.set_Visible(true); Как правило, проблема в сообщении об ошибке в Excel, которое требует нажать "Ok" для продолжения процесса открытия файла. Визуализация экземпляра Excel поможет убедится в правильности данного предположения |
|
22.08.2011, 15:12 | #3 |
Участник
|
Добавил, но результата так и не получил. Соответственно стало:
X++: excel = new Microsoft.Office.Interop.Excel.ApplicationClass(); excel.set_Visible(true); // отображается Excel workbooks = excel.get_Workbooks(); // при попытке открыть файл объект Excel просто вылетает workbook = workbooks._Open(_excelFileName, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); |
|
22.08.2011, 15:35 | #4 |
Участник
|
Так что происходит с Excel? Он "вылетает" или "остается висеть"? По шагам тестировать не пробовали?
|
|
22.08.2011, 16:11 | #5 |
Участник
|
Цитата:
Сообщение от Batuev Artem
Доброго времени суток!
Возникла проблема вызова объектов Excel, используя объекты clr. Пример кода был взят из ветки форума. [/XPP] При попытке открыть файл, Excel просто вылетает, не возвращая никакой ошибки. Тем не менее сам процесс остается висеть в менеджере задач. Система: Win Srv 2008 R2, DAX 2009, Excel 2010 Возможно кто-то уже сталкивался с аналогичной проблемой. Возможно, что будет необходимо "подкрутить" какие-либо настройки системы. Посмотрите тут Падает Ахапта-2009 при использовании .NET/CLRInterop/Word Видимо причина та же... |
|
22.08.2011, 16:13 | #6 |
Участник
|
А вызов происходит с терминального сервера? Уже на форуме обсуждалось, что при работе с Excel через терминальный сервер, возникают проблемы с методами СОМ объектов...
Ошибки Word 2003 при работе в терминальном режиме
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! Последний раз редактировалось plumbum; 22.08.2011 в 16:15. Причина: ссылка на упомянутую ветку |
|
22.08.2011, 17:46 | #7 |
Участник
|
да, по шагам пробовал тестировать. При вызове workbooks._Open(...) Excel вылетает (на сколько я понимаю, при вызове clr объекта происходит какая-то ошибка или исключение, но в Аксапту обратно оно (оповещение об ошибке) не попадает), но процесс (а если вызвать заранее excel.set_Visible(true), то и визуально окно Excel) остается висеть в менеджере задач.
|
|
22.08.2011, 17:58 | #8 |
Участник
|
|
|
22.08.2011, 18:01 | #9 |
Участник
|
Цитата:
Сообщение от plumbum
А вызов происходит с терминального сервера? Уже на форуме обсуждалось, что при работе с Excel через терминальный сервер, возникают проблемы с методами СОМ объектов...
Ошибки Word 2003 при работе в терминальном режиме |
|