我需要一个算法,将Excel列字母转换成相应的数字。
这个算法会用C#编写,但是任何语言都可以,甚至伪代码也可以。
请注意,我将把它放入C#中,我不想使用Office dll。
'A'对应的数字应该是1
'AH'对应的数字应该是34
'XFD'对应的数字应该是16384
public static int ExcelColumnNameToNumber(string columnName)
{
if (string.IsNullOrEmpty(columnName)) throw new ArgumentNullException("columnName");
columnName = columnName.ToUpperInvariant();
int sum = 0;
for (int i = 0; i < columnName.Length; i++)
{
sum *= 26;
sum += (columnName[i] - 'A' + 1);
}
return sum;
}
int result = colName.Select((c, i) =>
((c - 'A' + 1) * ((int)Math.Pow(26, colName.Length - i - 1)))).Sum();
int col = colName.ToCharArray().Select(c => c - 'A' + 1).
Reverse().Select((v, i) => v * (int)Math.Pow(26, i)).Sum();
sum=0;
len=length(letters);
for(i=0;i<len;i++)
sum += ((letters[len-i-1])-'A'+1) * pow(26,i);
var letters = "abc".toUpperCase();
var sum = 0;
for(var i = 0; i < letters.length;i++)
{
sum *= 26;
sum += (letters.charCodeAt(i) - ("A".charCodeAt(0)-1));
}
alert(sum);
以下是一个基本的C++答案,适用于对C++实现感兴趣的人。
int titleToNumber(string given) {
int power=0;
int res=0;
for(int i=given.length()-1;i>=0;i--)
{
char c=given[i];
res+=pow(26,power)*(c-'A'+1);
power++;
}
return res;
}
int col = "Ab".Aggregate(0, (a, c) => a * 26 + c & 31); // 28
A-Za-z
字符:int col = " !$Af$3 ".Aggregate(0, (a, c) => (uint)((c | 32) - 'a') > 25 ? a : a * 26 + (c & 31)); // 32
.Range
方法来获取数字,如下所示:Dim rng as Range
Dim vSearchCol as variant 'your input column
Set rng.Thisworkbook.worksheets("mySheet").Range(vSearchCol & "1:" & vSearchCol & "1")
然后使用.column
属性:
debug.print rng.column
如果您需要完整的代码,请参见下面:
Function ColumnbyName(vInput As Variant, Optional bByName As Boolean = True) As Variant
Dim Rng As Range
If bByName Then
If Not VBA.IsNumeric(vInput) Then
Set Rng = ThisWorkbook.Worksheets("mytab").Range(vInput & "1:" & vInput & "1")
ColumnbyName = Rng.Column
Else
MsgBox "Please enter valid non Numeric column or change paramter bByName to False!"
End If
Else
If VBA.IsNumeric(vInput) Then
ColumnbyName = VBA.Chr(64 + CInt(vInput))
Else
MsgBox "Please enter valid Numeric column or change paramter bByName to True!"
End If
End If
End Function
我猜这基本上与其他答案差不多,但可能更清楚地解释了数字字母的α等效物正在发生什么。它不完全是一个26进制系统,因为没有0占位符。也就是说,第26列将是“A0”或其他东西,而不是在26进制中的Z。它也不是27进制,因为“alpha-gits”不代表27的幂。天啊,这真让你欣赏巴比伦人发明零之前算术是多么混乱!
UInt32 sum = 0, gitVal = 1;
foreach (char alphagit in ColumnName.ToUpperInvariant().ToCharArray().Reverse())
{
sum += gitVal * (UInt32)(alphagit - 'A' + 1)
gitVal *= 26;
}
和其他一些人一样,我反转了字符数组,这样我就不需要知道指数的任何信息。