web-dev-qa-db-fra.com

Convertir l'index de colonne en lettre de colonne correspondante

Je dois convertir un index de colonne Google Spreadsheet en sa valeur de lettre correspondante, par exemple, en fonction d'un tableur:

enter image description here

J'ai besoin de faire ceci (cette fonction n'existe évidemment pas, c'est un exemple):

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

Maintenant, je ne me souviens pas exactement si l'index commence à partir de 0 ou de 1, de toute façon, le concept devrait être clair.

Je n'ai rien trouvé à ce sujet dans la documentation relative au gaz. Suis-je aveugle? Une idée?

Je vous remercie

44
BeNdErR

Je les ai écrites il y a quelque temps à diverses fins (je renverrai les noms de colonne à double lettre pour les numéros de colonne> 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;
}
89
AdamL

Ça marche bien

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

même pour les colonnes au-delà de Z.

Demo of function

Remplacez simplement COLUMN() par votre numéro de colonne. La valeur de ROW() n'a pas d'importance.

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

Cela prend votre cellulaire, obtient son adresse comme par exemple. C1, et supprime le "1".

 enter image description here

Comment ça marche

  • COLUMN() donne le numéro de la colonne de la cellule.
  • ADDRESS(1, ..., <format>) donne l'adresse d'une cellule, au format spécifié par le paramètre <format>. 4 signifie l'adresse que vous connaissez - par exemple C1.
    • La ligne n'a pas d'importance ici, nous utilisons donc 1.
    • Voir ADDRESS docs
  • Enfin, SUBSTITUTE(..., "1", "") remplace le 1 dans l'adresse C1, vous avez donc la lettre de la colonne.
23
Ondra Žižka

ce travail sur l'intervalle A à Z

= char (64 + colonne ())

11
SauloAlessandre

Inutile de réinventer la roue ici, utilisez plutôt la gamme 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"

10
Tomi Heiskanen

Un commentaire sur ma réponse indique que vous souhaitiez une fonction de script pour cela. D'accord, c'est parti:

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

Cela peut gérer n'importe quel nombre que JS peut gérer, je pense.

Explication:

Comme il ne s’agit pas de la base26, nous devons soustraire l’ordre des temps de base pour chaque symbole supplémentaire ("chiffre"). Nous comptons donc d’abord l’ordre du nombre obtenu, puis le nombre à soustraire. Ensuite, nous le convertissons en base 26 et soustrayons cela, puis nous déplaçons les symboles vers A-Z au lieu de 0-P.

Quoi qu'il en soit, cette question se transforme en un code de golf :)

1
Ondra Žižka

En ajoutant à la réponse de @ SauloAlessandre, cela fonctionnera pour les colonnes de A-ZZ. 

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

J'aime les réponses de @wronex et @Ondra Žižka. Cependant, j'aime beaucoup la simplicité de la réponse de @ SauloAlessandre.

J'ai donc simplement ajouté le code évident permettant à la réponse de @ SauloAlessandre de fonctionner pour des feuilles de calcul plus larges.

Comme @Dave l’a mentionné dans son commentaire, il est utile d’avoir un arrière-plan de programmation, en particulier en C, où nous avons ajouté la valeur hexadécimale de «A» à un nombre pour obtenir la nième lettre de l’alphabet en tant que motif standard.

Réponse mise à jour pour détecter l'erreur signalée par @Sangbok Lee. Je vous remercie!

1
John Murray

Voici une version générale écrite en Scala. C'est pour un index de colonne commençant à 0 (c'est simple à modifier pour un index commençant à 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)
}
1
Ian Elliott

Je cherchais aussi une version Python, voici la mienne qui a été testée sur 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
1
hum3

Manière simple de parcourir les fonctions de Google Sheet, de 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

C'est un moyen compliqué d'utiliser les fonctions de Google Sheet, mais c'est aussi plus que AA.

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

En 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

Cela vous couvrira jusqu'à la colonne 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")
0
Christian Swanson

Java Apache POI

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