質問

以下は、キャスト可能な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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top