excel.office.interop يعود ضعف حتى عندما يكون عدد صحيح

StackOverflow https://stackoverflow.com/questions/20353790

  •  25-08-2022
  •  | 
  •  

سؤال

ما يلي يحصل على كائنات من جدول بيانات 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