根据 adrianm
,
Excel细胞中没有整数。唯一可用的类型是数字,文本,逻辑和错误。数字在Interop中映射到两倍。
因此,答案是将双重施加到int上,Chris
指出实际上有效。请注意,如果双重不等于一开始的整数,则可能需要根据需要进行更合适的转换。
题
以下从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);