IT Share you

열 인덱스를 해당 열 문자로 변환

shareyou 2020. 11. 25. 21:36
반응형

열 인덱스를 해당 열 문자로 변환


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.
    • 여기서 행은 중요하지 않으므로 1.
    • 문서 보기ADDRESS
  • 마지막으로 주소에서를 SUBSTITUTE(..., "1", "")대체 하므로 열 문자가 남습니다.1C1

간격 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

반응형