如何确定Excel中第n列的列名(例如“AQ”或“BH”)?
编辑:确定此问题的语言无关算法是主要目标。
如何确定Excel中第n列的列名(例如“AQ”或“BH”)?
编辑:确定此问题的语言无关算法是主要目标。
我曾经编写了这个函数来执行这项任务:
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());
}
Column(703) = "AAA"
和Column(704) = "AAB"
)。 - Joseph Sturtevant这是我能想到的最简洁的正确解决方案(用Java编写,但可以使用您喜欢的语言):
String getNthColumnName(int n) {
String name = "";
while (n > 0) {
n--;
name = (char)('A' + n%26) + name;
n /= 26;
}
return name;
}
但是如果您在这段代码中发现错误, 请务必让我知道,谢谢。
n--
的原理吗? - seekern--
是一种从基础27中移除0的方法,我们剩下的是[1, 26]范围映射到[A,Z]。明白了吗? - Samuel Audetn /= 26
是整数除法,即舍弃余数(或小数部分)。 - Wolfie语言无关的算法如下:
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的实例替换为另一个数字以适应其他字母表。
temp
是一个整数,那么 let temp = n / curPower
这个除法是如何取整的?还有 / 26
呢? - SantiBailors谢谢你,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
Joseph的代码很好,但是如果你不想或者不需要使用VBA函数,可以尝试以下方法。
假设n的值在单元格A2
中,请使用以下函数:
=MID(ADDRESS(1,A2),2,LEN(ADDRESS(1,A2))-3)
IF(COLUMN()>=26,CHAR(ROUND(COLUMN()/26,1)+64)&CHAR(MOD(COLUMN(),26)+64),CHAR(COLUMN()+64))
这个公式适用于两个字母的列(直到列ZZ
)。如果要使用三个字母的列,您需要嵌套另一个if语句。
上述公式在列AY
、AZ
和每个后续的nY
和nZ
列上失败。更正后的公式为:
=IF(COLUMN()>26,CHAR(ROUNDDOWN((COLUMN()-1)/26,0)+64)&CHAR(MOD((COLUMN()-1),26)+65),CHAR(COLUMN()+64)
Ruby一行代码:
def column_name_for(some_int)
some_int.to_s(26).split('').map {|c| (c.to_i(26) + 64).chr }.join # 703 => "AAA"
end
有趣。
来自wcm:
如果您不想使用VBA,您可以使用此方法,将colnr替换为您想要的数字
=MID(ADDRESS(1,colnr),2,LEN(ADDRESS(1,colnr))-3)
columnNumber=28
; Cells(1, columnNumber).Address
返回 "$AB$1"
。$
符号进行拆分,返回数组:["","AB","1"]
Split(Cells(1, columnNumber).Address, "$")(1)
给出列名 "AB"
。' The following VBA function is just one way to convert column number
' values into their equivalent alphabetical characters:
Function ConvertToLetter(iCol As Integer) As String
Dim iAlpha As Integer
Dim iRemainder As Integer
iAlpha = Int(iCol / 27)
iRemainder = iCol - (iAlpha * 26)
If iAlpha > 0 Then
ConvertToLetter = Chr(iAlpha + 64)
End If
If iRemainder > 0 Then
ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
End If
End Function
以下是VBScript版本转换为SQL Server 2000+版本的内容。
CREATE FUNCTION [dbo].[GetExcelColRef]
(
@col_seq_no int
)
RETURNS varchar(5)
AS
BEGIN
declare @Result varchar(5)
set @Result = ''
set @col_seq_no = @col_seq_no - 1
If (@col_seq_no >= 0 And @col_seq_no < 26)
BEGIN
set @Result = char(65 + @col_seq_no)
END
ELSE
BEGIN
set @Result = [dbo].[GetExcelColRef] (@col_seq_no / 26) + '' + [dbo].[GetExcelColRef] ((@col_seq_no % 26) + 1)
END
Return @Result
END
GO