2011-06-23 26 views
12

Eksportuję moje dane do Excel Using Open XML. teraz chcę zwiększyć alfabet jak columns 'A1' to 'B1',...'Z1', 'AA1'.Przyrost liczby w C#

Mam przypisać "A1" do zmiennej i chcę zwiększyć alfabet do "B1".

Proszę podać dowolną metodę/kod, za pomocą którego można zwiększyć alfabet "A1" do "B1" .. "Z1", "AA1".

+0

Czy znalazłeś już jakiś kod? – BoltClock

+0

To powinna być dość prosta struktura danych, a już znasz funkcje, które chcesz wykonać ... – crashmstr

+0

Nieco powiązane pytanie [tutaj] (https://stackoverflow.com/q/2208688/465053). – RBT

Odpowiedz

28

Można to zrobić:

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

i można dodać numerację jako ciąg znaków, nawet Łączone postacie mogą być generowane w ten sam sposób: Kod

pseudo:

If Reached_Z Then Add_Another_A 
+2

Nice! Działa doskonale, dobrze czyta i jest nieskomplikowany. – Brian

4

W tym przykładzie zastosowano iterator, który może przechodzić od A do 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(); 
    } 
} 

Próbka ta rozpoczyna się A1 i przechodzi 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); 
} 

Próbka ta rozpoczyna się C5 wylicza i przez następne 26 kolumn.

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

myślę, że to funkcja robić to, co chcesz:

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

Funkcja ta miałaby ciąg A1 do B1, Z1 do AA1 itd. Należy poradzić sobie z ZZ1 do AAA1 także

0

metoda ta daje kolejną kolumnę:

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

można użyć konstruktora ciąg do osiągnięcia tego celu.

  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];