Правильный разделитель для использования в Excel get_Range в VSTO

В проекте VSTO для Excel, написанном на C#, мне нужно получить объект Range из строкового списка ячеек.

Вот упрощенная версия проблемы:

string strRange = "A1:A2,A5";
Excel.Range r = sheet.get_Range(strRange);

Однако, поскольку разделитель списка может отличаться от запятой в разных настройках культуры, я фактически использую это:

listSep = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator;
string strRange = "A1:A2" + listSep + "A5";
Excel.Range r = sheet.get_Range(strRange);

Моя проблема заключается в том, что когда пользователь меняет «Десятичный разделитель» в «Параметры Excel»> «Дополнительно» (Application.DecimalSeparator), чтобы он соответствовал ListSeparator, это не сработает.

Как правильно вызвать get_Range со строкой, указывающей диапазон?

РЕДАКТИРОВАТЬ: небольшое изменение, чтобы добавить информацию о моем комментарии ниже.


person Gayan Dasanayake    schedule 24.09.2012    source источник
comment
Формат всегда должен быть Cell1:Cell2,Cell3 afaik — так работает API, и ListSeparator не должен влиять на него. Однако в этом ответе есть альтернативное предложение: stackoverflow.com/questions/6155182/   -  person dash    schedule 24.09.2012
comment
Когда ListSeperator в соответствии с CultureInfo имеет значение ',', а Application.DecimalSeparator также имеет значение ', разделитель, который будет использоваться, будет ';'. Но почему? где это задокументировано?   -  person Gayan Dasanayake    schedule 24.09.2012
comment
@dash: Нет, на get_Range(‹string›) влияют настройки культуры.   -  person Gayan Dasanayake    schedule 24.09.2012


Ответы (2)


Не самый чистый подход, но мне помог этот обходной путь:

private static string GetRangeSeparator(Excel.Worksheet sheet)
{
     Excel.Application app = sheet.Application;
     string sRng = app.Union(sheet.get_Range("A1"), sheet.get_Range("A3")).AddressLocal;
     sRng = sRng.Replace("$", string.Empty);
     string sSep = sRng.Substring(sRng.IndexOf("A3") - 1, 1);
     return sSep;
}

Надеюсь, это поможет кому-то.

person Gayan Dasanayake    schedule 09.10.2012

Вы можете рассмотреть возможность использования метода Application.Union для построения диапазона. Что-то вроде (не проверено):

Application.Union(sheet.get_Range("A1:A2"), sheet.get_Range("A5"));
person Joe    schedule 25.09.2012
comment
Да, это альтернатива/обходной путь. Но, как упоминалось в моем вопросе, проблема заключается в том, чтобы найти правильный разделитель для определения диапазона. Я не могу использовать Application.Union из-за его плохой производительности при огромных объемах данных. - person Gayan Dasanayake; 26.09.2012