Idalgo Cantelli

.NET programming

  Home :: Contact :: Syndication  :: Login
  12 Posts :: 0 Stories :: 0 Comments :: 403 Trackbacks

lunedì 16 maggio 2005 #

Quando si manipolano gli oggetti di Excel in un assembly .NET capita a volte che venga scatenata un’eccezione di tipo COMException il cui messaggio è 'Old Format or Invalid Type Library'. Succede se si utilizza una versione di Excel in lingua inglese ma le impostazioni del proprio PC sono in una lingua diversa.

Un articolo della Knowledge Base (http://support.microsoft.com/default.aspx?scid=kb;en-us;320369 ) suggerisce un workaround a questo problema.

Occorre impostare la CurrentCulture a “en-US” prima dell’operazione critica, poi è possibile ripristinare la CultureInfo precedente (che avremo memorizzato in una variabile d’appoggio).

Sono in tutto tre righe di codice, ma come al solito è utile delegare questa piccola operazione a una classe riutilizzabile.

L’istruzione using e l’interfaccia IDisposable che ho descritto in un precedente post possono tornare utili anche in questo caso.

Ecco come si può implementare questa classe in C#:

 

using System;

using System.Globalization;

using System.Threading;

using System.Diagnostics;

 

namespace Utilities

{

      ///

      /// switchCultureInfo.

      /// Implementa

      /// e bufferizza in una variabile membro la

      /// corrente.

      /// Sul costruttore imposta la CurrentCulture su "en-US".

      ///

      ///

      /// Da usarsi per uno switch temporaneo alla CultureInfo di tipo "en-US"

      /// nei casi in cui l'utilizzo di alcuni oggetti di Office produce l'eccezione

      /// 'Old Format or Invalid Type Library'

      /// di tipo ,

      /// documentata nell'articolo 320369 della Knowledge Base.

      ///

      [DebuggerStepThrough()]

      public class switchCultureInfo: IDisposable

      {

 

            private CultureInfo originalCultureInfo = null;

 

      ///

      /// Costruttore. Memorizza nella variabile membro

      /// la CultureInfo corrente,

      /// per poterla ripristinare nel metodo .

      ///

      public switchCultureInfo()

      {

            originalCultureInfo = Thread.CurrentThread.CurrentCulture;

            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

      }

 

 

      public void Dispose()

      {

            Thread.CurrentThread.CurrentCulture = originalCultureInfo;

      }    

   }

}

 

 

Ed ecco come si può usarla per proteggere un’operazione che altrimenti genererebbe la COMException:

 

 

using Microsoft.VisualBasic;

using Utilities;

 

private void MyColorRange(object Rng, Color Col)

{

 

  using (new switchCultureInfo())

      ((Excel.Range)Rng).Interior.Color = Information.RGB(Col.R, Col.G, Col.B);

}

 

Nell’esempio si imposta il colore di una cella di Excel a partire da un oggetto System.Drawing.Color del Framework. Da notare che per convertire la structure System.Drawing.Color (che è a 24 bit) nell’oggetto Color di Excel il modo migliore è usare il metodo RGB della classe Microsoft.VisualBasic.Information.

Questo è uno dei rarissimi casi in cui può essere consigliabile includere il namespace Microsoft.VisualBasic in un progetto C#!!!

?>

posted @ 11.28