我需要一种算法将Excel列字母转换为正确的数字。
这将编写的语言是C#,但任何会做甚至伪代码。
请注意我将把它放在C#中,我不想使用办公室dll。
对于'A',预期结果为1
对于'AH'= 34
对于'XFD'= 16384
答案 0 :(得分:105)
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;
}
答案 1 :(得分:15)
int result = colName.Select((c, i) =>
((c - 'A' + 1) * ((int)Math.Pow(26, colName.Length - i - 1)))).Sum();
答案 2 :(得分:7)
int col = colName.ToCharArray().Select(c => c - 'A' + 1).
Reverse().Select((v, i) => v * (int)Math.Pow(26, i)).Sum();
答案 3 :(得分:5)
循环显示从最后到第一个的字符。将每个字母的值(A = 1,Z = 26)乘以26 ** N,加上运行总计。我在C#中的字符串操作技巧是不存在的,所以这里有一些非常混合的伪代码:
sum=0;
len=length(letters);
for(i=0;i<len;i++)
sum += ((letters[len-i-1])-'A'+1) * pow(26,i);
答案 4 :(得分:3)
您是否可以将其视为基数为26的数字,然后用字母代替基数为26的数字?
所以实际上,你最右边的数字总是1到26之间的原始数字,而“数字”的剩余部分(左边部分)是26收集的数字?所以A代表一个26,B代表2,等等。
举个例子:
B = 2 = Column 2 AB = 26 * 1(A) + 2 = Column 28 BB = 26 * 2(B) + 2 = Column 54 DA = 26 * 4(D) + 1 = Column 105
等
答案 5 :(得分:3)
如果有人感兴趣的话,这是我用JavaScript编写的解决方案。
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);
答案 6 :(得分:1)
我对任何答案都不满意,所以这里有一个简短的版本:
int col = "Ab".Aggregate(0, (a, c) => a * 26 + c & 31); // 28
或更好,忽略非A-Za-z
字符:
int col = " !$Ab$3 ".Aggregate(0, (a, c) => (uint)((c | 32) - 97) > 25 ? a : a * 26 + c & 31); // 28
答案 7 :(得分:0)
在Excel VBA中,您可以使用.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
答案 8 :(得分:0)
我想这基本上与其他一些答案基本相同,但它可能会更清楚地说明数字数字的α等价物是怎么回事。它不是一个基础26系统,因为没有0占位符。也就是说,第26列将是'A0'或者基础26中的Z而不是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;
}
和其他人一样,我颠倒了字符数组,因此我不需要了解有关指数的任何内容。
答案 9 :(得分:0)
为此,我只使用一行:
int ColumnNumber = Application.Range[MyColumnName + "1"].Column;