Excel.office.interop возвращается в два раза, даже если это целое число

StackOverflow https://stackoverflow.com/questions/20353790

  •  25-08-2022
  •  | 
  •  

Вопрос

Следующее получает объекты из электронной таблицы 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.

Это было полезно?

Решение

Согласно с adrianm,

Нет такой вещи, как целое число в клетках Excel. Единственными доступными типами являются числовые, текстовые, логические и ошибки. Число отображается, чтобы удвоить взаимосвязь.

Таким образом, ответ - просто поднять двойник на int, который какChris Указывания на самом деле работает. Обратите внимание, что если двойник не равен целому числу целого числа с самого начала, вы можете сделать более подходящее преобразование в соответствии с вашими потребностями.

Другие советы

Почему бы и нет ToString() ваш объект, затем разрабатывать, используя int.Parse(...) или же int.TryParse(...) ?

Вы можете преобразовать свой object в double а затем в int, но вы должны позаботиться как double ценность намного больше, чем int. Анкет Так что лучше преобразовать свой double в long.

Попробуй это:

object val = /*your value*/;
double db = Convert.ToDouble(val);
long x = Convert.ToInt64(db);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top