Wednesday, November 5, 2008

Insert DataTable in Excel tramite VSTO

. Wednesday, November 5, 2008

VSTO sta per Visual Studio Tools per Office e quindi come si può ben intuire permette di creare soluzioni per Office usando Visual Studio e il .Net Framework.
Ma vediamo subito un semplicissimo esempio.
Il primo passo consiste nel creare un progetto per Office, nella fattispecie ho optato per la versione 2007 utilizzando il template Workbook:
Vsto1
Per semplicità genero un DataTable composto da tre colonne e cento righe:

   1: private DataTable CreateDataTable()
   2: {
   3:   DataTable dt = new DataTable();
   4:   dt.Columns.Add(new DataColumn("Id", typeof(int)));
   5:   dt.Columns.Add(new DataColumn("Desc", typeof(string)));
   6:   dt.Columns.Add(new DataColumn("Date", typeof(DateTime)));
   7:   DataRow row;
   8:   for (int i = 0; i < 100; i++)
   9:   {
  10:     row = dt.NewRow();
  11:     row[0] = i;
  12:     row[1] = "Desc: " + i.ToString();
  13:     row[2] = DateTime.Now.AddDays(i);
  14:     dt.Rows.Add(row);
  15:   }
  16:   return dt;
  17: }

Nell'evento Startup del primo sheet vado a richiamare il metodo precedentemente creato, il resto è un semplice doppio ciclo ( righe, colonne) per popolare le singole celle del foglio Excel:

   1: DataTable dt = CreateDataTable();
   2: for (int r = 1; r <= dt.Rows.Count; r++)
   3:   for (int c = 1; c <= dt.Columns.Count; c++)
   4:     Globals.Sheet1.Cells[r, c] = dt.Rows[r - 1][c - 1];


Per osservare il risultato basta lanciare l'applicazione.
Lo stesso risultato si può ottenere, con un notevole miglioramento dei tempi di esecuzione, attraverso l'oggetto Excel.Range che rappresenta una singola cella o un intervallo di celle:

   1: DataTable dt = CreateDataTable();
   2: Excel.Range rg;
   3: for( int r=1; r<=dt.Rows.Count; r++)
   4: {
   5:   rg = Globals.Sheet1.Range[ Globals.Sheet1.Cells[ r, 1], 
   6:                              Globals.Sheet1.Cells[r, dt.Columns.Count]];
   7:   rg.Value2 = dt.Rows[r-1].ItemArray;
   8: }

A questo punto tramite un semplice test (eseguiti su virtual machine con SO Windows Server 2008) si scende dai 450 millisecondi con il primo metodo ai 310 millisecondi di quest'ultimo.
Il divario diventa molto più rilevante man mano che il numero di righe/colonne del DataTable aumenta.

2 commenti:

Edward M. Meshuris said...

Thanks! It did the trick!

Pierluca said...

Don't mention it!

Post a Comment