Sempre riguardo la conversione di documenti Office 2007 in PDF, mi è capitata questa cosa. Con documenti di word e powerpoint (creati con versoni precedenti di Office) non ho avuti mai problemi, invece con tutti i workbook excel che cercavo di aprire (richiamando il metodo Open), inizialmente mi tornava sempre questa eccezione COM:

Formato vecchio o libreria di tipo non valido. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))

Questo perchè ho installato il pacchetto Office 2007 su un Windows XP in lingua italiana. Questo problema penso che attacchi Excel per il fatto che è basato molto sul tipo di lingua con cui vengono gestite le date e i valori numerici.
Perciò .. Come fare ?
Alla fine è risultato abbastanza semplice... serve una classe che durante le operazioni con il modello ad oggetti di Excel, cambi semplicemente la cultura del thread corrente mettendola allo stesso valore della lingua con cui è stato installato Office 2007:

public class SwitchCulture : IDisposable

{
private CultureInfo originalCulture = null;

public SwitchCulture()
{
originalCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
}

public void Dispose()
{
Thread.CurrentThread.CurrentCulture = originalCulture;
}
}

Da utilizzare in questo modo:

using Microsoft.Office.Interop.Excel;


private void ExcelToPdf(SPWeb web, SPListItem newItem, string filename, string fileurl)
{
using (new SwitchCultureInfo())
{
ApplicationClass excelApplication = new ApplicationClass();
Workbook excelWorkBook = null;
object paramMissing = Type.Missing;

//parametri ...
excelWorkBook = excelApplication.Workbooks.Open(fileName.ToString(),
paramMissing, paramMissing, paramMissing, paramMissing,
paramMissing, paramMissing, paramMissing, paramMissing,
paramMissing, paramMissing, paramMissing, paramMissing,
paramMissing, paramMissing);
}
}

Fatto questo vedrete che l'apertura di un workbook Excel attraverso il modello ad oggetti andrà sempre liscia come l'olio.


TAGS: [Office 2007] [Excel] [VSTO]
Commenti(7) - Posted @ 9/10/2007 3:39:10 PM - Categoria: .NET General - Permalink - Share on twitter | facebook


COMMENTI
Autore: Andrea - scritto il 10/26/2007 7:34:30 PM
ciao Peppe
ho letto con interesse questo tuo post dato che mi ritrovo nello stesso contesto, cambia solo il metodo che scatena questo bug.
mi spiego meglio:
sto usando le pias per un tool in vb che maneggi excel 2007 con vs2005 su vista business x64, tutto in italiano.
non ho nessun problema ad aprire e modificare il documento mentre mi scatena l'errore:
"Formato vecchio o libreria di tipo non valido. (Eccezione da HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"

quando invoco il metodo xlApp.ActiveWorkbook.Save().
sai dirmi qualcosa in proposito?

Autore: Peppe - scritto il 10/26/2007 11:01:48 PM
Hai provato a cambiare la lingua del thread corrente in italiano ?

Autore: Andrea - scritto il 10/29/2007 11:02:45 AM
ciao Peppe.
si ho provato la tua tip, ma senza successo...

Autore: Andrea - scritto il 10/29/2007 11:30:49 AM
Anche perche la lingua del thread corrente è l'italiano.
tutti i componenti in gioco sono in italiano.
ma anche provando a forzarla l'esito rimane invariato...

Autore: Andrea - scritto il 10/29/2007 12:22:32 PM
ciao Peppe
volevo aggiornarti sul mio problema.
la cosa l'ho risolta usando il metodo saveas().
Ho pensato a problemi di attributi ma comunque il documento lo modifico prima del tentativo di salvataggio.
misteri della fede...microsoft. :D
quindi salvo su un temporaneo killo l'originale e rinomino il temporaneo... non è il massimo ma come ben sai il tempo è tiranno.

Autore: Peppe - scritto il 10/29/2007 5:08:58 PM
Non saprei allora..
Ho trovato però questo: http://support.microsoft.com/default.aspx?scid=kb;en-us;320369
che cmq come workaround propone sempre un discorso sulla lingua corrente.

Autore: Rudy - scritto il 2/6/2009 1:47:25 PM
Funziona! Molte grazie...

INSERISCI UN COMMENTO

Nome *
Indirizzo e-mail
(non verrà pubblicato)
Commento *