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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.10.2015, 16:29   #1  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Чтение Excel как string
Доброго времени суток!

X++:
public void Import()
{
    SysExcelApplication         application;
    SysExcelWorkbooks           workbooks;
    SysExcelWorkbook            workbook;
    SysExcelWorksheets          worksheets;
    SysExcelWorksheet           worksheet;
    SysExcelCells               cells;
    
    COMVariantType type;
    int row = 0;
    
    if(!this.dialogPrompt())
        return;
    
    application = SysExcelApplication::construct();
    workbooks = application.workbooks();
    
    try
    {
        workbooks.open(filename);
    }
    catch (Exception::Error)
    {
        throw error("File cannot be opened.");
    }
    
    workbook = workbooks.item(1);
    worksheets = workbook.worksheets();
    worksheet = worksheets.itemFromNum(1);
    cells = worksheet.cells();
    
    do
    {
        row++;       
        info(strfmt('%1 - %2', cells.item(row, 1).value().bStr(), cells.item(row, 2).value().bStr()));
        type = cells.item(row+1, 1).value().variantType();
    }
    while (type != COMVariantType::VT_EMPTY);
    application.quit();
}
Делаю по примеру чтение данных из файла excel. Проблема в том что value().bStr() не отдает ничего если считает что в ячейке какой то другой тип (например int). Подскажите как считывать данные в независимости от типа ячейки? метод toString() отдает данные вместе с постфиксом имени типа COMVariant::Type и портит значение (например если было 12, отдает "12.000 VT_R8")
Старый 27.10.2015, 17:18   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Gl00mie выкладывал свой проект по работе с Excel через .net
Поставьте и не мучайтесь. с типами там тоже решена проблема.

Если же влом, то можно сделать что-то типа

X++:
//GRD_LoQ001217_LedgerJournalImpXLS_PKOZ, Создание интерфейса по загрузке строк журналов из Excel, pkoz, 25.07.2005
// Если в ячейке Excel введено значение 18 - (ставкаНДС) то в COM объекте она имеет тип COMVariantType::VT_R8
// т.е. Excel считает
// значение числом с двойной точностью а не строкой.
// Обходим это ограничение. Этот метод используется когда нам точно нужно получить строку.
static str getStringValue(COMVariant _COMVariant, int _decimals = 0)
{
    str     ret;
    COMVariantType  COMType = _COMVariant.variantType();
    real    realTmp;
    ;
    switch(COMType)
    {
        case COMVariantType::VT_BSTR :
            ret = _COMVariant.bStr();
            break;
    // вещественные
        case COMVariantType::VT_R8 :
    //        ret = num2STR(_COMVariant.double(), 1,0,1,0);
            ret = num2STR(_COMVariant.double(), 1,_decimals,1,0); // переход на 2009  // pkoz 11.02.2011
    //        realTmp = _COMVariant.double();
    //        ret = num2STR(realTmp, 1,0,1,0);
            break;
        case COMVariantType::VT_R4 :
    //        ret = num2STR(_COMVariant.float(), 1,0,1,0);
            ret = num2STR(_COMVariant.float(), 1,_decimals,1,0); // переход на 2009  // pkoz 11.02.2011
            break;
        case COMVariantType::VT_DECIMAL :
    //        ret = num2STR(_COMVariant.decimal(), 1,0,1,0);
            ret = num2STR(_COMVariant.decimal(), 1,_decimals,1,0); // переход на 2009  // pkoz 11.02.2011
            break;
        case COMVariantType::VT_CY :
    //        ret = num2STR(_COMVariant.currency(), 1,0,1,0);
            ret = num2STR(_COMVariant.currency(), 1,_decimals,1,0); // переход на 2009  // pkoz 11.02.2011
            break;
    // целые
        case COMVariantType::VT_UI1 :
            ret = num2STR(_COMVariant.byte(), 1,0,1,0);
            break;
        case COMVariantType::VT_I1 :
            ret = num2STR(_COMVariant.char(), 1,0,1,0);
            break;
        case COMVariantType::VT_I4 :
            ret = num2STR(_COMVariant.long(), 1,0,1,0);
            break;
        case COMVariantType::VT_UI4 :
            ret = num2STR(_COMVariant.ulong(), 1,0,1,0);
            break;
        case COMVariantType::VT_UI2 :
            ret = num2STR(_COMVariant.ushort(), 1,0,1,0);
            break;

        default :
            ret = '';
    }

    return   ret;
}
X++:
static str getStringValueSafe(COM _comRange, int _decimals = 0)
{
    str         ret;
    COMVariant  comVariant;
    ;
    #startSafeCall_RU
    comVariant = _comRange.value();
    #endSafeCall_RU
    ret = GRD_COMVariant::getStringValue( comVariant, _decimals);
    return   ret;
}
где GRD_COMVariant:: - класс в котором написаны эти методы.

И используйте getStringValueSafe для доставания строковых значений.
За это сообщение автора поблагодарили: syl (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
atinkerersnotebook: Using the Dynamics AX Excel Add-In Blog bot DAX Blogs 1 25.09.2013 07:11
atinkerersnotebook: Walkthrough & Tutorial Summary Blog bot DAX Blogs 1 09.09.2013 09:11
чтение из Excel текста, состоящего из цифр somebody DAX: Программирование 15 25.01.2013 20:28
Чтение ИЗ Excel (а не запись в него) Mechanizm DAX: Программирование 10 04.07.2004 11:50
Чтение Excel-ячейки в Аксапте (2.5) через COM AKIS DAX: Программирование 3 25.03.2004 20:18

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

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

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