C# 将Excel列字母转换为数字的算法是什么?
我需要一个算法来将Excel列字母转换为正确的数字 这将用C#语言编写,但任何语言都可以,甚至可以使用伪代码 请注意,我将把它放在C#中,我不想使用office dll 对于“A”,预期结果为1 对于“啊”=34C# 将Excel列字母转换为数字的算法是什么?,c#,excel,math,C#,Excel,Math,我需要一个算法来将Excel列字母转换为正确的数字 这将用C#语言编写,但任何语言都可以,甚至可以使用伪代码 请注意,我将把它放在C#中,我不想使用office dll 对于“A”,预期结果为1 对于“啊”=34 对于'XFD'=16384您是否可以将其视为基数为26的数字,然后用字母替换基数为26的数字 所以实际上,你最右边的数字总是一个介于1和26之间的原始数字,“数字”的剩余部分(左边的部分)是收集到的26的数字?A代表26的一个批次,B代表2,以此类推 例如: B = 2 = Colum
对于'XFD'=16384您是否可以将其视为基数为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 B=2=第2列 AB=26*1(A)+2=第28列 BB=26*2(B)+2=第54列 DA=26*4(D)+1=第105列
etc从最后一个字符循环到第一个字符。将每个字母(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);
sum=0;
len=长度(字母);
对于(i=0;ipublic static int ExcelColumnNameToNumber(字符串columnName)
{
if(string.IsNullOrEmpty(columnName))抛出新的ArgumentNullException(“columnName”);
columnName=columnName.ToUpper不变量();
整数和=0;
for(int i=0;i
如果有人感兴趣,我用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);
var letters=“abc.toUpperCase();
var总和=0;
对于(变量i=0;i
在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
我猜这基本上和其他一些答案差不多,但它可能会让一个数字的字母等价物更加清晰。它不是一个以26为基数的系统,因为没有0占位符。也就是说,第26列应该是“A0”或其他什么,而不是以26为基数的Z。它不是baSE27因为“阿尔法吉特”并不代表27的幂。伙计,它真的让你明白巴比伦人发明零之前的算术一定是多么混乱
UInt32 sum = 0, gitVal = 1;
foreach (char alphagit in ColumnName.ToUpperInvariant().ToCharArray().Reverse())
{
sum += gitVal * (UInt32)(alphagit - 'A' + 1)
gitVal *= 26;
}
与其他一些人一样,我反转了字符数组,因此我不需要了解任何有关指数的信息。较短版本:
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
使用Math.Pow实际上不是最好的主意(浮点问题、性能…)使用'sum*=26;sum+=(字符[i]-'A'+1);'i很好奇,字符数组的用途是什么?它似乎通过直接索引到字符串中来工作:sum+=(columnName[i]-'A'+1)对于任何有问题的人来说,让上面的内容正常工作,或者在PHP中恰好需要这样做:我正在使用OpenXMLSDK2.0,我认为UInt32作为返回类型可能比int.Perfect更合适。我花了一点时间来解释为什么要反转(因为BB高于AZ)。使用索引可以避免其他人所遇到的一个字符长度的错误。相反(从数字到列字母),请参见:“您是否可以将其视为基数为26的数字?”。这不应该起作用,因为您建议的数字系统缺少零。但看一下您的示例,我会在我的答案中将其转化为代码。@BH-在问题的上下文中,这不是必需的-Excel中没有零列(问题是“将Excel列字母转换为数字的算法是什么?”)尽管如此,上面还有更好的答案:)第二个例子忽略了非A-Za-z字符,为“AF”列和更高的列返回了错误的列索引…例如,对于单元格AF1,应该返回32,但结果是0。
UInt32 sum = 0, gitVal = 1;
foreach (char alphagit in ColumnName.ToUpperInvariant().ToCharArray().Reverse())
{
sum += gitVal * (UInt32)(alphagit - 'A' + 1)
gitVal *= 26;
}
int col = "Ab".Aggregate(0, (a, c) => a * 26 + c & 31); // 28
int col = " !$Af$3 ".Aggregate(0, (a, c) => (uint)((c | 32) - 'a') > 25 ? a : a * 26 + (c & 31)); // 32