如何找到与给定整数对应的Excel列名?

gor*_*ric 30 language-agnostic algorithm excel

您如何确定Excel中第n列的列名(例如"AQ"或"BH")?

编辑:一种语言无关的算法,以确定这是这里的主要目标.

Jos*_*ant 40

我曾经写过这个函数来执行那个确切的任务:

public static string Column(int column)
{
    column--;
    if (column >= 0 && column < 26)
        return ((char)('A' + column)).ToString();
    else if (column > 25)
        return Column(column / 26) + Column(column % 26 + 1);
    else
        throw new Exception("Invalid Column #" + (column + 1).ToString());
}
Run Code Online (Sandbox Code Playgroud)

  • @Onorio Catenacci:"column> 25"是另一种说法"column> = 26"的方式.我发现后者更清楚,但两者都是正确的. (3认同)
  • 太久了! (3认同)
  • @Michael - 此算法是递归的,适用于任何大小的列.我已经在Excel 2007 3字符列上进行了测试,它们工作正常(例如`Column(703)="AAA"`和`Column(704)="AAB"`) (3认同)

Sam*_*det 26

这是我能提出的最清晰的正确解决方案(用Java编写,但随意使用您喜欢的语言):

String getNthColumnName(int n) {
    String name = "";
    while (n > 0) {
        n--;
        name = (char)('A' + n%26) + name;
        n /= 26;
    }
    return name;
}
Run Code Online (Sandbox Code Playgroud)

但如果您在此代码中发现错误,请告诉我,谢谢.

  • @KodeSeeker让我看看我是否可以简单地解释......每个数字有26个符号,但这不是基数26.它有点像基数27,但没有0.`n - `是一种移出方式基数为27的0,我们留下[1,26]范围映射到[A,Z].说得通? (5认同)
  • 很棒的代码.相当简洁.你能解释一下`n - `背后的理由吗? (3认同)
  • 对于每个试图使用这个例子的人来说只是一个注释 - 没有激活他的大脑(像我一样):n是列NUMBER(从1开始)而不是INDEX(从0开始)! (3认同)

Jas*_*n Z 11

语言无关的算法如下:

function getNthColumnName(int n) {
   let curPower = 1
   while curPower < n {
      set curPower = curPower * 26
   }
   let result = ""
   while n > 0 {
      let temp = n / curPower
      let result = result + char(temp)
      set n = n - (curPower * temp)
      set curPower = curPower / 26
   }
   return result
Run Code Online (Sandbox Code Playgroud)

此算法还会考虑Excel是否再次升级以处理超过16k列.如果你真的想要超越,你可以传递一个额外的值,并用另一个数字替换26的实例,以容纳替代字母表


小智 7

谢谢你,Joseph Sturtevant!你的代码完美无缺 - 我需要在vbscript中使用它,所以我想分享我的版本:

Function ColumnLetter(ByVal intColumnNumber)
    Dim sResult
    intColumnNumber = intColumnNumber - 1
    If (intColumnNumber >= 0 And intColumnNumber < 26) Then
        sResult = Chr(65 + intColumnNumber)
    ElseIf (intColumnNumber >= 26) Then
        sResult = ColumnLetter(CLng(intColumnNumber \ 26)) _
                & ColumnLetter(CLng(intColumnNumber Mod 26 + 1))
    Else
        err.Raise 8, "Column()", "Invalid Column #" & CStr(intColumnNumber + 1)
    End If
    ColumnLetter = sResult
End Function
Run Code Online (Sandbox Code Playgroud)


wcm*_*wcm 5

约瑟夫的代码很好但是,如果你不想或不需要使用VBA函数,试试这个.

假设n的值在单元格中A2 使用此函数:

=MID(ADDRESS(1,A2),2,LEN(ADDRESS(1,A2))-3)
Run Code Online (Sandbox Code Playgroud)