От столбца № до буквы столбца в Excel / VSTO с использованием C # - PullRequest
5 голосов
/ 26 марта 2010

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

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

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

Ответы [ 6 ]

5 голосов
/ 26 марта 2010
public static string GetColumnName(int columnNumber)
{
    const string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string columnName = "";

    while (columnNumber > 0)
    {
        columnName = letters[(columnNumber - 1) % 26] + columnName;
        columnNumber = (columnNumber - 1) / 26;
    }

    return columnName;
}
2 голосов
/ 30 марта 2010

Как насчет использования 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]));
1 голос
/ 19 февраля 2012
public static long GetColumnNumber(string columnName)
{
    int letterPos = 0;   
    long columnNumber = 0;
    for (int placeHolder = columnName.Length - 1; placeHolder >= 0; placeHolder--)
    {
        int currentSum = 1;
        for (int multiplier = 0; multiplier < placeHolder; multiplier++)
            currentSum *= 26;
        int letterValue = (int) columnName[letterPos];
        currentSum *= letterValue - 64;
        columnNumber += currentSum;
        if (letterPos != columnName.Length)
            letterPos++;
        //Console.WriteLine(((int)columnName[i]-64) + " = " + columnName[i]);
    }
        return columnNumber;
}
0 голосов
/ 29 июня 2016

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

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

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

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

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

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

0 голосов
/ 23 января 2014

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

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;
}
0 голосов
/ 15 апреля 2010

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

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;
    }
...