Excel.Office.Interop即使是整数也会返回double

时间:2013-12-03 14:26:44

标签: c# excel

以下内容从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答案,而不是转换答案。

编辑:Chris在评论int i = (int)(double)GetCell(r, c)中的回答可以说是正确的但不是我想到的,因为转换发生在Interop之外。

3 个答案:

答案 0 :(得分:0)

为什么不ToString()您的对象,然后使用int.Parse(...)int.TryParse(...)进行解析?

答案 1 :(得分:0)

您可以将object转换为double,然后转换为int,但是您应该注意double值比int大得多。最好将double转换为long

试试这个:

object val = /*your value*/;
double db = Convert.ToDouble(val);
long x = Convert.ToInt64(db);

答案 2 :(得分:0)

根据adrianm

  

excel单元格中没有整数这样的东西。唯一的类型   可用的是数字,文本,逻辑和错误。号码映射到   在互操作中加倍。

所以答案是将double转换为int,而Chris指出实际上有效。请注意,如果double不等于开头的整数,您可能希望根据需要进行更合适的转换。