получить значение отдельной ячейки в функции автоматизации Excel с помощью c # - PullRequest
0 голосов
/ 14 октября 2010

Мне нужно получить одну ячейку вместо Excel.Range в моем методе.

using Excel = Microsoft.Office.Interop.Excel;
...
public object vReadNumber(Excel.Range targetRange)
{
    ...
    Doing Something With targetRange
    ...
}

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 10 октября 2012
// n.b. cell is derived from a WorkSheet object xlSheet
// by cell = xlSheet.Cells[row, col]

public T CellValue<T>(object cell)
{
    T result = default(T);
    try
    {
        Range rg = (Range)cell;
        object value = rg.Value2;
        if (value != null)
        {
            if (typeof(T) == typeof(DateTime))
            {
                DateTime dateValue;
                if (value is double)
                {
                    dateValue = DateTime.FromOADate((double)value);
                }
                else
                {
                    DateTime.TryParse((string)value, out dateValue);
                }
                result = (T)Convert.ChangeType(dateValue, typeof(T));
            }
            else
                result = (T)Convert.ChangeType(value, typeof(T));
        }
    }
    catch
    {
        result = default(T);
    }
    return result;
}
3 голосов
/ 16 октября 2010

Свойство Excel.Range.Count сообщает, сколько ячеек находится в диапазоне.Например:

if (targetRange.Count > 1) 
{
   throw new ArgumentException(...);
}

Индексатор Excel.Range.Cells [,] возвращает все ячейки из первой области диапазона.Но обратите внимание, что Excel использует индексирование по основанию 1 (а не по основанию 0).Таким образом, чтобы получить доступ к верхней левой ячейке диапазона, вы можете использовать:

Excel.Range topLeftCell = (Excel.Range)targetRange.Cells[1,1];

Обратите внимание, что вы должны привести к Excel.Range выше, потому что индексатор Excel.Range.Cells [,] возвращаетобъект Excel.Range, приведенный как System.Object.

Также следует помнить, что свойство Excel.Range.Value будет возвращать атомарное значение, например double, string, boolean и т. д., когда диапазон состоит изотдельная клетка.Однако он вернет двумерный массив base 1, если первая область диапазона состоит из более чем одной ячейки.Например:

if (targetRange.Count = 1) 
{
   object myValue = targetRange.get_Value(Type.Missing);
   MessageBox.Show(myValue.ToString());
}
else
{
    object[,] myArray = targetRange.get_Value(Type.Missing);
    for(int row = 1; row <= myValue.GetLength(0); row++)
    {
        for(int column = 1; column <= myValue.GetLength(1); column++)
        {
            MessageBox.Show(myArray[row, column].ToString());
        }
    }
}

Надеюсь, это поможет!

Майк

...