Номер столбца в букву столбца в Excel / VSTO с использованием C #

Как найти название или заголовок столбца?

Например, если я выбираю столбец 5 в Excel, это означает, что мне нужен результат как «E». Как получить алфавит или букву, соответствующую номеру столбца.

Пожалуйста, помогите мне с кодом


person venkat    schedule 26.03.2010    source источник


Ответы (6)


Как насчет использования Application.ActiveCell.get_Address(true, true, Excel.AlReferenceStyle.xlA1, missing, missing), а затем синтаксического анализа строки результата или использования RegEx для получения заголовка столбца?

Я просто использовал:

string location = Application.ActiveCell.get_Address(true, true, Excel.AlReferenceStyle.xlA1, missing, missing);
string tokens = x.Split("$".ToCharArray());
MessageBox.Show(String.Format("Column {0}", result[0]));
person Ahmad    schedule 30.03.2010
comment
Этот код неверен. Вот исправленная версия: var location = sheet.Range [A1] .Offset [0, columnNumber - 1] .Address [true, true, XlReferenceStyle.xlA1, Missing, Missing]; var tokens = location.Split ('$'); вернуть жетоны [1]; - person Phred Menyhert; 21.01.2012

Ниже приведен полный метод, который дает вам соответствующий алфавит для переданного целочисленного значения.

private String Number2String(int number, bool isCaps)
    {
        int number1 = number / 27;
        int number2 = number - (number1 * 26);
        if (number2 > 26)
        {
            number1 = number1 + 1;
            number2 = number - (number1 * 26);
        }
        Char a = (Char)((isCaps ? 65 : 97) + (number1 - 1));
        Char b = (Char)((isCaps ? 65 : 97) + (number2 - 1));
        Char c = (Char)((isCaps ? 65 : 97) + (number - 1));
        string d = String.Concat(a, b);
        if (number <= 26)
            return c.ToString();
        else
            return d;
    }
person SEVUDAS    schedule 15.04.2010

Я использую эти два:

public string GetExcelColumn(int index)
{
    int quotient = index / 26;

    if (quotient > 0)
        return GetExcelColumn(quotient - 1) + (char)((int)'A' + (index % 26));
    else
        return "" + (char)((int)'A' + index);
}

static IEnumerable<string> GetExcelColumns()
{
    var alphabet = new string[]{""}.Union(from c in Enumerable.Range((int)'A', 26) select Convert.ToString((char)c));

    return from c1 in alphabet
            from c2 in alphabet
            from c3 in alphabet.Skip(1)                    // c3 is never empty
            where c1 == string.Empty || c2 != string.Empty // only allow c2 to be empty if c1 is also empty
            select c1 + c2 + c3;
}
person Ian    schedule 22.01.2014

Это хорошо работает в VBA с использованием двойной замены, где R - это диапазон Excel с одной ячейкой:

ColumnLetter = Replace(Replace(R.AddressLocal(ReferenceStyle:=1), "$", vbNullString), R.Row, vbNullString) Он основан на аналогичной идее для использования на рабочем листе. В формуле клетки используйте это, это еще короче:

=SUBSTITUTE(ADDRESS(1,COLUMN(M1),4),1,"")

Это возвращает букву M и работает вплоть до столбца XFD. Ссылка на ячейку M1 может быть любым диапазоном в любом месте. Верхний левый столбец возвращается для диапазонов или более чем одной ячейки.

Он получает АДРЕС первой ячейки в столбце, а затем удаляет конечную 1, заменяя ее на NullString. (4 в АДРЕСЕ гарантирует, что адрес будет возвращен как относительный адрес, то есть без знаков и $ в нем.)

Спасибо Барри Гудини, который отправил меня на поиски хорошего ответа на этот вопрос.

person Neil Dunlop    schedule 29.06.2016

person    schedule
comment
хм .. а если столбцов больше 26? AA, AB, AC и т. Д. - person Ahmad; 30.03.2010
comment
извинения .. Я понял, что это работает .. stackoverflow.com/questions/181596/ - person Ahmad; 30.03.2010

person    schedule
comment
Этот метод работает правильно только тогда, когда columnName является строкой с заглавной буквы, по какой-то причине b не является B. Следовательно, требуется column.Name.ToUpper (). - person Jim; 18.08.2015