열 인덱스를 해당 열 문자로 변환
Google 스프레드 시트 열 색인을 해당하는 문자 값으로 변환해야합니다 (예 : 스프레드 시트가 주어짐).
이 작업을 수행해야합니다 (이 함수는 분명히 존재하지 않습니다. 예제입니다).
getColumnLetterByIndex(4); // this should return "D"
getColumnLetterByIndex(1); // this should return "A"
getColumnLetterByIndex(6); // this should return "F"
이제 인덱스가에서 시작하는지 0
또는 시작하는지 정확히 기억하지 못합니다 1
. 어쨌든 개념은 명확해야합니다.
나는 가스 문서에서 이것에 대해 아무것도 찾지 못했습니다 .. 나는 장님입니까? 어떤 생각?
감사합니다
나는 이것을 다양한 목적으로 잠시 썼다 (열 번호> 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;
}
이것은 잘 작동합니다
=REGEXEXTRACT(ADDRESS(ROW(); COLUMN()); "[A-Z]+")
Z를 초과하는 열에서도.
COLUMN()
열 번호로 바꾸기 만하면 됩니다. 의 가치는 ROW()
중요하지 않습니다.
=SUBSTITUTE(ADDRESS(1,COLUMN(),4), "1", "")
이것은 당신의 셀을 취하고, 예를 들어 C1과 같은 주소를 얻고, "1"을 제거합니다.
작동 원리
COLUMN()
셀의 열 번호를 제공합니다.ADDRESS(1, ..., <format>)
<format>
매개 변수가 지정한 형식으로 셀 주소를 제공합니다 .4
당신이 알고있는 주소를 의미합니다C1
.- 마지막으로 주소에서를
SUBSTITUTE(..., "1", "")
대체 하므로 열 문자가 남습니다.1
C1
간격 AZ에서이 작업
= char (64+ 열 ())
여기서 바퀴를 재발 명 할 필요가 없습니다. 대신 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"
@SauloAlessandre의 답변에 추가하면 A-ZZ의 열에서 작동합니다.
=if(column() >26,char(64+(column()-1)/26),) & char(65 + mod(column()-1,26))
@wronex와 @Ondra Žižka의 답변이 마음에 듭니다. 그러나 @SauloAlessandre의 답변의 단순함이 정말 마음에 듭니다.
그래서 @SauloAlessandre의 답변이 더 넓은 스프레드 시트에서 작동하도록 명확한 코드를 추가했습니다.
@Dave가 그의 의견에서 언급했듯이 프로그래밍 배경, 특히 알파벳의 n 번째 문자를 표준 패턴으로 얻기 위해 숫자에 'A'의 16 진수 값을 추가 한 C의 프로그래밍 배경이 있으면 도움이됩니다.
@Sangbok Lee가 지적한 오류를 포착하기 위해 답변이 업데이트되었습니다. 감사합니다!
자바 스크립트에서 :
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')
나는 또한 Python 3.6에서 테스트 된 Python 버전을 찾고있었습니다.
def columnToLetter(column):
character = chr(ord('A') + column % 26)
remainder = column // 26
if column >= 26:
return columnToLetter(remainder-1) + character
else:
return character
다음은 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)
}
내 대답에 대한 의견은 스크립트 기능을 원한다고 말합니다. 좋아, 우리가 간다 :
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이 아니기 때문에 각 추가 기호 ( "숫자")에 대해 기본 시간 순서를 빼야합니다. 따라서 먼저 결과 숫자의 순서를 세고 동시에 뺄 숫자를 세십시오. 그런 다음 26을 밑으로 변환하고 빼고 기호를 A-Z
대신 0-P
.
어쨌든,이 질문은 코드 골프로 바뀌고 있습니다. :)
자바 Apache POI
String columnLetter = CellReference.convertNumToColString(columnNumber);
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")
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 시트 기능을 사용하는 복잡한 방법이지만 AA 이상이기도합니다.
=mid(address(1, column(AB3)),2,len(address(1, column(AB3)))-3) : value is AB
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)
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");
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)))"
}
다음은 색인이없는 버전입니다 (Python).
letters = []
while column >= 0:
letters.append(string.ascii_uppercase[column % 26])
column = column // 26 - 1
return ''.join(reversed(letters))
참고 URL : https://stackoverflow.com/questions/21229180/convert-column-index-into-corresponding-column-letter
'IT Share you' 카테고리의 다른 글
'WSGIRequest'개체에 'user'속성이 없습니다. Django 관리자 (0) | 2020.11.25 |
---|---|
UITableView 높이를 동적으로 변경 (0) | 2020.11.25 |
AVCaptureVideoPreviewLayer가 iPhone 4S 화면 전체를 채우지 않습니다. (0) | 2020.11.25 |
Date 객체에서 시간을 제거 하시겠습니까? (0) | 2020.11.25 |
정적 변수 링크 오류 (0) | 2020.11.24 |