27.10.2015, 16:29 | #1 |
Участник
|
Чтение 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(); } |
|
27.10.2015, 17:18 | #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; } И используйте getStringValueSafe для доставания строковых значений. |
|
|
За это сообщение автора поблагодарили: syl (1). |