将列索引转换为Excel列名称

5 浏览
0 Comments

将列索引转换为Excel列名称

给定一个列的索引,你怎么获取Excel列名?

这个问题比它听起来的要棘手,因为它不仅仅是基于26进制的。列名不像普通数字一样会循环回来。即使是微软支持的示例也不能超过ZZZ。

免责声明:这是我很久之前写的一些代码,今天又在我的桌面上出现了。我认为在这里发布作为一个预先回答的问题是值得的。

admin 更改状态以发布 2023年5月21日
0
0 Comments

以下是Joel的强大代码,已经修改为使用基于零的列索引并且不再使用字符数组。

 Public Shared Function GetExcelColumn(ByVal index As Integer) As String
        Dim quotient As Integer = index \ 26 ' Truncate 
        If quotient > 0 Then
            Return GetExcelColumn(quotient - 1) & Chr((index Mod 26) + 64).ToString
        Else
            Return Chr(index + 64).ToString
        End If
    End Function

0
0 Comments

我得出的答案是需要一些递归。这里展示了VB.Net的代码:

Function ColumnName(ByVal index As Integer) As String
        Static chars() As Char = {"A"c, "B"c, "C"c, "D"c, "E"c, "F"c, "G"c, "H"c, "I"c, "J"c, "K"c, "L"c, "M"c, "N"c, "O"c, "P"c, "Q"c, "R"c, "S"c, "T"c, "U"c, "V"c, "W"c, "X"c, "Y"c, "Z"c}
        index -= 1 ' adjust so it matches 0-indexed array rather than 1-indexed column
        Dim quotient As Integer = index \ 26 ' normal / operator rounds. \ does integer division, which truncates
        If quotient > 0 Then
               ColumnName = ColumnName(quotient) & chars(index Mod 26)
        Else
               ColumnName = chars(index Mod 26)
        End If
End Function

还有C#版本:

string ColumnName(int index)
{
    index -= 1; //adjust so it matches 0-indexed array rather than 1-indexed column
    int quotient = index / 26;
    if (quotient > 0)
        return ColumnName(quotient) + chars[index % 26].ToString();
    else
        return chars[index % 26].ToString();
}
private char[] chars = new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

唯一的缺点是它使用从1开始的列而不是从0开始。

0