it-swarm.com.de

Konvertieren Sie den Spaltenindex in den entsprechenden Spaltenbuchstaben

Ich muss einen Google Spreadsheet-Spaltenindex in den entsprechenden Buchstabenwert umwandeln, z. B. eine Tabelle:

enter image description here

Ich muss das tun (diese Funktion existiert offensichtlich nicht, es ist ein Beispiel):

getColumnLetterByIndex(4);  // this should return "D"
getColumnLetterByIndex(1);  // this should return "A"
getColumnLetterByIndex(6);  // this should return "F"

Ich kann mich nicht genau erinnern, ob der Index mit 0 oder 1 beginnt. Das Konzept sollte trotzdem klar sein.

Ich habe nichts über die Gasdokumentation gefunden. Bin ich blind? Irgendeine Idee?

Vielen Dank

44
BeNdErR

Ich habe diese vor einiger Zeit zu verschiedenen Zwecken geschrieben (gibt die zweibuchstabigen Spaltennamen für Spaltennummern> 26 zurück):

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;
}
89
AdamL

Das funktioniert gut

=REGEXEXTRACT(ADDRESS(ROW(); COLUMN()); "[A-Z]+")

auch für Spalten über Z.

Demo of function

Ersetzen Sie einfach COLUMN() durch Ihre Spaltennummer. Der Wert von ROW() spielt keine Rolle.

43
wronex
=SUBSTITUTE(ADDRESS(1,COLUMN(),4), "1", "")

Dies nimmt Ihre Zelle, bekommt ihre Adresse als z. C1 und entfernt die "1".

 enter image description here

Wie es funktioniert

  • COLUMN() gibt die Nummer der Spalte der Zelle an.
  • ADDRESS(1, ..., <format>) gibt eine Adresse einer Zelle in einem Format an, das durch den <format>-Parameter festgelegt wird. 4 bedeutet die Adresse, die Sie kennen - z. C1.
    • Die Zeile spielt hier keine Rolle, also verwenden wir 1.
    • Siehe ADDRESS docs
  • Schließlich ersetzt SUBSTITUTE(..., "1", "") den 1 in der Adresse C1, so dass der Spaltenbuchstabe übrig bleibt.
23
Ondra Žižka

diese Arbeit auf Intervall A-Z

= char (64 + Spalte ())

11
SauloAlessandre

Das Rad muss hier nicht neu erfunden werden. Verwenden Sie stattdessen die GAS-Serie:

 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"

10
Tomi Heiskanen

Ein Kommentar zu meiner Antwort besagt, dass Sie eine Skriptfunktion dafür wollten. Okay, los geht's:

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('');
}

Ich denke, das kann mit jeder beliebigen Anzahl von JS umgehen.

Erläuterung:

Da dies nicht base26 ist, müssen wir die Basiszeitreihenfolge für jedes zusätzliche Symbol ("digit") subtrahieren. Wir zählen also zuerst die Reihenfolge der resultierenden Zahl und gleichzeitig die zu subtrahierende Zahl. Und dann konvertieren wir es in Basis 26 und subtrahieren das und verschieben dann die Symbole in A-Z anstelle von 0-P.

Wie auch immer, diese Frage verwandelt sich in einen Code Golf :)

1
Ondra Žižka

Zusätzlich zu @ SauloAlessandres Antwort wird dies für Spalten von A-ZZ funktionieren. 

=if(column() >26,char(64+(column()-1)/26),) & char(65 + mod(column()-1,26))

Ich mag die Antworten von @wronex und @Ondra Žižka. Die Einfachheit der Antwort von @ SauloAlessandre gefällt mir jedoch sehr gut.

Also habe ich einfach den offensichtlichen Code hinzugefügt, um die Antwort von @ SauloAlessandre für breitere Tabellenkalkulationen zuzulassen.

Wie @Dave in seinem Kommentar erwähnt, hilft es, einen Programmierhintergrund zu haben, insbesondere in C, wo wir den Hexadezimalwert 'A' zu einer Zahl addiert haben, um den n-ten Buchstaben des Alphabets als Standardmuster zu erhalten.

Antwort aktualisiert, um den von @Sangbok Lee gemeldeten Fehler zu erkennen. Vielen Dank!

1
John Murray

Hier ist eine allgemeine Version in Scala. Es ist für einen Spaltenindex, der bei 0 beginnt (es ist einfach für einen Index, der bei 1 beginnt, zu ändern):

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)
}
1
Ian Elliott

Ich habe auch nach einer Python-Version gesucht, hier ist meine, die auf Python 3.6 getestet wurde

def columnToLetter(column):
    character = chr(ord('A') + column % 26)
    remainder = column // 26
    if column >= 26:
        return columnToLetter(remainder-1) + character
    else:
        return character
1
hum3

Einfacher Weg durch Google Sheet-Funktionen von A bis Z.

=column(B2) : value is 2
=address(1, column(B2)) : value is $B$1
=mid(address(1, column(B2)),2,1) : value is B

Es ist ein komplizierter Weg durch die Google Sheet-Funktionen, aber es ist auch mehr als AA.

=mid(address(1, column(AB3)),2,len(address(1, column(AB3)))-3) : value is AB
0
redlasha

In 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')
0
Pascal DeMilly

Dies wird Sie bis zur Spalte AZ abdecken:

=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")
0

Java Apache POI

String columnLetter = CellReference.convertNumToColString(columnNumber);
0
CelinHC