Преобразование Excel.Range в строку в C#

Используя библиотеки взаимодействия.NET Office, кто-нибудь знает лучший способ преобразования туда и обратно между строками (например, "A57", "$L$2:$M:$3") и соответствующими объектами типа Excel.Range?

Бонусные баллы, если он также работает с "именованными диапазонами".

4 ответа

Решение

Использовать Range свойство Worksheet объект и передать Type.Missing как второй параметр.

Например:

Range range = sheet.get_Range("$L$2:$M:$3", Type.Missing);

Это также поддерживает именованные диапазоны.

РЕДАКТИРОВАНИЕ

Чтобы получить string из Range:

/// <summary>
/// Extensions to the Range class.
/// </summary>
public static class RangeExtensions
{
    /// <summary>
    /// Returns the range as a string indicating its address.
    /// </summary>
    /// <param name="range">The range to convert to a string.</param>
    /// <returns>A string indicating the range's address.</returns>
    public static string ToAddressString(this Range range)
    {
        return range.Address[true, true, XlReferenceStyle.xlA1, false, null];
    }
}

Чтобы получить Range из string:

public class ExcelUtil
{
    /// <summary>
    /// Converts the given address string on the given sheet to a Range object.
    /// </summary>
    /// <param name="sheet">The worksheet.</param>
    /// <param name="addressString">The address string to convert.</param>
    /// <returns>The range.</returns>
    public static Range RangeFromAddresssString(Worksheet sheet, string addressString)
    {
        return sheet.Range[addressString];
    }
}

Второй метод может быть немного бесполезным, но я предпочитаю быть кристально чистым в названиях моих методов.

Как сказал SLaks, вы можете получить объект диапазона из строкового адреса с помощью таблицы Range собственность как worksheet.Range["A3:C30"], Второй аргумент может быть опущен в.NET 4.0. .get_Range() эквивалентно .Range[],

Чтобы пойти другим путем, используйте объекты диапазона Address свойство как это: range.Address,

Если вы пытаетесь получить фактическое содержимое ячейки, используйте свойство Value2. Вот некоторый код, который проверяет тип значения ячейки и соответственно делает разные вещи.

Excel.Range cell = (Excel.Range)sheet.UsedRange[row, col];
if (cell.Value2 != null)
{
    switch (Type.GetTypeCode(cell.Value2.GetType()))
    {
        case TypeCode.String:
            string formula = cell.Value2;
            break;
        case TypeCode.Double:
            double amt = (Double)cell.Value2;
            break;
    }
}

cell.Value2 = amt + someotheramt;

НТН

Другие вопросы по тегам