2011-06-23 72 views
12

Estoy exportando mis datos a Excel Using Open XML. Ahora quiero incrementar el alfabeto como columns 'A1' to 'B1',...'Z1', 'AA1'.Incremento de alfabeto en C#

He asignado 'A1' a la variable y quiero incrementar el alfabeto a 'B1'.

Proporcione cualquier método/código que pueda incrementar el alfabeto 'A1' a 'B1' .. 'Z1', 'AA1'.

+0

¿Has encontrado algún código tú mismo? – BoltClock

+0

Esto debería ser una estructura de datos bastante simple, y usted ya sabe las funciones que desea hacer ... – crashmstr

+0

Pregunta algo relacionada [aquí] (https://stackoverflow.com/q/2208688/465053). – RBT

Respuesta

28

Esto se puede hacer:

char c1 = 'A'; 
c1++; // c1 is 'B' now 

y se puede añadir la numeración como una cadena, incluso los caracteres concatenados se pueden generar de la misma manera:

seudo código:

If Reached_Z Then Add_Another_A 
+2

¡Agradable! Funciona perfectamente, lee bien y no tiene complicaciones. – Brian

4

Este ejemplo usa un iterador capaz de ir desde A hasta ZZ.

public static IEnumerable<string> GetColumns() 
{ 
    string s = null; 
    for (char c2 = 'A'; c2 <= 'Z' + 1; c2++) 
    { 
     for (char c = 'A'; c <= 'Z'; c++) 
     { 
     yield return s + c; 
     } 
     s = c2.ToString(); 
    } 
} 

Esta muestra comienza a A1 y pasa a través de AA1

string currentCell = "A1"; 
int currentRow = int.Parse(Regex.Match(currentCell, @"\d+").Value); 
string currentCol = Regex.Match(currentCell, @"[A-Z]+").Value; 
foreach (string column in GetColumns().Where (c => c >= currentCol && currentCol <= "AA")) 
{ 
    Console.WriteLine (column + currentRow); 
} 

Esta muestra comienza a C5 y enumera a través de los próximos 26 columnas.

int columnsToAdd = 26; 
currentCell = "C5"; 
currentRow = int.Parse(Regex.Match(currentCell, @"\d+").Value); 
currentCol = Regex.Match(currentCell, @"[A-Z]+").Value; 
foreach (string column in GetColumns().Where (c => c >= currentCol)) 
{ 
    if (columnsToAdd--) == 0) 
     break; 
    Console.WriteLine (column + currentRow); 
} 
1

Creo que estas funciones hace lo que quiere:

public static string IncrementXLColumn(string Address) 
    { 
     var parts = System.Text.RegularExpressions.Regex.Matches(Address, @"([A-Z]+)|(\d+)"); 
     if (parts.Count != 2) return null; 
     return incCol(parts[0].Value) + parts[1].Value; 
    } 

    private static string incCol(string col) 
    { 
     if (col == "") return "A"; 
     string fPart = col.Substring(0, col.Length - 1); 
     char lChar = col[col.Length - 1]; 
     if (lChar == 'Z') return incCol(fPart) + "A"; 
     return fPart + ++lChar; 
    } 

Esta función podría tener una serie de A1 a B1, Z1 a Aa1, etc., deben hacer frente a ZZ1 a AAA1 así

0

este método le dará la siguiente columna:

private static Regex ALL_Z_REGEX = new Regex("^[zZ]+$"); 

    static string GetNextColumn(string currentColumn) 
    { 
     // AZ would become BA 
     char lastPosition = currentColumn[currentColumn.Length - 1]; 

     if (ALL_Z_REGEX.IsMatch(currentColumn)) 
     { 
      string result = String.Empty; 
      for (int i = 0; i < currentColumn.Length; i++) 
       result += "A"; 
      return result + "A"; 
     } 
     else if (lastPosition == 'Z') 
      return GetNextColumn(currentColumn.Remove(currentColumn.Length - 1, 1)) + "A"; 
     else 
      return currentColumn.Remove(currentColumn.Length - 1, 1) + (++lastPosition).ToString(); 
    } 
-1

puede usar constructor de cadena para lograrlo.

  int length = value.Length; 
     var lastString = value[length - 1]; 
     if (lastString == 'Z') 
     { 
      if ((length - 2) >= 0) 
       ++value[length - 2]; 
      else 
       value.Append('A'); 

      value.Replace("Z", "A"); 
     } 
     else 
      ++value[length - 1];