Как преобразовать номер столбца (например, 127) в столбец Excel (например, AA) - PullRequest
429 голосов
/ 08 октября 2008

Как преобразовать числовое число в имя столбца Excel в C # без автоматизации, получая значение непосредственно из Excel.

В Excel 2007 возможный диапазон от 1 до 16384, то есть число поддерживаемых столбцов. Результирующие значения должны быть в форме имен столбцов Excel, например, A, AA, AAA и т. Д.

Ответы [ 48 ]

0 голосов
/ 27 июля 2009

Другое решение:

private void Foo()
{
   l_ExcelApp = new Excel.ApplicationClass();
   l_ExcelApp.ReferenceStyle = Excel.XlReferenceStyle.xlR1C1;
   // ... now reference by R[row]C[column], Ex. A1 <==> R1C1, C6 <==> R3C6, ...
}

подробнее здесь - Ссылки на ячейки в Excel для всех! Доктор Нитин Паранджапе

0 голосов
/ 01 августа 2015

Реализация Objective-C:

-(NSString*)getColumnName:(int)n {
     NSString *name = @"";
     while (n>0) {
     n--;
     char c = (char)('A' + n%26);
     name = [NSString stringWithFormat:@"%c%@",c,name];
     n = n/26;
  }    
     return name;

}

SWIFT Реализация:

func getColumnName(n:Int)->String{
 var columnName = ""
 var index = n
 while index>0 {
     index--
     let char = Character(UnicodeScalar(65 + index%26))
     columnName = "\(char)\(columnName)"
     index = index / 26
 }
 return columnName

}

Ответ основан на: https://stackoverflow.com/a/4532562/2231118

0 голосов
/ 12 сентября 2017

Спасибо за ответы здесь !! помог мне придумать эти вспомогательные функции для некоторого взаимодействия с API Google Sheets, над которым я работаю в Elixir / Phoenix

вот что я придумал (возможно, мог бы использовать дополнительную проверку и обработку ошибок)

В эликсире:

def number_to_column(number) do
  cond do
    (number > 0 && number <= 26) ->
      to_string([(number + 64)])
    (number > 26) ->
      div_col = number_to_column(div(number - 1, 26))
      remainder = rem(number, 26)
      rem_col = cond do
        (remainder == 0) ->
          number_to_column(26)
        true ->
          number_to_column(remainder)
      end
      div_col <> rem_col
    true ->
      ""
  end
end

И обратная функция:

def column_to_number(column) do
  column
    |> to_charlist
    |> Enum.reverse
    |> Enum.with_index
    |> Enum.reduce(0, fn({char, idx}, acc) ->
      ((char - 64) * :math.pow(26,idx)) + acc
    end)
    |> round
end

И некоторые тесты:

describe "test excel functions" do
  @excelTestData [{"A", 1}, {"Z",26}, {"AA", 27}, {"AB", 28}, {"AZ", 52},{"BA", 53}, {"AAA", 703}]

  test "column to number" do
    Enum.each(@excelTestData, fn({input, expected_result}) ->
      actual_result = BulkOnboardingController.column_to_number(input)
      assert actual_result == expected_result
    end)
  end

  test "number to column" do
    Enum.each(@excelTestData, fn({expected_result, input}) ->
      actual_result = BulkOnboardingController.number_to_column(input)
      assert actual_result == expected_result
    end)
  end
end
0 голосов
/ 11 июня 2009

Использование этого в VB.Net 2005:

Private Function ColumnName(ByVal ColumnIndex As Integer) As String

   Dim Name As String = ""

   Name = (New Microsoft.Office.Interop.Owc11.Spreadsheet).Columns.Item(ColumnIndex).Address(False, False, Microsoft.Office.Interop.Owc11.XlReferenceStyle.xlA1)
   Name = Split(Name, ":")(0)

   Return Name

End Function
0 голосов
/ 24 апреля 2015

Изысканный и элегантный Рубин версия:

def col_name(col_idx)
    name = ""
    while col_idx>0
        mod     = (col_idx-1)%26
        name    = (65+mod).chr + name
        col_idx = ((col_idx-mod)/26).to_i
    end
    name
end
0 голосов
/ 18 июня 2015

Мне просто нужно было сделать эту работу сегодня, моя реализация использует рекурсию:

private static string GetColumnLetter(string colNumber)
{
    if (string.IsNullOrEmpty(colNumber))
    {
        throw new ArgumentNullException(colNumber);
    }

    string colName = String.Empty;

    try
    {
        var colNum = Convert.ToInt32(colNumber);
        var mod = colNum % 26;
        var div = Math.Floor((double)(colNum)/26);
        colName = ((div > 0) ? GetColumnLetter((div - 1).ToString()) : String.Empty) + Convert.ToChar(mod + 65);
    }
    finally
    {
        colName = colName == String.Empty ? "A" : colName;
    }

    return colName;
}

Считает число, идущее в виде строки, методом и числами, начинающимися с «0» (A = 0)

0 голосов
/ 29 октября 2018

Большинство предыдущих ответов верны. Вот еще один способ преобразования номера столбца в столбцы Excel. Решение довольно простое, если мы думаем об этом как о базовом преобразовании. Просто преобразуйте номер столбца в основание 26, поскольку в нем только 26 букв. Вот как вы можете сделать это:

шаги:

  • установить столбец как частное

  • вычтите одно из фактор-переменной (из предыдущего шага), потому что нам нужно в конечном итоге на таблицу ASCII с 97, являющимся.

  • разделите на 26 и получите остаток.

  • добавить +97 к остатку и преобразовать в char (поскольку 97 в таблице ASCII - "a")
  • частное становится новым частным / 26 (поскольку мы можем перейти через 26 столбец)
  • продолжайте делать это, пока частное не станет больше 0, а затем верните результат

вот код, который делает это:)

def convert_num_to_column(column_num):
    result = ""
    quotient = column_num
    remainder = 0
    while (quotient >0):
        quotient = quotient -1
        remainder = quotient%26
        result = chr(int(remainder)+97)+result
        quotient = int(quotient/26)
    return result

print("--",convert_num_to_column(1).upper())
0 голосов
/ 11 октября 2011

Вот как бы я это сделал на Python. Алгоритм объясняется ниже:

alph = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z')
def labelrec(n, res):
    if n<26:
        return alph[n]+res
    else:
        rem = n%26
        res = alph[rem]+res
        n = n/26-1
        return labelrec(n, res)

Функция labelrec может вызываться с номером и пустой строкой, например:

print labelrec(16383, '')

Вот почему это работает: Если бы десятичные числа были записаны так же, как столбцы таблицы Excel, числа 0-9 были бы записаны нормально, но 10 станет «00», а затем 20 станет «10» и так далее. Отображение нескольких чисел:

0 - 0

9 - 9

10 - 00

20 - 10

100 - 90

110 - 000

1110 - 0000

Итак, картина ясна. Начиная с места подразделения, если число меньше 10, его представление совпадает с самим числом, в противном случае вам нужно откорректировать оставшееся число, вычтя его на 1 и рекурсивно. Вы можете остановиться, когда число меньше 10.

Та же логика применяется для чисел с основанием 26 в приведенном выше решении.

P.S. Если вы хотите, чтобы числа начинались с 1, вызовите ту же функцию для входного номера после уменьшения ее на 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...