我需要将Google Spreadsheet列索引转换为相应的字母值,例如,给定电子表格:
我需要这样做(这个功能显然不存在,这是一个例子):
getColumnLetterByIndex(4); // this should return "D"
getColumnLetterByIndex(1); // this should return "A"
getColumnLetterByIndex(6); // this should return "F"
现在,我不记得索引是从0
还是从1
开始,无论如何,这个概念应该是明确的。
我没有在天然气文件中找到任何关于此的信息。我是否瞎了?有什么想法吗?
谢谢
答案 0 :(得分:95)
我为了各种目的而写了一段时间(将返回列号> 26的双字母列名称):
function columnToLetter(column)
{
var temp, letter = '';
while (column > 0)
{
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
}
function letterToColumn(letter)
{
var column = 0, length = letter.length;
for (var i = 0; i < length; i++)
{
column += (letter.charCodeAt(i) - 64) * Math.pow(26, length - i - 1);
}
return column;
}
答案 1 :(得分:45)
这很好用
=REGEXEXTRACT(ADDRESS(ROW(); COLUMN()); "[A-Z]+")
即使是Z以外的列。
只需将COLUMN()
替换为您的列号即可。 ROW()
的值无关紧要。
答案 2 :(得分:23)
=SUBSTITUTE(ADDRESS(1,COLUMN(),4), "1", "")
这会占用您的单元格,获取其地址,例如C1,并删除“1”。
工作原理
COLUMN()
给出了单元格列的编号。ADDRESS(1, ..., <format>)
以<format>
参数指定的格式提供单元格的地址。 4
表示您知道的地址 - 例如C1
。
1
。ADDRESS
docs SUBSTITUTE(..., "1", "")
会替换地址1
中的C1
,因此您会留下专栏信。答案 3 :(得分:13)
这项工作在区间A-Z
= CHAR(64 +柱())
答案 4 :(得分:10)
无需在此重新发明轮子,而是使用GAS系列:
var column_index = 1; // your column to resolve
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var range = sheet.getRange(1, column_index, 1, 1);
Logger.log(range.getA1Notation().match(/([A-Z]+)/)[0]); // Logs "A"
&#13;
答案 5 :(得分:2)
添加到@ SauloAlessandre的答案,这适用于A-ZZ的列。
=if(column() >26,char(64+(column()-1)/26),) & char(65 + mod(column()-1,26))
我喜欢@wronex和@OndraŽižka的答案。但是,我真的很喜欢@ SauloAlessandre答案的简单性。
所以,我刚刚添加了明显的代码,允许@ SauloAlessandre的答案适用于更广泛的电子表格。
正如@Dave在他的评论中所提到的,它确实有一个编程背景,特别是在C中的一个,我们在数字中添加了'A'的十六进制值,以获得字母表的第n个字母作为标准模式。
更新答案以捕捉@Sangbok Lee指出的错误。谢谢!
答案 6 :(得分:1)
我也在寻找一个Python版本,这是我在Python 3.6上测试的
def columnToLetter(column):
character = chr(ord('A') + column % 26)
remainder = column // 26
if column >= 26:
return columnToLetter(remainder-1) + character
else:
return character
答案 7 :(得分:1)
这是用Scala编写的一般版本。这是一个列索引从0开始(修改索引从1开始很简单):
def indexToColumnBase(n: Int, base: Int): String = {
require(n >= 0, s"Index is non-negative, n = $n")
require(2 <= base && base <= 26, s"Base in range 2...26, base = $base")
def digitFromZeroToLetter(n: BigInt): String =
('A' + n.toInt).toChar.toString
def digitFromOneToLetter(n: BigInt): String =
('A' - 1 + n.toInt).toChar.toString
def lhsConvert(n: Int): String = {
val q0: Int = n / base
val r0: Int = n % base
val q1 = if (r0 == 0) (n - base) / base else q0
val r1 = if (r0 == 0) base else r0
if (q1 == 0)
digitFromOneToLetter(r1)
else
lhsConvert(q1) + digitFromOneToLetter(r1)
}
val q: Int = n / base
val r: Int = n % base
if (q == 0)
digitFromZeroToLetter(r)
else
lhsConvert(q) + digitFromZeroToLetter(r)
}
def indexToColumnAtoZ(n: Int): String = {
val AtoZBase = 26
indexToColumnBase(n, AtoZBase)
}
答案 8 :(得分:1)
对我的回答的评论说你想要一个脚本功能。好的,我们走了:
function excelize(colNum) {
var order = 1, sub = 0, divTmp = colNum;
do {
divTmp -= order; sub += order; order *= 26;
divTmp = (divTmp - (divTmp % 26)) / 26;
} while(divTmp > 0);
var symbols = "0123456789abcdefghijklmnopqrstuvwxyz";
var tr = c => symbols[symbols.indexOf(c)+10];
return Number(colNum-sub).toString(26).split('').map(c=>tr(c)).join('');
}
我认为这可以处理JS可以处理的任何数字。
说明:
由于这不是base26,我们需要减去每个附加符号的基本时间顺序(&#34;数字&#34;)。因此,首先我们计算结果数的顺序,同时计算要减去的数。然后我们将其转换为基数26并将其减去,然后将符号移至A-Z
而不是0-P
。
无论如何,这个问题变成了高尔夫代码:)
答案 9 :(得分:1)
在javascript中:
X = (n) => (a=Math.floor(n/26)) >= 0 ? X(a-1) + String.fromCharCode(65+(n%26)) : '';
console.assert (X(0) == 'A')
console.assert (X(25) == 'Z')
console.assert (X(26) == 'AA')
console.assert (X(51) == 'AZ')
console.assert (X(52) == 'BA')
答案 10 :(得分:0)
Java Apache POI
String columnLetter = CellReference.convertNumToColString(columnNumber);
答案 11 :(得分:0)
这将覆盖到AZ列:
=iferror(if(match(A2,$A$1:$AZ$1,0)<27,char(64+(match(A2,$A$1:$AZ$1,0))),concatenate("A",char(38+(match(A2,$A$1:$AZ$1,0))))),"No match")
答案 12 :(得分:0)
通过Google表格功能(从A到Z)的简单方法。
=column(B2) : value is 2
=address(1, column(B2)) : value is $B$1
=mid(address(1, column(B2)),2,1) : value is B
这是使用Google Sheet函数的复杂方法,但它不仅限于AA。
=mid(address(1, column(AB3)),2,len(address(1, column(AB3)))-3) : value is AB
答案 13 :(得分:0)
我正在寻找PHP中的解决方案。也许会帮助某人。
<?php
$numberToLetter = function(int $number)
{
if ($number <= 0) return null;
$temp; $letter = '';
while ($number > 0) {
$temp = ($number - 1) % 26;
$letter = chr($temp + 65) . $letter;
$number = ($number - $temp - 1) / 26;
}
return $letter;
};
$letterToNumber = function(string $letters) {
$letters = strtoupper($letters);
$letters = preg_replace("/[^A-Z]/", '', $letters);
$column = 0;
$length = strlen($letters);
for ($i = 0; $i < $length; $i++) {
$column += (ord($letters[$i]) - 64) * pow(26, $length - $i - 1);
}
return $column;
};
var_dump($numberToLetter(-1));
var_dump($numberToLetter(26));
var_dump($numberToLetter(27));
var_dump($numberToLetter(30));
var_dump($letterToNumber('-1A!'));
var_dump($letterToNumber('A'));
var_dump($letterToNumber('B'));
var_dump($letterToNumber('Y'));
var_dump($letterToNumber('Z'));
var_dump($letterToNumber('AA'));
var_dump($letterToNumber('AB'));
输出:
NULL
string(1) "Z"
string(2) "AA"
string(2) "AD"
int(1)
int(1)
int(2)
int(25)
int(26)
int(27)
int(28)
答案 14 :(得分:0)
将列索引递归转换为字母组合的函数:
function lettersFromIndex(index, curResult, i) {
if (i == undefined) i = 11; //enough for Number.MAX_SAFE_INTEGER
if (curResult == undefined) curResult = "";
var factor = Math.floor(index / Math.pow(26, i)); //for the order of magnitude 26^i
if (factor > 0 && i > 0) {
curResult += String.fromCharCode(64 + factor);
curResult = lettersFromIndex(index - Math.pow(26, i) * factor, curResult, i - 1);
} else if (factor == 0 && i > 0) {
curResult = lettersFromIndex(index, curResult, i - 1);
} else {
curResult += String.fromCharCode(64 + index % 26);
}
return curResult;
}
function lettersFromIndex(index, curResult, i) {
if (i == undefined) i = 11; //enough for Number.MAX_SAFE_INTEGER
if (curResult == undefined) curResult = "";
var factor = Math.floor(index / Math.pow(26, i));
if (factor > 0 && i > 0) {
curResult += String.fromCharCode(64 + factor);
curResult = lettersFromIndex(index - Math.pow(26, i) * factor, curResult, i - 1);
} else if (factor == 0 && i > 0) {
curResult = lettersFromIndex(index, curResult, i - 1);
} else {
curResult += String.fromCharCode(64 + index % 26);
}
return curResult;
}
document.getElementById("result1").innerHTML = lettersFromIndex(32);
document.getElementById("result2").innerHTML = lettersFromIndex(6800);
document.getElementById("result3").innerHTML = lettersFromIndex(9007199254740991);
32 --> <span id="result1"></span><br> 6800 --> <span id="result2"></span><br> 9007199254740991 --> <span id="result3"></span>
答案 15 :(得分:0)
在python中,有gspread库
import gspread
column_letter = gspread.utils.rowcol_to_a1(1, <put your col number here>)[:-1]
如果您不能使用python,建议您在https://github.com/burnash/gspread/blob/master/gspread/utils.py中查找rowcol_to_a1()的源代码
答案 16 :(得分:0)
这是一个使用递归超越 ZZ 的两行代码:
蟒蛇
def col_to_letter(n):
l = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
return col_to_letter((n-1)//26) + col_to_letter(n%26) if n > 26 else l[n-1]
Javascript
function colToLetter(n) {
l = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
return n > 26 ? colToLetter(Math.floor((n-1)/26)) + colToLetter(n%26) : l[n-1]
}
答案 17 :(得分:-1)
function myFunction(n) {
if (n < 27) {
return String.fromCharCode(64 + n);
}
else {
var first = Math.round(n / 26);
var second = n % 26;
return String.fromCharCode(64 + first) + String.fromCharCode(64 + second)
}
}
我希望您知道Google apps脚本中的所有范围功能都可以使用索引整数。
sheet.getRange(1,1).setValue("value");
答案 18 :(得分:-1)
在PowerShell中:
function convert-IndexToColumn
{
Param
(
[Parameter(Mandatory)]
[int]$col
)
"$(if($col -gt 26){[char][int][math]::Floor(64+($col-1)/26)})$([char](65 + (($col-1) % 26)))"
}
答案 19 :(得分:-2)
这是一个零索引版本(在Python中):
letters = []
while column >= 0:
letters.append(string.ascii_uppercase[column % 26])
column = column // 26 - 1
return ''.join(reversed(letters))