Следующее получает объекты из электронной таблицы Excel string
или подчиняться double
. Анкет Проблема в том, что, даже если я знаю, что объект явно является целым числом, отформатированным как «общий» внутри электронной таблицы, Excel.office.interop всегда возвращает double
. Анкет Хотя было бы легко преобразовать двойник в ближайший int
, есть ли способ донести объект, подготовленный к int
?
// returns null if the cell is empty
// returns an object castable to a string if it is a string
// returns an object castable to a double if it is a floating point or integer number
internal object GetCell(int row, int column)
{
if ((row != 0) && (column != 0) && (worksheet != null))
{
string cellName = ExcelCellReference(row, column);
Microsoft.Office.Interop.Excel.Range oneCellRange;
oneCellRange = worksheet.get_Range(cellName, cellName);
object oneObject;
// contrary to MSDN, the value Empty, checkable with method IsEmpty()
// does not work if the cell was empty.
// instead, what happens is that null is returned.
oneObject =
(object)
oneCellRange.get_Value(Microsoft.Office.Interop.Excel.XlRangeValueDataType.xlRangeValueDefault);
return oneObject;
}
else
{
if (worksheet == null)
throw new Exception("null worksheet reference");
else
throw new Exception("invalid argument");
}
}
РЕДАКТИРОВАТЬ: Если каждое число в Excel представлено в виде номера с плавающей запятой, даже если это заметно целое число, то это объясняет это поведение, и в этом случае решения нет, кроме конверсии.
Редактировать: люди продолжают публиковать ответы на конверсию. Это вопрос предназначен для того, чтобы запрашивать идиоматические Interop
Ответы, а не ответы на конверсию.
РЕДАКТИРОВАТЬ: Ответ Криса в комментарии int i = (int)(double)GetCell(r, c)
Возможно, правильно, но не то, что я имел в виду, потому что обращение происходит вне Interop
.