当前位置:  开发笔记 > 后端 > 正文

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

如何解决《如何找到与给定整数对应的Excel列名?》经验,为你挑选了5个好方法。

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

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



1> Joseph Sturt..:

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

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());
}


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

2> Samuel Audet..:

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

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

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


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

3> Jason Z..:

语言无关的算法如下:

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

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



4> 小智..:

谢谢你,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



5> wcm..:

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

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

=MID(ADDRESS(1,A2),2,LEN(ADDRESS(1,A2))-3)

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有