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 для доставания строковых значений.