によると adrianm
,
Excelセルに整数のようなものはありません。利用可能な唯一のタイプは、番号、テキスト、論理、エラーです。数字はインターナップで2倍にマッピングされます。
答えは、intにダブルをキャストすることです。Chris
実際に機能することを指摘しています。ダブルが最初から整数に等しくない場合は、必要に応じてより適切な変換を行うことをお勧めします。
質問
以下は、キャスト可能なExcelスプレッドシートからオブジェクトを取得します string
またはキャスト可能 double
. 。問題は、オブジェクトが目に見えて整数であることがわかっていても、スプレッドシート内の「一般」としてフォーマットされていることです。 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セルに整数のようなものはありません。利用可能な唯一のタイプは、番号、テキスト、論理、エラーです。数字はインターナップで2倍にマッピングされます。
答えは、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);