Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Excel列字母转换为数字的算法是什么?_C#_Excel_Math - Fatal编程技术网

C# 将Excel列字母转换为数字的算法是什么?

C# 将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

我需要一个算法来将Excel列字母转换为正确的数字

这将用C#语言编写,但任何语言都可以,甚至可以使用伪代码

请注意,我将把它放在C#中,我不想使用office dll

对于“A”,预期结果为1

对于“啊”=34


对于'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;i
public 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