Как преобразовать номер столбца (например, 127) в столбец Excel (например, AA)

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

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


Вот как я это делаю:

  частная строка GetExcelColumnName (int columnNumber) {int  дивиденд = номер столбца;  строка columnName = String.Empty;  int по модулю;  while (дивиденд> 0) {по модулю = (дивиденд - 1)% 26;  columnName = Convert.ToChar (65 + по модулю) .ToString () + columnName;  делимое = (целое) ((делимое - по модулю)/26);  } return columnName;}  

Если кому-то нужно сделать это в Excel без VBA, здесь это способ:

  = ПОДСТАВИТЬ (АДРЕС (1; colNum; 4); "1"; "")  

где colNum — номер столбца

А в VBA:

  Функция GetColumnName (colNum As Integer) As String Dim d As Integer Dim m As Integer  Dim name As String d = colNum name = "" Do While (d> 0) m = (d - 1) Mod 26 name = Chr (65 + m) + name d = Int ((d - m)/26) Цикл  GetColumnName = nameEnd Функция  


Если кому-то нужно сделать это в Excel без VBA, здесь это способ:

  = ПОДСТАВИТЬ (АДРЕС (1; colNum; 4); "1"; "")  

где colNum — номер столбца

А в VBA:

  Функция GetColumnName (colNum As Integer) As String Dim d As Integer Dim m As Integer  Тусклое имя как строка d = colNum name = ""  Do While (d> 0) m = (d - 1) Mod 26 name = Chr (65 + m) + name d = Int ((d - m)/26) Цикл GetColumnName = nameEnd Function  

Извините, это Python вместо C #, но, по крайней мере, результаты верны:

  def ColIdxToXlName (idx): if idx  26: idx, r = divmod (idx - 1,  26) result = chr (r + ord ('A')) + result else: return chr (idx + ord ('A') - 1) + resultfor i in xrange (1, 1024): print "% 4d:%  s "% (i, ColIdxToXlName (i))  


Извините, это Python вместо C #, но, по крайней мере, результаты верны:

  def ColIdxToXlName (idx): if idx  26: idx, r = divmod (idx - 1, 26) result = chr (r + ord ('A')) + result else: return chr (idx + ord ('A') -  1) + re  sultfor i в xrange (1, 1024): print "% 4d:% s"% (i, ColIdxToXlName (i))  

Вам может потребоваться преобразование в обе стороны, e. g из адреса столбца Excel, например AAZ, в целое число и из любого целого числа в Excel. Два метода ниже сделают это. Предполагается, что индексирование на основе 1, первый элемент в ваших «массивах» — это элемент номер 1. Никаких ограничений по размеру здесь нет, поэтому вы можете использовать такие адреса, как ERROR, и это будет столбец с номером 2613824 …

  общедоступная статическая строка ColumnAdress (int col) {if (col  = 0; --pos) {res + = digits [pos] * mul;  mul * = 26;  } return res;}  


Вам может потребоваться преобразование в обоих направлениях, например, из столбца Excel адрес как AAZ к целому числу и от любого целого к Excel. Два метода ниже сделают это. Предполагается, что индексирование на основе 1, первый элемент в ваших «массивах» — это элемент номер 1. Никаких ограничений по размеру здесь нет, поэтому вы можете использовать такие адреса, как ERROR, и это будет столбец с номером 2613824 …

  общедоступная статическая строка ColumnAdress (int col) {if (col  = 0; --pos) {res + = digits [pos] * mul;  mul * = 26;  } return res;}  

Я обнаружил ошибку в своем первом посте, поэтому решил сесть и посчитать. Я обнаружил, что система счисления, используемая для идентификации столбцов Excel, не является системой с основанием 26, как писал другой человек. Учтите следующее в базе 10. Вы также можете сделать это с буквами алфавита.

Пробел: ……………….. ….. S1, S2, S3: S1, S2, S3
……………………….. ……. 0, 00, 000: .. A, AA, AAA
……………………. ……….. 1, 01, 001: .. B, AB, AAB
………………… ………………,…,…: ..…,…,…
…………….. ………………. 9, 99, 999: .. Z, ZZ, ZZZ
Всего состояний в пространстве: 10, 100, 1000: 26, 676, 17576
Всего состояний: …………… 1110 ……………. 18278

Excel нумерует столбцы в отдельных алфавитных пространствах, используя основание 26. Вы можете видеть, что в целом прогрессия в пространстве состояний равна a, a ^ 2, a ^ 3, … для некоторой базы a, а общее количество состояний равно а + а ^ 2 + а ^ 3 +….

Предположим, вы хотите найти общее количество состояний A в первых N пробелах. Формула для этого: A = (a) (a ^ N — 1)/(a-1). Это важно, потому что нам нужно найти пространство N, которое соответствует нашему индексу K. Если я хочу выяснить, где находится K в системе счисления, мне нужно заменить A на K и решить для N. Решение: N = log { основание a} (A (a-1)/a +1). Если я использую пример a = 10 и K = 192, я знаю, что N = 2,23804…. Это говорит мне, что K находится в начале третьего пространства, так как он немного больше двух.

