2010-03-26 14 views
5

¿Cómo encontrar el nombre o el encabezado de la columna?Columna No a la columna Carta en Excel/VSTO con C#

Por ejemplo, si selecciono la columna 5 en excel significa que quiero el resultado como "E". Cómo obtener el alfabeto o la letra correspondiente a la columna no.

favor ayudarme con el código

Respuesta

2

Qué acerca del uso Application.ActiveCell.get_Address(true, true, Excel.AlReferenceStyle.xlA1, missing, missing) y luego analizar la cadena de resultado o utilizar una expresión regular para obtener el título de la columna?

simplemente he usado:

string location = Application.ActiveCell.get_Address(true, true, Excel.AlReferenceStyle.xlA1, missing, missing); 
string tokens = x.Split("$".ToCharArray()); 
MessageBox.Show(String.Format("Column {0}", result[0])); 
+2

Este código es incorrecto. Aquí hay una versión corregida: \t \t var location = sheet.Range ["A1"]. Offset [0, columnNumber - 1] .Address [true, true, XlReferenceStyle.xlA1, Missing, Missing]; \t \t \t var tokens = location.Split ('$'); \t \t \t tokens de retorno [1]; –

+0

@PhredMenyhert su código solo devolverá 'B' – sam

4
public static string GetColumnName(int columnNumber) 
{ 
    const string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    string columnName = ""; 

    while (columnNumber > 0) 
    { 
     columnName = letters[(columnNumber - 1) % 26] + columnName; 
     columnNumber = (columnNumber - 1)/26; 
    } 

    return columnName; 
} 
+1

hmm .. y si hay más de 26 columnas? AA, AB, AC, etc. – Ahmad

+0

disculpas ... Me di cuenta de que esto funciona .. http://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel- column-eg-aa – Ahmad

0

El siguiente es un método completo que le da el alfabeto correspondiente para un valor entero que se pasa.

private String Number2String(int number, bool isCaps) 
    { 
     int number1 = number/27; 
     int number2 = number - (number1 * 26); 
     if (number2 > 26) 
     { 
      number1 = number1 + 1; 
      number2 = number - (number1 * 26); 
     } 
     Char a = (Char)((isCaps ? 65 : 97) + (number1 - 1)); 
     Char b = (Char)((isCaps ? 65 : 97) + (number2 - 1)); 
     Char c = (Char)((isCaps ? 65 : 97) + (number - 1)); 
     string d = String.Concat(a, b); 
     if (number <= 26) 
      return c.ToString(); 
     else 
      return d; 
    } 
1
public static long GetColumnNumber(string columnName) 
{ 
    int letterPos = 0; 
    long columnNumber = 0; 
    for (int placeHolder = columnName.Length - 1; placeHolder >= 0; placeHolder--) 
    { 
     int currentSum = 1; 
     for (int multiplier = 0; multiplier < placeHolder; multiplier++) 
      currentSum *= 26; 
     int letterValue = (int) columnName[letterPos]; 
     currentSum *= letterValue - 64; 
     columnNumber += currentSum; 
     if (letterPos != columnName.Length) 
      letterPos++; 
     //Console.WriteLine(((int)columnName[i]-64) + " = " + columnName[i]); 
    } 
     return columnNumber; 
} 
+0

Este método funciona correctamente solo cuando columnName es Cadena de caracteres de mayúsculas, por alguna razón, b no es B. De ahí que se requiera column.Name.ToUpper(). – Jim

0

uso estas dos:

public string GetExcelColumn(int index) 
{ 
    int quotient = index/26; 

    if (quotient > 0) 
     return GetExcelColumn(quotient - 1) + (char)((int)'A' + (index % 26)); 
    else 
     return "" + (char)((int)'A' + index); 
} 

static IEnumerable<string> GetExcelColumns() 
{ 
    var alphabet = new string[]{""}.Union(from c in Enumerable.Range((int)'A', 26) select Convert.ToString((char)c)); 

    return from c1 in alphabet 
      from c2 in alphabet 
      from c3 in alphabet.Skip(1)     // c3 is never empty 
      where c1 == string.Empty || c2 != string.Empty // only allow c2 to be empty if c1 is also empty 
      select c1 + c2 + c3; 
} 
0

Esto funciona bien en VBA mediante el uso de un doble sustituir, en donde R es un teléfono único Rango de Excel:

ColumnLetter = Replace(Replace(R.AddressLocal(ReferenceStyle:=1), "$", vbNullString), R.Row, vbNullString) Es basado en la idea equivalente para usar en una Hoja de trabajo. En una fórmula de celda usar esto, es aún más corto:

=SUBSTITUTE(ADDRESS(1,COLUMN(M1),4),1,"") 

Esto devuelve la letra M y trabaja hasta XFD columna. La referencia de celda M1 puede ser cualquier Rango en cualquier lugar. La Columna superior izquierda se devuelve para Rangos o más de una celda.

Obtiene la DIRECCIÓN de la primera celda de la columna y luego elimina la fila 1 sustituyéndola por una cadena NullString. (El 4 en la DIRECCIÓN se asegura de que la dirección se devuelva como una dirección relativa, es decir, una sin y $ ingresa).

Gracias a barry houdini que me impulsó en la búsqueda de una buena respuesta a esto.

Cuestiones relacionadas