Преобразование 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;
НТН