Следующий шаг — точно определить, как далеко мы находимся в текущем пространстве. Чтобы найти это, вычтите из K значение A, полученное с использованием минимального значения N. В этом примере минимальное значение N равно двум. Итак, A = (10) (10 ^ 2-1)/(10-1) = 110, как и ожидалось, когда вы объединяете состояния первых двух пробелов. Это необходимо вычесть из K, потому что эти первые 110 состояний уже были учтены в первых двух пространствах. Остается 82 государства. Итак, в этой системе счисления 192 в базе 10 представляет собой 082.

Код C # с нулевым базовым индексом —

   частная строка ExcelColumnIndexToName (int Index) {диапазон строк = строка.Empty;  if (Индекс  0; i--) {range = ((char) (65 + Index% a)). ToString () + диапазон;  Индекс/= а;  } диапазон возврата;  }  

//Старый пост

Решение с отсчетом от нуля на C #.

  private  строка ExcelColumnIndexToName (int Index) {диапазон строк = "";  if (Индекс  0; i = 0) {range = ((char) (65 + Index% 26)). ToString () + диапазон;  Индекс/= 26;  } if (range.Length> 1) range = ((char) ((int) range [0] - 1)). ToString () + range.Substring (1);  диапазон возврата;  }  


Я обнаружил ошибку в своем первом посте, поэтому решил сесть и сделай математику. Я обнаружил, что система счисления, используемая для идентификации столбцов Excel, не является системой с основанием 26, как писал другой человек. Рассмотрим следующее в базе 10. Вы также можете сделать это с буквами алфавита.

Пробел: ……………….. ….. S1, S2, S3: S1, S2, S3
……………………….. ……. 0, 00, 000: .. A, AA, AAA
……………………. ……….. 1, 01, 001: .. B, AB, AAB
………………… ………………,…,…: ..…,…,…
…………….. ………………. 9, 99, 999: .. Z, ZZ, ZZZ
Всего состояний в пространстве: 10, 100, 1000: 26, 676, 17576
Всего состояний: …………… 1110 ……………. 18278

Excel нумерует столбцы в отдельных алфавитных пространствах с использованием базы 26. Вы можете видеть, что в общем случае прогрессия в пространстве состояний равна a, a ^ 2, a ^ 3,… для некоторого основания a, а общее количество состояний равно a + a ^ 2 + a ^ 3 +….

Предположим, вы хотите найти общее количество состояний A в первых N пробелах. Формула для этого: A = (a) (a ^ N — 1)/(a-1). Это важно, потому что нам нужно найти пространство N, которое соответствует нашему индексу K. Если я хочу выяснить, где находится K в системе счисления, мне нужно заменить A на K и решить для N. Решение: N = log { основание a} (A (a-1)/a +1). Если я использую пример a = 10 и K = 192, я знаю, что N = 2,23804…. Это говорит мне, что K находится в начале третьего пространства, так как он немного больше двух.

Следующий шаг — точно определить, как далеко мы находимся в текущем пространстве. Чтобы найти это, вычтите из K значение A, полученное с использованием минимального значения N. В этом примере минимальное значение N равно двум. Итак, A = (10) (10 ^ 2-1)/(10-1) = 110, как и ожидалось, когда вы объединяете состояния первых двух пробелов. Это необходимо вычесть из K, потому что эти первые 110 состояний уже были учтены в первых двух пространствах. Остается 82 государства. Итак, в этой системе счисления 192 в базе 10 представляет собой 082.

Код C # с нулевым базовым индексом —

   частная строка ExcelColumnIndexToName (int Index) {диапазон строк = строка.Empty;  if (Индекс  0; i--) {range = ((char) (65 + Index% a)). ToString () + диапазон;  Индекс/= а;  } диапазон возврата;  }  

//Старый пост

Решение с отсчетом от нуля на C #.

  private  строка ExcelColumnIndexToName (int Index) {диапазон строк = "";  if (Индекс  0; i = 0) {range = ((char) (65 + Index% 26)). ToString () + диапазон;  Индекс/= 26;  } if (range.Length> 1) range = ((char) ((int) range [0] - 1)). ToString () + range.Substring (1);  диапазон возврата;  }  

Этот ответ на javaScript:

  функция getCharFromNumber (columnNumber) {var dividnd = columnNumber;  var columnName = "";  var по модулю;  while (дивиденд> 0) {по модулю = (дивиденд - 1)% 26;  columnName = String.fromCharCode (65 + по модулю) .toString () + columnName;  дивиденд = parseInt ((делимое - по модулю)/26);  } return columnName;}  


