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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.03.2019, 17:03   #1  
amin is offline
amin
Участник
 
12 / 10 (1) +
Регистрация: 27.07.2006
Как это работает через NET?
В свое время была тема "Как программно из AX присвоить bookmark в Excel"
Как программно из AX присвоить bookmark в Excel

Там это делалось через COM, и все было хорошо. Пытаюсь сделать через NET? - не ругается, но и не создает.


Microsoft.Office.Interop.Excel.WorksheetClass netObject = range.worksheet().netObject();
Microsoft.Office.Interop.Excel.Names netNames = netObject.get_Names();

;
......
netNames.Add("SSSS", "=$A$1"
,null
,null
,null

,null
,null
,null
,null
,null
,null
);
.....
Старый 28.03.2019, 11:31   #2  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
265 / 808 (27) +++++++
Регистрация: 23.10.2012
Добрый день.
В рамках Аксапты, видимо, нужно передавать аргументы.
https://docs.microsoft.com/en-us/dot...view=excel-pia
Старый 29.03.2019, 16:13   #3  
amin is offline
amin
Участник
 
12 / 10 (1) +
Регистрация: 27.07.2006
Добрый день, Товарищ ♂uatr!
Это я читал, а в коде будет выглядеть передача необязательных аргументов со значениями по умолчанию, а то не указывать их нельзя, а в указанном варианте - см. выше.
Старый 29.03.2019, 16:40   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
попробуйте вместо null передавать результат вот этого метода:

