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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.01.2012, 13:47   #1  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Интересно. Видимо второй (и последующие) вызов метода item() натыкается на какой-то мусор, оставшийся после первого вызова. А вызов info() каким-то образом подчищает этот мусор.

В качестве workaround могу предложить позиционироваться на ячейке при помощи метода offset:
X++:
static void checkExcell(Args _args)
{
    FilePath path='';
    container conFilter = ["Файл  (*.xls)", "*.xls"];
    SysExcelApplication exappl;
    SysExcelCells excells;
    SysExcelWorksheets exsheets;
    SysExcelWorksheet exsheet;
    SysExcelCell excell; // fix
    int row;
    real a,b;
    ;

    path = WinAPI::getOpenFileName(0,conFilter,"", "Укажите файл ",'',"");
    if (!path) return;

    exappl = SysExcelApplication::construct();
    exappl.workbooks().open(path);
    exsheets = exappl.workbooks().item(1).worksheets();
    exsheet = exsheets.itemFromNum(1);
    excells = exsheet.cells();
    excell = excells.item(1,1); // fix
    
    for(row = 1;row<3;row++)
    {
        //a = excells.item(row,1).value().double();
        a = excell.offset(row - 1, 0).value().double(); // fix
        
        //info(strfmt('%1',a));                          // строка 1
        
        //b = excells.item(row,2).value().double();
        b = excell.offset(row - 1, 1).value().double(); // fix
        
        info(strfmt('%1',a));                            // строка 2
        info(strfmt('%1',b));
    }

    exappl.quit();
}
За это сообщение автора поблагодарили: Logger (3), Димитрий (1).
Старый 12.01.2012, 13:54   #2  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Да, действительно. Так заработало корректно.

Но, код подобного типа расскидан по системе, т.к. даже не думал, что можно в такое вляпаться. Честно скажу, что в большей степени бы порадовала заплатка на класс работы с Экселем.
Старый 12.01.2012, 14:03   #3  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Да, так и получилось. На SysExcelCells

X++:
public SysExcelCell item(int _row, int _column, boolean first = false)
{
    if (first)
        return SysExcelCell::construct(version,COM::createFromVariant(cells.item(_row,_column)));
    else
    {
        if (!excell)
            excell = this.item(1,1,true); 
        return excell.offset(_row - 1, _column-1); 
    }
}
В декларации добавляем

SysExcelCell excell;

Работает.
Старый 12.01.2012, 14:31   #4  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Но проблем при такой заплатке есть.

Если первая ячейка объединена с рядом стоящими, то работает неверно.
Теги
excel

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Sample Design Patterns: Microsoft Dynamics AX - Remedy for slow Microsoft Excel import Blog bot DAX Blogs 0 29.05.2011 17:13
Как изменить формат ячейки в EXCEL demon46 DAX: Программирование 21 27.01.2010 11:29
Чтение Excel-ячейки в Аксапте (2.5) через COM AKIS DAX: Программирование 3 25.03.2004 20:18
Ячейки Excel YVAS DAX: Программирование 2 05.08.2003 10:00
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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