Quando si utilizza Microsoft Excel per manipalore i valori delle celle da codice managed può essere conveniente accedere ai valori contenuti nelle celle attraverso indici colonna/riga invece dei classici lettera e numero (A1, AB52, etc).
Ecco quindi una funzione di utilità per convertire da notazione Excel-like a indici colonna e riga:
protected static int[] ConvertCellNameToColumnRow(string cellName)
{
int maxIntLetter = 26; // ABCD...K...WXYZ
int asciiLetterA = 65;
int maxColumnIndex = 255;
string row = "";
string col = "";
char[] arr = cellName.ToCharArray();
// separo la parte letterale e numerica dal nome della cella
for (int i = 0; i < arr.Length; i++)
{
if (!Char.IsLetter(arr[i]))
{
row = cellName.Substring(i, arr.Length - i);
col = cellName.Substring(0, i);
break;
}
}
// calcolo il numero della riga
int rowIndex = 0;
CharEnumerator enumerator = row.GetEnumerator();
while (enumerator.MoveNext())
{
char number = enumerator.Current;
if (!Char.IsDigit(number))
{
throw new ApplicationException("Nome cella non valido");
}
}
// in excel l'indice delle righe comincia da zero
rowIndex = Convert.ToInt32(row) - 1;
// calcolo il numero della colonna
int colIndex = 0;
foreach (char c in col.ToCharArray())
{
colIndex += (((colIndex * (maxIntLetter - 1)) + (int)c) -
asciiLetterA) + 1;
}
colIndex--; // in excel l'indice delle righe comincia da zero
if (!(colIndex > 0 && colIndex <= maxColumnIndex))
{
// Il numero massimo di colonne in Excel è 256
throw new ApplicationException("Nome cella non valido");
}
return new int[] { colIndex, rowIndex };
}