Un problema che si potrebbe incontrare durante l’utilizzo di oggetti Microsoft.Interop.Office.Excel e l’impossibilità di poter esportare file, blocco dovuto ad un particolare messaggio di errore:
Formato vecchio o libreria di tipo non valido. (Exception from HRESULT: 0×80028018 (TYPE_E_INVDATAREAD)).
Questo errore, all’interno di applicazioni web, è dovuto ad una differenza di Cultura tra il Software Microsoft Office installato sulla macchina Server e quella del Web Server stesso. La soluzione al problema è molto semplice, durante l’esecuzione di operazioni che richiamano oggetti Excel è necessario cambiare, sul web server, il contesto di esecuzione, impostando una cultura (definita principalmente dalla lingua stessa) uguale a quella del software.
Ho pensato di implementare un oggetto in grado di fare uno switch sulla lingua di esecuzione del server web in base ad un parametro memorizzato all’interno del web.config, in questo modo abbiamo la possibilità di poter modificare manualmente è molto facilmente la lingua di installazione di office nel caso in cui dovessimo passare dal contesto “Sviluppo” ad “Esercizio”.
Apriamo il file web.config, posizionandoci sulla sezione appSettings scriviamo:
Con questo esempio supponiamo di avere un server in cui è installato IIS in inglese e Microsoft Office in italiano, dopo aver inserito il parametro all’interno del web.config proseguiamo creando all’interno della nostra applicazione web un nuovo oggetto:
public class MsCultureSwitch : IDisposable
{
public static string CultureInfoName
{
// Valore che viene prelevato dal web.config
get { return ConfigurationManager.AppSettings["CultureInfo"]; }
}
private CultureInfo originalCulture = null;
public MsCultureSwitch()
{
originalCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo(CultureInfoName);
}
public void Dispose()
{
Thread.CurrentThread.CurrentCulture = originalCulture;
}
}
Ora rimane un ultima cosa da fare, la più importante, avviare la generazione del file Excel, il procedimento è molto semplice:
using(MsCultureSwitch msCulture = new MsCultureSwitch())
{
//Excel engine qui.
}
Spero che questa breve guida sia di aiuto per chi come me ha già perso molto tempo sull’argomento!
Enjoy!
Grazie, mi hai salvato la vita, stavo impazzendo per risolvere questo errore!
Grazie, avevo letto una guida in inglese ma sinceramente non ci ho capito una mazza, ora è molto più chiaro, anzi ora funziona utilizzando la tua classe (ho apportato alcune modifiche per renderla “amichevole” alla mia applicazione).