2010-03-26 13 views

risposta

2

Cosa succede ad usare Application.ActiveCell.get_Address(true, true, Excel.AlReferenceStyle.xlA1, missing, missing) e poi analizzare la stringa risultato o utilizzare una regex per ottenere l'intestazione di colonna?

ho semplicemente usato:

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

Questo codice è sbagliato. Ecco una versione corretta: \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 token di ritorno [1]; –

+0

@PhredMenyhert il tuo codice restituirà solo '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 .. e se ci sono più di 26 colonne? AA, AB, AC ecc. – Ahmad

+0

scuse .. ho capito che funziona .. http://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel- column-eg-aa – Ahmad

0

Quello che segue è un metodo completo che ti dà l'alfabeto corrispondente per un valore intero che viene passato.

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

Questo metodo funziona correttamente solo quando columnName è la stringa di tipo Capital, per qualche motivo b non è B. Quindi column.Name.ToUpper() è richiesto. – Jim

0

io uso questi due:

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

Questo metodo funziona bene in VBA utilizzando una doppia sostituzione, dove R è una singola cella di Excel Gamma:

ColumnLetter = Replace(Replace(R.AddressLocal(ReferenceStyle:=1), "$", vbNullString), R.Row, vbNullString) E ' basato sull'idea equivalente per l'uso su un foglio di lavoro. In una cella di Formula utilizzare questo, è ancora più breve:

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

Questa operazione riporta la lettera M e lavora fino alla XFD Colonna. Il riferimento di cella M1 può essere qualsiasi intervallo ovunque. La colonna in alto a sinistra viene restituita per intervalli o più di una cella.

Ottiene l'INDIRIZZO della prima cella nella colonna e quindi rimuove il trailing 1 sostituendo un NullString per esso. (Il 4 nell'INDIRIZZO si assicura che l'indirizzo sia restituito come un indirizzo relativo, cioè uno senza e $ segni in esso.)

Grazie a barry houdini che mi ha spinto alla ricerca di una buona risposta a questo.

Problemi correlati