Этот ответ на javaScript:

  функция getCharFromNumber (columnNumber) {var dividnd = columnNumber;  var columnName = "";  var по модулю;  while (дивиденд> 0) {по модулю = (дивиденд - 1)% 26;  columnName = String.fromCharCode (65 + по модулю). toString () + columnName;  дивиденд = parseInt ((делимое - по модулю)/26);  } return columnName;}  

  int nCol = 127; string sChars  = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; строка sCol = ""; в то время как (nCol> = 26) {int nChar = nCol% 26;  nCol = (nCol - nChar)/26; //Вы могли бы проделать трюк, используя nChar как смещение от 'A', но мне лень делать это прямо сейчас.  sCol = sChars [nChar] + sCol;} sCol = sChars [nCol] + sCol;  

Обновление : комментарий Питера правильный. Вот что я получаю за написание кода в браузере. 🙂 Мое решение не компилировалось, в нем отсутствовала крайняя левая буква, и оно строило строку в обратном порядке — теперь все исправлено.

Ошибки в стороне, алгоритм в основном преобразовывает число от основания 10 до основания 26.

Обновление 2 : Джоэл Кохорн прав — приведенный выше код вернет AB для 27. Если это было действительное число с основанием 26, AA будет равно A, а следующее число после Z будет BA.

  int nCol = 127; string sChars = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ"; string sCol = ""; while (  nCol> 26) {int nChar = nCol% 26;  если (nChar == 0) nChar = 26;  nCol = (nCol - nChar)/26;  sCol = sChars [nChar] + sCol;} if (nCol! = 0) sCol = sChars [nCol] + sCol;  


  int nCol = 127; string sChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; string sCol = ""; while (nCol> = 26) {int nChar = nCol% 26;  nCol = (nCol - nChar)/26; //Вы могли бы проделать трюк, используя nChar как смещение от 'A', но мне лень делать это прямо сейчас.  sCol = sChars [nChar] + sCol;} sCol = sChars [nCol] + sCol;  

Обновление : комментарий Питера правильный. Вот что я получаю за написание кода в браузере. 🙂 Мое решение не компилировалось, в нем отсутствовала крайняя левая буква, и оно строило строку в обратном порядке — теперь все исправлено.

Ошибки в стороне, алгоритм в основном преобразовывает число от основания 10 до основания 26.

Обновление 2 : Джоэл Кохорн прав — приведенный выше код вернет AB для 27. Если это было действительное число с основанием 26, AA будет равно A, а следующее число после Z будет BA.

  int nCol = 127; string sChars = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ"; string sCol = ""; while (  nCol> 26) {int nChar = nCol% 26;  если (nChar == 0) nChar = 26;  nCol = (nCol - nChar)/26;  sCol = sChars [nChar] + sCol;} if (nCol! = 0) sCol = sChars [nCol] + sCol;  

Легко с рекурсией.

  общедоступная статическая строка GetStandardExcelColumnName (int columnNumberOneBased) {int baseValue = Convert. ToInt32 ('А');  int columnNumberZeroBased = columnNumberOneBased - 1;  строка ret = "";  если (columnNumberOneBased> 26) {ret = GetStandardExcelColumnName (columnNumberZeroBased/26);  } return ret + Convert.ToChar (baseValue + (columnNumberZeroBased% 26));}  


Легко с рекурсией.

  общедоступная статическая строка GetStandardExcelColumnName (int columnNumberOneBased) {int baseValue = Convert.ToInt32 ('A');  int columnNumberZeroBased = columnNumberOneBased - 1;  строка ret = "";  если (columnNumberOneBased> 26) {ret = GetStandardExcelColumnName (columnNumberZeroBased/26);  } return ret + Convert.ToChar (baseValue + (columnNumberZeroBased% 26));}  

Просто добавьте простую двухстрочную реализацию C # с использованием рекурсии, потому что все ответы здесь кажутся намного более сложными, чем необходимо.

 //////Получает  буква (буквы) столбца, соответствующие заданному номеру столбца .////// Индекс столбца, отсчитываемый от единицы.  Должно быть больше нуля. /// Желаемая буква столбца или пустая строка, если номер столбца был недопустимым.  общедоступная статическая строка GetColumnLetter (int column) {if (column  


Просто добавим простую двухстрочную реализацию C # с использованием рекурсии, потому что все ответы здесь кажутся гораздо более сложными, чем необходимо.

 //////Получает букву (буквы) столбца, соответствующие заданному номеру столбца.////// Индекс столбца, отсчитываемый от единицы  .  Должно быть больше нуля. /// Желаемая буква столбца или пустая строка, если номер столбца был недопустимым.  общедоступная статическая строка GetColumnLetter (int column) {if (column  

.. И преобразовал в php:

  function GetExcelColumnName ($ columnNumber) {$ columnName = '';  while ($ columnNumber> 0) {$ modulo = ($ columnNumber - 1)% 26;  $ columnName = chr (65 + $ по модулю).  $ columnName;  $ columnNumber = (int) (($ columnNumber - $ modulo)/26);  } return $ columnName;}  


.. И преобразовал в php:

  function GetExcelColumnName ($ columnNumber) {$ columnName = '';  while ($ columnNumber> 0) {$ modulo = ($ columnNumber - 1)% 26;  $ columnName = chr (65 + $ по модулю).  $ columnName;  $ columnNumber = (int) (($ columnNumber - $ modulo)/26);  } return $ columnName;}  

Я удивлен, что все решения до сих пор содержат либо итерация, либо рекурсия.

Вот мое решение, которое работает в постоянное время (без циклов). Это решение работает для всех возможных столбцов Excel и проверяет, можно ли преобразовать ввод в столбец Excel. Возможные столбцы находятся в диапазоне [A, XFD] или [1, 16384]. (Это зависит от вашей версии Excel)

  частная статическая строка Turn (uint col) {if (col  16384)//Столбцы Excel являются одним  -based (one = 'A') генерировать новое исключение ArgumentException ("col должно быть> = 1 и  


Я удивлен, что все решения пока содержат либо итерацию, либо рекурсия.

Вот мое решение, которое работает в постоянное время (без циклов). Это решение работает для всех возможных столбцов Excel и проверяет, можно ли преобразовать ввод в столбец Excel. Возможные столбцы находятся в диапазоне [A, XFD] или [1, 16384]. (Это зависит от вашей версии Excel)

  частная статическая строка Turn (uint col) {if (col  16384)//Столбцы Excel являются одним  -based (one = 'A') генерировать новое исключение ArgumentException ("col должно быть> = 1 и  

Та же реализация в Java

  общедоступная строка getExcelColumnName (int columnNumber) {int divnd = columnNumber;  int i;  Строка columnName = "";  int по модулю;  while (дивиденд> 0) {по модулю = (дивиденд - 1)% 26;  я = 65 + по модулю;  columnName = новый символ ((char) i) .toString () + columnName;  делимое = (целое) ((делимое - по модулю)/26);  } return columnName;  }  


Та же реализация в Java

  общедоступная строка getExcelColumnName (int columnNumber) {int divnd = columnNumber;  int i;  Строка columnName = "";  int по модулю;  while (дивиденд> 0) {по модулю = (дивиденд - 1)% 26;  я = 65 + по модулю;  columnName = новый символ ((char) i) .toString () + columnName;  делимое = (целое) ((делимое - по модулю)/26);  } return columnName;  }  

После просмотра всех представленных здесь версий, я решил сделать одну сам, с использованием рекурсии.

Вот моя версия vb.net:

  Функция CL (ByVal x As Integer) As String If x> = 1 And  x  


После просмотра всех представленных здесь версий, я решил сделать одну самостоятельно, используя рекурсию.

Вот моя версия vb.net:

  Функция CL (ByVal x как целое число) как строка, если x> = 1 и x  

Я хотел добавить свой статический класс, который я использую, для взаимодействия между индексом col и меткой col. Я использую измененный принятый ответ для моего метода ColumnLabel

  Public static class Extensions {public static string ColumnLabel (this int col) {var Divivnd = col;  var columnLabel = string.Empty;  int по модулю;  while (дивиденд> 0) {по модулю = (дивиденд - 1)% 26;  columnLabel = Convert.ToChar (65 + по модулю) .ToString () + columnLabel;  делимое = (целое) ((делимое - по модулю)/26);  } return columnLabel;  } public static int ColumnIndex (это строка colLabel) {//«AD» (1 * 26 ^ 1) + (4 * 26 ^ 0) ... var colIndex = 0;  for (int ind = 0, pow = colLabel.Count () - 1; ind  

Используйте это как …

  30.ColumnLabel (); //"ОБЪЯВЛЕНИЕ" "ОБЪЯВЛЕНИЕ" .ColumnIndex (); //30  


Я хотел добавить свой статический класс, который я использую, для взаимодействия между индексом столбца и меткой столбца. Я использую измененный принятый ответ для моего метода ColumnLabel

  Public static class Extensions {public static string ColumnLabel (this int col) {var Divivnd = col;  var columnLabel = string.Empty;  int по модулю;  while (дивиденд> 0) {по модулю = (дивиденд - 1)% 26;  columnLabel = Convert.ToChar (65 + по модулю) .ToString () + columnLabel;  делимое = (целое) ((делимое - по модулю)/26);  } return columnLabel;  } public static int ColumnIndex (это строка colLabel) {//«AD» (1 * 26 ^ 1) + (4 * 26 ^ 0) ... var colIndex = 0;  for (int ind = 0, pow = colLabel.Count () - 1; ind  

Используйте это как …

  30.ColumnLabel (); //"ОБЪЯВЛЕНИЕ" "ОБЪЯВЛЕНИЕ". ColumnIndex (); //30  

, если вам просто нужна формула ячейки без кода, вот формула для него:

  IF (COLUMN ()> = 26, CHAR (ROUND (COLUMN ()/26,1) +64) & CHAR (MOD (COLUMN (),  26) +64), CHAR (COLUMN () + 64))  


если вам просто нужна формула ячейки без кода, вот формула для нее:

  IF (COLUMN ()> = 26, CHAR (ROUND (COLUMN ()/26,  1) +64) & CHAR (MOD (COLUMN (), 26) +64), CHAR (COLUMN () + 64))  

В Delphi (Pascal):

  function GetExcelColumnName (columnNumber: integer): string; var делимое, modulo: integer; begin Результат  знак равно  делимое: = номер столбца;  в то время как делимое> 0 начинать по модулю: = (делимое - 1) по модулю 26;  Результат: = Chr (65 + по модулю) + Результат;  делимое: = (делимое - по модулю) div 26;  конец; конец;  


В Delphi (Паскаль):

  function GetExcelColumnName (columnNumber: integer): string; var divid, modulo: integer; begin Result: = '';  делимое: = номер столбца;  в то время как делимое> 0 начинать по модулю: = (делимое - 1) по модулю 26;  Результат: = Chr (65 + по модулю) + Результат;  делимое: = (делимое - по модулю) div 26;  end; end;  

Немного поздно в игре, но вот код, который я использую (в C #):

  private static readonly string _Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static int ColumnNameParse (строковое значение) {//предполагает значение. Длина [1,3] //предполагается, что значение является прописным var digits = value.PadLeft (3) .Select (x => _Alphabet.IndexOf (x));  return digits.Aggregate (0, (current, index) => (current * 26) + (index + 1));}  


Немного поздно в игре, но вот код, который я использую (на C #):

  private static readonly string _Alphabet =  "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static int ColumnNameParse (строковое значение) {//принимает значение. Длина составляет [1,3]//предполагает значение верхнего регистра var digits = value.PadLeft (3) .Select (x => _Alphabet.IndexOf (  Икс));  return digits.Aggregate (0, (current, index) => (current * 26) + (index + 1));}  

  private String getColumn (int c) {String s = "";  сделать {s = (char) ('A' + (c% 26)) + s;  с/= 26;  } while (c--> 0);  return s;}  

Это не совсем основание 26, в системе нет 0. Если бы он был, после «Z» следовало бы «BA», а не «AA»..


  private String getColumn (int c) {String s = "";  сделать {s = (char) ('A' + (c% 26)) + s;  с/= 26;  } while (c--> 0);  return s;}  

Это не совсем основание 26, в системе нет 0. Если бы это было, за ‘Z’ следовало бы ‘BA’, а не ‘AA’.


В perl, для ввода 1 (A), 27 (AA) и т. д.

  sub excel_colname {my ($ idx) = @_;  # номер столбца, отсчитываемый от единицы - $ idx;  # отсчитываемый от нуля индекс столбца my $ name = "";  while ($ idx> = 0) {$ name. = chr (ord ("A") + ($ idx% 26));  $ idx = int ($ idx/26) - 1;  } вернуть скалярное обратное $ name;}  


В perl, для ввода 1 (A), 27 (AA) и т. Д.

  sub excel_colname {my ($ idx) = @_;  # номер столбца, отсчитываемый от единицы - $ idx;  # отсчитываемый от нуля индекс столбца my $ name = "";  while ($ idx> = 0) {$ name. = chr (ord ("A") + ($ idx% 26));  $ idx = int ($ idx/26) - 1;  } return скалярное обратное $ name;}  

Уточнение исходного решения (на C #):

  открытый статический класс ExcelHelper {частный статический словарь  l_DictionaryOfColumns;  общедоступный статический ExcelHelper () {l_DictionaryOfColumns = new Dictionary  (256);  } общедоступная статическая строка GetExcelColumnName (UInt16 l_Column) {UInt16 l_ColumnCopy = l_Column;  Строка l_Chars = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ";  Строка l_rVal = "";  UInt16 l_Char;  если (l_DictionaryOfColumns.ContainsKey (l_Column) == true) {l_rVal = l_DictionaryOfColumns [l_Column];  } else {while (l_ColumnCopy> 26) {l_Char = l_ColumnCopy% 26;  если (l_Char == 0) l_Char = 26;  l_ColumnCopy = (l_ColumnCopy - l_Char)/26;  l_rVal = l_Char [l_Char] + l_rVal;  } если (l_ColumnCopy! = 0) l_rVal = l_Chars [l_ColumnCopy] + l_rVal;  l_DictionaryOfColumns.ContainsKey (l_Column) = l_rVal;  } return l_rVal;  }}  


Уточнение исходного решения (на C #):

  открытый статический класс ExcelHelper {частный статический словарь  l_DictionaryOfColumns;  общедоступный статический ExcelHelper () {l_DictionaryOfColumns = new Dictionary  (256);  } общедоступная статическая строка GetExcelColumnName (UInt16 l_Column) {UInt16 l_ColumnCopy = l_Column;  Строка l_Chars = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ";  Строка l_rVal = "";  UInt16 l_Char;  если (l_DictionaryOfColumns. ContainsKey (l_Column) == true) {l_rVal = l_DictionaryOfColumns [l_Column];  } else {while (l_ColumnCopy> 26) {l_Char = l_ColumnCopy% 26;  если (l_Char == 0) l_Char = 26;  l_ColumnCopy = (l_ColumnCopy - l_Char)/26;  l_rVal = l_Char [l_Char] + l_rVal;  } если (l_ColumnCopy! = 0) l_rVal = l_Chars [l_ColumnCopy] + l_rVal;  l_DictionaryOfColumns.ContainsKey (l_Column) = l_rVal;  } return l_rVal;  }}  

Вот версия ActionScript:

   private var columnNumbers: Array = ['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»];  частная функция getExcelColumnName (columnNumber: int): String {var Dividnd: int = columnNumber;  var columnName: String = "";  var по модулю: int;  while (дивиденд> 0) {по модулю = (дивиденд - 1)% 26;  columnName = columnNumbers [по модулю] + columnName;  делимое = int ((делимое - по модулю)/26);  } return columnName;  }  


Вот версия ActionScript:

   private var columnNumbers: Array = ['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»];  частная функция getExcelColumnName (columnNumber: int): String {var Dividnd: int = columnNumber;  var columnName: String = "";  var по модулю: int;  while (дивиденд> 0) {по модулю = (дивиденд - 1)% 26;  columnName = columnNumbers [по модулю] + columnName;  делимое = int ((делимое - по модулю)/26);  } return columnName;  }  

Решение JavaScript

 /** * Вычислить аббревиатуру буквы столбца из индекса на основе 1 * @param {Number} value * @returns {string} */getColumnFromIndex = function (value) {var base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ  '.Трещина('');  var остаток, результат = "";  сделать {остаток = значение% 26;  результат = база [(остаток || 26) - 1] + результат;  значение = Math.floor (значение/26);  } while (значение> 0);  return result;};  


Решение JavaScript

 /** * Вычислить аббревиатуру буквы столбца по индексу, основанному на 1 * @param {Number} значение * @returns {string} */getColumnFromIndex = function (value) {  var base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. Трещина('');  var остаток, результат = "";  сделать {остаток = значение% 26;  результат = база [(остаток || 26) - 1] + результат;  значение = Math.floor (значение/26);  } while (значение> 0);  return result;};  

Эти мои коды для преобразования определенного числа (начало индекса с 1 ) в столбец Excel.

  общедоступная статическая строка NumberToExcelColumn (uint number) {uint originalNumber = number;  uint numChars = 1;  в то время как (Math.Pow (26, numChars)  = число) {перерыв;  }} строка toRet = "";  uint lastValue = 0;  сделать {число - = lastValue;  double powerVal = Math.Pow (26, numChars - 1);  byte thisCharIdx = (byte) Math.Truncate ((columnNumber - 1)/powerVal);  lastValue = (int) powerVal * thisCharIdx;  если (numChars - 2> = 0) {double powerVal_next = Math.Pow (26, numChars - 2);  byte thisCharIdx_next = (byte) Math.Truncate ((columnNumber - lastValue - 1)/powerVal_next);  int lastValue_next = (int) Math.Pow (26, numChars - 2) * thisCharIdx_next;  если (thisCharIdx_next == 0 && lastValue_next == 0 && powerVal_next == 26) {thisCharIdx--;  lastValue = (int) powerVal * thisCharIdx;  }} toRet + = (char) ((байт) 'A' + thisCharIdx + ((numChars> 1)? -1: 0));  numChars--;  } while (numChars> 0);  return toRet;  }  

Мой модульный тест:

  [TestMethod] public void Test () {Assert.AreEqual ("A", NumberToExcelColumn  (1));  Assert.AreEqual ("Z", NumberToExcelColumn (26));  Assert.AreEqual («AA», NumberToExcelColumn (27));  Assert.AreEqual («АО», NumberToExcelColumn (41));  Assert.AreEqual ("А-Я", NumberToExcelColumn (52));  Assert.AreEqual («BA», NumberToExcelColumn (53));  Assert.AreEqual ("ZZ", NumberToExcelColumn (702));  Assert.AreEqual («AAA», NumberToExcelColumn (703));  Assert.AreEqual («ABC», NumberToExcelColumn (731));  Assert.AreEqual («ACQ», NumberToExcelColumn (771));  Assert.AreEqual («AYZ», NumberToExcelColumn (1352));  Assert.AreEqual ("АЗА", NumberToExcelColumn (1353));  Assert.AreEqual ("AZB", NumberToExcelColumn (1354));  Assert.AreEqual («BAA», NumberToExcelColumn (1379));  Assert.AreEqual ("CNU", NumberToExcelColumn (2413));  Assert.AreEqual ("GCM", NumberToExcelColumn (4823));  Assert.AreEqual ("MSR", NumberToExcelColumn (9300));  Assert.AreEqual («OMB», NumberToExcelColumn (10480));  Assert.AreEqual ("ULV", NumberToExcelColumn (14530));  Assert.AreEqual ("XFD", NumberToExcelColumn (16384));  }  


Эти мои коды для преобразования определенного числа (начало индекса с 1) в Excel Столбец.

  общедоступная статическая строка NumberToExcelColumn (uint number) {uint originalNumber = number;  uint numChars = 1;  в то время как (Math.Pow (26, numChars)  = число) {перерыв;  }} строка toRet = "";  uint lastValue = 0;  сделать {число - = lastValue;  double powerVal = Math.Pow (26, numChars - 1);  byte thisCharIdx = (byte) Math.Truncate ((columnNumber - 1)/powerVal);  lastValue = (int) powerVal * thisCharIdx;  если (numChars - 2> = 0) {double powerVal_next = Math.Pow (26, numChars - 2);  byte thisCharIdx_next = (byte) Math.Truncate ((columnNumber - lastValue - 1)/powerVal_next);  int lastValue_next = (int) Math.Pow (26, numChars - 2) * thisCharIdx_next;  если (thisCharIdx_next == 0 && lastValue_next == 0 && powerVal_next == 26) {thisCharIdx--;  lastValue = (int) powerVal * thisCharIdx;  }} toRet + = (char) ((байт) 'A' + thisCharIdx + ((numChars> 1)? -1: 0));  numChars--;  } while (numChars> 0);  return toRet;  }  

Мой модульный тест:

  [TestMethod] public void Test () {Assert.AreEqual ("A", NumberToExcelColumn  (1));  Assert.AreEqual ("Z", NumberToExcelColumn (26));  Assert.AreEqual («AA», NumberToExcelColumn (27));  Assert.AreEqual («АО», NumberToExcelColumn (41));  Assert.AreEqual ("А-Я", NumberToExcelColumn (52));  Assert.AreEqual («BA», NumberToExcelColumn (53));  Assert.AreEqual ("ZZ", NumberToExcelColumn (702));  Assert.AreEqual («AAA», NumberToExcelColumn (703));  Assert.AreEqual («ABC», NumberToExcelColumn (731));  Assert.AreEqual («ACQ», NumberToExcelColumn (771));  Assert.AreEqual («AYZ», NumberToExcelColumn (1352));  Assert.AreEqual ("АЗА", NumberToExcelColumn (1353));  Assert.AreEqual ("AZB", NumberToExcelColumn (1354));  Assert.AreEqual («BAA», NumberToExcelColumn (1379));  Assert.AreEqual ("CNU", NumberToExcelColumn (2413));  Assert.AreEqual ("GCM", NumberToExcelColumn (4823));  Assert.AreEqual ("MSR", NumberToExcelColumn (9300));  Assert.AreEqual («OMB», NumberToExcelColumn (10480));  Assert.AreEqual ("ULV", NumberToExcelColumn (14530));  Assert.AreEqual ("XFD", NumberToExcelColumn (16384));  }  

Хотя я опаздываю в игру, ответ Грэма далек от оптимального. В частности, вам не нужно использовать modulo , вызывать ToString () и применять приведение (int) . Учитывая, что в большинстве случаев в мире C # вы начинаете нумерацию с 0, вот моя редакция:

  общедоступная статическая строка GetColumnName (int index)//отсчитываемая от нуля {const byte  БАЗА = 'Z' - 'A' + 1;  имя строки = String.Empty;  сделать {имя = Convert.ToChar ('A' + индекс% BASE) + имя;  index = index/BASE - 1;  } while (индекс> = 0);  return name;}  


Хотя я опаздываю в игру, ответ Грэма далек от оптимального. В частности, вам не нужно использовать modulo , вызывать ToString () и применять приведение (int) . Учитывая, что в большинстве случаев в мире C # вы начинаете нумерацию с 0, вот моя редакция:

  общедоступная статическая строка GetColumnName (int index)//отсчитываемая от нуля {const byte  БАЗА = 'Z' - 'A' + 1;  имя строки = String.Empty;  сделать {имя = Convert.ToChar ('A' + индекс% BASE) + имя;  index = index/BASE - 1;  } while (индекс> = 0);  return name;}  

Другой способ VBA

  Открытая функция GetColumnName (TargetCell As Range) As String GetColumnName = Split (CStr (TargetCell.Cells (1, 1) .Address), «$») (1) Конечная функция  


Другой способ VBA

  Открытая функция GetColumnName (TargetCell As Range)  Как String GetColumnName = Split (CStr (TargetCell.Cells (1, 1) .Address), «$») (1) Конечная функция  

Вот моя сверхпоздняя реализация на PHP. Этот рекурсивный. Я написал это незадолго до того, как нашел этот пост. Я хотел узнать, решили ли другие уже эту проблему …

  общедоступная функция GetColumn ($ intNumber, $ strCol = null) {if ($ intNumber> 0) {$  intRem = ($ intNumber - 1)% 26;  $ strCol = $ this-> GetColumn (intval (($ intNumber - $ intRem)/26), sprintf ('% s% s', chr (65 + $ intRem), $ strCol));  } return $ strCol;}  


Вот моя супер поздняя реализация на PHP. Этот рекурсивный. Я написал это незадолго до того, как нашел этот пост. Я хотел узнать, решили ли другие уже эту проблему …

  общедоступная функция GetColumn ($ intNumber, $ strCol = null) {if ($ intNumber> 0) {$  intRem = ($ intNumber - 1)% 26;  $ strCol = $ this-> GetColumn (intval (($ intNumber - $ intRem)/26), sprintf ('% s% s', chr (65 + $ intRem), $ strCol));  } return $ strCol;}  

Я пытаюсь сделать то же самое в Java … Я написал следующий код:

  private String getExcelColumnName (int columnNumber) {int divernd = columnNumber;  Строка columnName = "";  int по модулю;  while (дивиденд> 0) {по модулю = (дивиденд - 1)% 26;  char val = Character.valueOf ((char) (65 + по модулю));  columnName + = val;  делимое = (целое) ((делимое - по модулю)/26);  } return columnName;}  

Теперь, когда я запустил его с columnNumber = 29, он дает мне result = «CA» (вместо «AC») любые комментарии, что я Я знаю, что могу отменить его с помощью StringBuilder …. Но, глядя на ответ Грэма, я немного смущен ….


Я пытаюсь сделать то же самое на Java … Я написал следующий код :

  private String getExcelColumnName (int columnNumber) {int divnd = columnNumber;  Строка columnName = "";  int по модулю;  while (дивиденд> 0) {по модулю = (дивиденд - 1)% 26;  char val = Character.valueOf ((char) (65 + по модулю));  columnName + = val;  делимое = (целое) ((делимое - по модулю)/26);  } return columnName;}  

Теперь, когда я запустил его с columnNumber = 29, он дает мне result = «CA» (вместо «AC») любые комментарии, что я Я знаю, что могу отменить его с помощью StringBuilder …. Но, глядя на ответ Грэма, я немного запутался ….


Идеальная и элегантная версия Ruby :

  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 nameend  


Идеальная и элегантная версия Ruby :

  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 nameend  

Это вопрос, на который все остальные, а также Google перенаправляют, поэтому я публикую его здесь.

Многие из этих ответов верны, но слишком громоздки для простых ситуаций, например, когда у вас не более 26 столбцов. Если у вас есть какие-либо сомнения, можно ли использовать столбцы с двойным символом, проигнорируйте этот ответ, но если вы уверены, что не сделаете этого, вы можете сделать это так же просто, как это, на C #:

   public static char ColIndexToLetter (короткий индекс) {if (index  25) throw new ArgumentException («Индекс должен быть от 0 до 25»);  return (char) ('A' + index);}  

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

  (char) ('A' + index)  

Это будет очень похоже на многих языках, поэтому вы можете адаптировать при необходимости.

Опять же, используйте это, только если вы на 100% уверены, что у вас не будет больше 26 столбцов .


Это вопрос, на который перенаправляются все остальные, а также Google, поэтому я публикую его здесь.

Многие из этих ответов верны, но слишком громоздки для простых ситуаций, например, когда у вас не более 26 столбцов.. Если у вас есть какие-либо сомнения, можно ли использовать столбцы с двойным символом, проигнорируйте этот ответ, но если вы уверены, что не сделаете этого, вы можете сделать это так же просто, как это, на C #:

   public static char ColIndexToLetter (короткий индекс) {if (index  25) throw new ArgumentException («Индекс должен быть от 0 до 25»);  return (char) ('A' + index);}  

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

  (char) ('A' + index)  

Это будет очень похоже на многих языках, поэтому вы можете адаптировать при необходимости.

Опять же, используйте это, только если вы на 100% уверены, что у вас не будет больше 26 столбцов .


Извините, это Python вместо C #, но, по крайней мере, результаты верны:

  def excel_column_number_to_name (column_number): output = "" index = column_number-1, а index> = 0: character = chr ((index% 26) + ord ('A')) output = output + character index = index /26 - 1 возвращаемый результат [:: - 1] для i в xrange (1, 1024): print "% 4d:% s"% (i, excel_column_number_to_name (i))  

Пройдены следующие контрольные примеры:

  • Номер столбца: 494286 => ABCDZ
  • Номер столбца: 27 => AA
  • Номер столбца: 52 => AZ

Извините, это Python вместо C #, но, по крайней мере, результаты верны:

  def excel_column_number_to_name (column_number)  : output = "" index = column_number-1 в то время как index> = 0: character = chr ((index% 26) + ord ('A')) output = output + character index = index/26 - 1 return output [::  -1] для i в xrange (1, 1024): print "% 4d:% s"% (i, excel_column_number_to_name (i))  

Эти контрольные примеры пройдены:

  • Номер столбца: 494286 => ABCDZ
  • Номер столбца: 27 => AA
  • Номер столбца: 52 => Аризона
Оцените статью
techsly.ru
Добавить комментарий