X++:
protected final CLRObject getClrMissingArg()
{
    CLRObject                           clrMissingArg;  // что передавать вместо необязательных параметров
    System.Reflection.FieldInfo fieldInfo;
    System.Type                 type;

    #define.SystemReflectionMissing     ('System.Reflection.Missing')
    ;

    // if (!isMissingArgInited)
    {
        // BP deviation documented
        type                = System.Type::GetType( #SystemReflectionMissing );
        fieldInfo           = type.GetField( @"Value" );
        clrMissingArg       = fieldInfo.GetValue( null );
        // isMissingArgInited  = true;
    }
    return clrMissingArg;
}
Старый 29.03.2019, 17:40   #5  
amin is offline
amin
Участник
 
12 / 10 (1) +
Регистрация: 27.07.2006
Увы, Logger, благодарю, но не прокатило. Ругается на неинициализированность объекта CLRObject, хотя метод возвращает его "живым". Вы сами пробовали прогнать этот пример (у меня AX 4.0)? Может на другой версии это рабочее.
Старый 30.03.2019, 10:14   #6  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от amin Посмотреть сообщение
Ругается на неинициализированность объекта CLRObject, хотя метод возвращает его "живым"
Метод напрямую указывается в параметре или через промежуточную переменную?
Правильным будет:
X++:
CLRObject nullObj = getClrMissingArg();
и уже nullObj использовать в параметрах.
Старый 31.03.2019, 02:54   #7  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Сам пример в С#/.Net (i.e. Console App) пробовали запустить? Работает?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 02.04.2019, 18:29   #8  
amin is offline
amin
Участник
 
12 / 10 (1) +
Регистрация: 27.07.2006
to Alex_KD
Вполне себе
Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workBook = ObjExcel.Workbooks.Add(Type.Missing);
Microsoft.Office.Interop.Excel.Worksheet sheet = ObjExcel.Worksheets.get_Item(1);
Microsoft.Office.Interop.Excel.Names netNames = workBook.Names;
netNames.Add("SSSS", "=$A$1");
ObjExcel.Visible = true;
P.S. Что интересно,NET, как и COM ActiveWorkbook.Names("sssss").Delete не видят.
Старый 06.05.2019, 15:55   #9  
AnGor is offline
AnGor
Участник
Аватар для AnGor
 
97 / 46 (2) +++
Регистрация: 30.08.2007
Адрес: Ulm
Записей в блоге: 6
подключите dll EPPlus - достойная замена .NET-способу.
Можно строить таблицы в пакетном режиме, но и на клиенте скорость тоже бешеная.
Плюс можно использовать темплейты с заготовленными пивотами и т.д.
Пример с коментарием:
X++:
OfficeOpenXml.ExcelPackage excelPackage = new OfficeOpenXml.ExcelPackage();
OfficeOpenXml.ExcelWorkbook   excelWorkbook = excelPkg.get_Workbook();
OfficeOpenXml.ExcelWorksheets  excelWorksheets = excelWorkbook.get_Worksheets();
OfficeOpenXml.ExcelWorksheet  excelWorksheet = excelWorksheets.get_Item("Sheet1");
OfficeOpenXml.ExcelRange excelRange = excelWorksheet.get_Cells();
excelRange.get_Item('A1').AddComment("qqq","ag");
Старый 07.05.2019, 18:55   #10  
amin is offline
amin
Участник
 
12 / 10 (1) +
Регистрация: 27.07.2006
to AnGor За информацию - спасибо, буду иметь ввиду. Только здесь решалась не просто задача на быстрый вывод в excel. Хотелось следующее. Есть темплейт xltx. На листе - некая область (колонки, табличная часть, подвал). По логике отчета эта область размножается/ копируется с последующей вставкой данных, условно, по разным подразделениям, число которых заранее не известно. Чтобы не париться с подсчетами количества строк, реализовывалась идея создать нужное число именованных Range, ориентируясь на которые скопировать образец с форматированием и вставлять соответствующие данные, используя только относительные смещения (абсолютные координаты знает конкретный Range, а я их знать не хочу).
Задачу решил, обойдя NET по периметру. Именованные Range скопировал еще при подготовке шаблона (job через COM), взяв их число с запасом. При формировании отчета (я привязан к NET) просто вставляю данные в нужный Range, получив его имя по номеру.
Работает. Удобно. Легко сопровождаемо и наращиваемо. Просто жаль, что такой удобный механизм, как именованный Range приходится использовать…через подобную проктологию.
Старый 09.05.2019, 10:37   #11  
AnGor is offline
AnGor
Участник
Аватар для AnGor
 
97 / 46 (2) +++
Регистрация: 30.08.2007
Адрес: Ulm
Записей в блоге: 6
Пару месяцев нвзад была очень похожая задача - один в один без подвалов, но с разрывами страниц.
С первой по третью строку шапка, 4 и 5 - строка


Итоговый вид


так я множу шапку:
X++:
public boolean pasteRepHeader(OfficeOpenXml.ExcelWorksheet _ExcelWorksheet, int _row)
{
    #define.RepHeader('RepHeader')
    #define.tmp('tmp')
    OfficeOpenXml.ExcelWorksheet fromExcelWorksheet;
    OfficeOpenXml.ExcelRange fromExcelRange;
    OfficeOpenXml.ExcelRange toExcelRange;
    boolean ret = true;

    fromExcelWorksheet = excelEPPLus.getWorksheet(#tmp);
    fromExcelRange = fromExcelWorksheet.get_Cells();
    toExcelRange = _ExcelWorksheet.get_Cells();

    fromExcelRange = fromExcelRange.get_Item(1,1,3,11);
    toExcelRange = toExcelRange.get_Item(_row,1,_row+3,11);
    fromExcelRange.Copy(toExcelRange);

    return ret;
}
и по похожему принципу строки
X++:
public boolean pasteRepLine(OfficeOpenXml.ExcelWorksheet _ExcelWorksheet, int _row)
{
    #define.tmp('tmp')
    OfficeOpenXml.ExcelWorksheet fromExcelWorksheet;
    OfficeOpenXml.ExcelRange fromExcelRange;
    OfficeOpenXml.ExcelRange toExcelRange;
    boolean ret = true;

    fromExcelWorksheet = excelEPPLus.getWorksheet(#tmp);
    fromExcelRange = fromExcelWorksheet.get_Cells();
    toExcelRange = _ExcelWorksheet.get_Cells();

    fromExcelRange = fromExcelRange.get_Item(4,1,5,11);
    toExcelRange = toExcelRange.get_Item(_row,1,_row+1,11);
    fromExcelRange.Copy(toExcelRange);

    return ret;
}
разрыв страниц:
X++:
...
excelColumn = ExcelWorksheet.Column(_col);
excelColumn.set_PageBreak(true);
...
короче - я от EPPlus просто балдю
Миниатюры
Нажмите на изображение для увеличения
Название: 2019-05-09 09_17_26-W16.png
Просмотров: 500
Размер:	6.1 Кб
ID:	12304   Нажмите на изображение для увеличения
Название: 2019-05-09 09_18_33-W16_1.png
Просмотров: 467
Размер:	37.9 Кб
ID:	12305  

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
sertandev: Simple server-side scripting with ASP.NET Razor Blog bot DAX Blogs 2 06.04.2018 06:47
Глюк(?) при импорте в Excel через .Net Loengrinchik DAX: Программирование 1 14.08.2015 10:55
goshoom: Exception handling with X++ and .NET Interop Blog bot DAX Blogs 0 02.09.2013 11:12
Dynamics AX: .Net Adapter and why? Blog bot DAX Blogs 0 26.06.2007 02:54
Работа Web-приложения .NET через COM Connector Fedor_imported DAX: Программирование 1 28.06.2005 00:45
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:24.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.