Excel: convertire il nome di una cella in indici di colonna e riga

dategiovedì 15 maggio 2008 alle 17.58  - posted by Manuel Scapolan in Tips and Tricks

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

tagsTags:

Commenti chiusi

About me

manuel scapolanSono un consulente informatico. Nel 2004 terminati gli studi in Ingegneria Informatica (1° livello), ho iniziato come freelance collaborando con una ditta di consulenza informatica ed una agenzia di marketing e comunicazione nello sviluppo di applicazioni web. Attualmente divido il lavoro di sviluppatore e progettista web con attività di formazione nel settore della programmazione.
View Manuel Scapolan's profile on LinkedIn

Follow me on Follow manuelscapolan on Twitter

Calendario


<<  settembre 2010  >>
lumamegivesado
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

Disclaimer

Eccetto dove diversamente specificato, i contenuti di questo sito sono rilasciati mediante:
creative commons
Attribuzione: Non commerciale
Condividi allo stesso modo. R.2.5

Books (a bit more about my library)

Domain Driven Design - Eric Evans Applying Domain-Driven Design and Patterns - Jimmy Nilsson Refactoring to Patterns - Joshua Kerievsky Design Patterns -  Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides Code Complete Second Edition - Steve McConnell Patterns of Enterprise Application Architecture - Martin Fowler Agile Principles, Patterns, and Practices in C# - Robert C. Martin xUnit Test Patterns - Gerard Meszaros Refactoring - Martin Fowler CLR via C# Second Edition - Jeffrey Richter Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries - Krzysztof Cwalina, Brad Abrams Don't make me think! - Steve Krug Bulletproof Ajax - Jeremy Keith

Manuel Scapolan Copyright © 2007 - 2010 - Tutti i diritti riservati - Powered by BlogEngine.NET 1.5.0.7 - silk icons by famfamfam - Time CET