How to convert numbers to Excel column names in C without using automation to get values directly from Excel.
The possible range for Excel 2007 is 1 to 16384, which is the number of columns it supports. The result value should be in the form of excel column name, such as A, AA, AAA, etc.
#1 building
In perl, enter 1 (A), 27 (AA), and so on.
sub excel_colname { my ($idx) = @_; # one-based column number --$idx; # zero-based column index my $name = ""; while ($idx >= 0) { $name .= chr(ord("A") + ($idx % 26)); $idx = int($idx / 26) - 1; } return scalar reverse $name; }
#2 building
Improve the original solution (in C):
public static class ExcelHelper { private static Dictionary<UInt16, String> l_DictionaryOfColumns; public static ExcelHelper() { l_DictionaryOfColumns = new Dictionary<ushort, string>(256); } public static String GetExcelColumnName(UInt16 l_Column) { UInt16 l_ColumnCopy = l_Column; String l_Chars = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ"; String l_rVal = ""; UInt16 l_Char; if (l_DictionaryOfColumns.ContainsKey(l_Column) == true) { l_rVal = l_DictionaryOfColumns[l_Column]; } else { while (l_ColumnCopy > 26) { l_Char = l_ColumnCopy % 26; if (l_Char == 0) l_Char = 26; l_ColumnCopy = (l_ColumnCopy - l_Char) / 26; l_rVal = l_Chars[l_Char] + l_rVal; } if (l_ColumnCopy != 0) l_rVal = l_Chars[l_ColumnCopy] + l_rVal; l_DictionaryOfColumns.ContainsKey(l_Column) = l_rVal; } return l_rVal; } }
#3 building
So far, I'm surprised that all solutions contain iterations or recursions.
This is my solution, which runs in A constant time (no cycles). The solution works for all possible excel columns and checks whether input can be converted to excel columns. Possible columns are in the range of [A, XFD] or [116384]. (depending on your version of Excel)
private static string Turn(uint col) { if (col < 1 || col > 16384) //Excel columns are one-based (one = 'A') throw new ArgumentException("col must be >= 1 and <= 16384"); if (col <= 26) //one character return ((char)(col + 'A' - 1)).ToString(); else if (col <= 702) //two characters { char firstChar = (char)((int)((col - 1) / 26) + 'A' - 1); char secondChar = (char)(col % 26 + 'A' - 1); if (secondChar == '@') //Excel is one-based, but modulo operations are zero-based secondChar = 'Z'; //convert one-based to zero-based return string.Format("{0}{1}", firstChar, secondChar); } else //three characters { char firstChar = (char)((int)((col - 1) / 702) + 'A' - 1); char secondChar = (char)((col - 1) / 26 % 26 + 'A' - 1); char thirdChar = (char)(col % 26 + 'A' - 1); if (thirdChar == '@') //Excel is one-based, but modulo operations are zero-based thirdChar = 'Z'; //convert one-based to zero-based return string.Format("{0}{1}{2}", firstChar, secondChar, thirdChar); } }
#4 building
The answer is in javaScript:
function getCharFromNumber(columnNumber){ var dividend = columnNumber; var columnName = ""; var modulo; while (dividend > 0) { modulo = (dividend - 1) % 26; columnName = String.fromCharCode(65 + modulo).toString() + columnName; dividend = parseInt((dividend - modulo) / 26); } return columnName; }
#5 building
This is my super late implementation in PHP. This is recursive. I wrote this article before I found it. I want to see if other people have solved the problem
public function 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; }