Показать сообщение отдельно
Старый 27.10.2015, 17:18   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,971 / 3268 (116) ++++++++++
Регистрация: 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).