以下从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细胞中没有整数。唯一可用的类型是数字,文本,逻辑和错误。数字在Interop中映射到两倍。

因此,答案是将双重施加到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