Как преобразовать числовое число в имя столбца 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 => Аризона