2010-03-26 8 views
5

Wie finden Sie den Namen oder die Kopfzeile der Spalte?Spalte Nein zu Spaltenbeschriftung in Excel/VSTO mit C#

Zum Beispiel, wenn ich die Spalte 5 in Excel wähle, möchte ich das Ergebnis als "E". Wie erhält man das Alphabet oder den Buchstaben, der der Spalte Nr. Entspricht?

Bitte helfen Sie mir mit dem Code

Antwort

2

Was Application.ActiveCell.get_Address(true, true, Excel.AlReferenceStyle.xlA1, missing, missing) verwenden und dann das Ergebnis Zeichenfolge analysieren oder einen regulären Ausdruck verwenden, um die Spaltenüberschrift zu bekommen?

ich einfach verwendet:

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

Dieser Code ist falsch. Hier ist eine korrigierte Version: \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 Return-Token [1]; –

+0

@PhredMenyhert Ihr Code wird nur 'B' zurückgeben – 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 .. und wenn es mehr als 26 Spalten gibt? AA, AB, AC usw. – Ahmad

+0

Entschuldigung..ich realisierte das funktioniert .. http://StackOverflow.com/Questions/181596/How-to-convert-a-column-number-eg-127-into-an-excel- column-eg-aa – Ahmad

0

Das Folgende ist eine vollständige Methode, die Sie das entsprechende Alphabet für einen ganzzahligen Wert gibt, der übergeben wird.

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

Diese Methode funktioniert nur ordnungsgemäß, wenn columnName Capital String ist, aus irgendeinem Grund ist b nicht B. Daher ist column.Name.ToUpper() erforderlich. – Jim

0

Ich benutze diese beiden:

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

Dieses gut in VBA arbeitet ein Doppel ersetzen durch Verwendung, wobei R a Single Cell Excel-Bereich ist:

ColumnLetter = Replace(Replace(R.AddressLocal(ReferenceStyle:=1), "$", vbNullString), R.Row, vbNullString) Es ist basierend auf der äquivalenten Idee für die Verwendung in einem Arbeitsblatt. In einer Zelle Formel diese, es ist sogar noch kürzer:

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

Dies gibt den Buchstaben M und arbeitet bis zur Spalte XFD. Die Zellenreferenz M1 kann irgendwo ein beliebiger Bereich sein. Die obere linke Spalte wird für Bereiche oder mehr als eine Zelle zurückgegeben.

Er erhält die ADRESSE der ersten Zelle in der Spalte und entfernt dann die abschließende 1, indem er eine NullString dafür ersetzt. (Die 4 in der ADRESSE stellt sicher, dass die Adresse als eine relative Adresse zurückgegeben wird, d. H. Eine ohne und $ Zeichen darin.)

Danke an barry houdini, die mich auf der Suche nach einer guten Antwort auf diese absetzte.