Domanda

Ambiente:

Windows XP macchina
Sia Excel 2007 ed Excel 2003 installato (in questo ordine, non in ordine cronologico).
C # 3.5

Problema:

Quando uso i PIA per fare un po 'di office automation, io uso la seguente riga di codice:

var excel = new ApplicationClass();

La versione del PIA si riferisce specificamente ad esso come Excel 12.
C: \ WINDOWS \ assembly \ GAC \ Microsoft.Office.Interop.Excel \ 12.0.0.0__71e9bce111e9429c \ Microsoft.Office.Interop.Excel.dll
Ma:

 excel.Version;//this is 11.0 instead of 12.0

In questo modo, quando si tenta di aprire un file con estensione xlsx, mi mette in guardia circa la funzionalità persa nella conversione di file, e si apre con Excel 2003. Sono abbastanza sicuro che ha a che fare con l'ordine di installazione essendo 2007 - > 2003, ma non riesco a disinstallare 2003 sulla mia macchina b / c abbiamo un po 'di office automation sul nostro web server per un progetto non correlato che utilizza Excel 2003.

Ho guardato la roba Policy.11.0.Microsoft.Office.Interop.Excel.config, ma si dice

<bindingRedirect oldVersion="11.0.0.0" newVersion="12.0.0.0"></bindingRedirect>

Quindi, io sono in perdita. Perché non posso dire al COM Interop quale versione di Excel da usare?

È stato utile?

Soluzione

Non si può di programmazione comandare quale versione di Excel da usare. I PIA dettare solo l'interfaccia, o modello di oggetti, si sta sviluppando contro. Ma quale versione di Excel è effettivamente in esecuzione è controllata dal Registro di sistema.

Quando si tratta di gestire i PIA, tuttavia, sarà effettivamente eseguito contro il PIA più alto livello installata sul sistema. Quindi, se si svilupperà contro l'Excel 2003 PIA, ma il cliente ha di Excel 2007 con l'Excel 2007 PIA, il codice verrà eseguito contro l'Excel 2007 PIA - e dovrebbe funzionare bene, perché il PIA Excel 2007 è compatibile. Cioè, ogni versione PIA numero più alto (e modello a oggetti di Excel) è compatibile ai comandi compilati contro una PIA più vecchio e più vecchio modello a oggetti di Excel. Si noti che se il cliente aveva entrambi i PIA Excel 2007 ed Excel 2003 sulla macchina, allora il PIA più alto con versione caricherebbe, a prescindere da quale versione di Excel è in esecuzione -. In modo che l'Excel 2007 PIA correrebbe, se entrambi i PIA erano disponibili

[Edit: Un avvertimento è che i PIA Excel 2007 dovrebbe essere compatibile al 100% quando si usano VB.NET o C # 4.0. Se si utilizza C # 3.0 o al di sotto, il fatto che i parametri opzionali sono in realtà necessari quando viene chiamato da C # 3.0 o al di sotto creerà una pausa in qualche codice durante l'esecuzione contro il PIA-versione superiore o modello a oggetti. E 'relativamente raro, però, e con C # 4.0, questo problema dovrebbe andare via, in teoria.]

Ok, quindi non si hanno un sacco di controllo sui PIA perché il PIA che si sviluppato contro non controlla in realtà che PIA sarà effettivamente in esecuzione sulla macchina client.

Non hai un sacco di controllo su cui viene lanciato entrambe le versioni di Excel. Ad esempio, quando si crea una nuova istanza di Excel tramite:

Excel.Application excelApp = new Application();

L'applicazione Excel caricato è impostata secondo la versione corrente impostato nel Registro di sistema. La versione corrente viene salvata in:

HKEY_CLASSES_ROOT\Excel.Application\CurVer

Sembra che il tasto 'CurVer' nel tuo caso avrà un valore predefinito di 'Excel.Application.11', invece di 'Excel.Application.12'. La modifica di questa sola potrebbe fare il trucco, ma io preferirei fare una riparazione invece per assicurarsi che tutte le impostazioni del Registro vengono corretti in modo corretto. (E non poteva sapere quello che tutte le impostazioni dovrebbero essere.) Ok, ho appena trovato un altro: si sarebbe anche bisogno di cambiare:

[HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\ProgID]

per contenere un valore di "Excel.Application.12". Ma vi consiglio vivamente l'esecuzione di una riparazione, invece. Non so che cosa potrebbe essere necessario cambiare altre impostazioni, in modo da cambiare a mano è un po 'rischioso.

Inoltre, si dovrebbe trovare i seguenti tasti così:

HKEY_CLASSES_ROOT\Excel.Application.11
HKEY_CLASSES_ROOT\Excel.Application.12

Perché queste sono le versioni di Excel che sono stati installati.

(Vedere qui per un'ulteriore discussione.)

  

Sono abbastanza sicuro che ha a che fare con la   ordine che è 2.007 installare -> 2003

Sì, questo è corretto al 100%. Si potrebbe provare a eseguire una riparazione su Excel 2007, questa sarebbe la cosa più facile da fare. Se questo non funziona, quindi vorrei disinstallare entrambi e poi entrambi reinstallare. Vorrei disinstallare Excel 2003 e quindi disinstallare 2007 (invertendo l'ordine in cui sono stati installati) e quindi installare Excel 2003 e quindi installare Excel 2007 in modo che si sta installando entrambe le versioni nell'ordine corretto.

Ma tenere a mente che, così facendo, Excel 2007 verrà eseguito per impostazione predefinita quando si chiama Excel.Application excelApp = new Application().

La pratica consigliata è non di avere entrambe le versioni di Excel in esecuzione sulla macchina dello sviluppatore. Per ulteriori informazioni, consultare:

Ho usato per avere più versioni di Excel sulla mia stessa macchina di sviluppo, e io personalmente sentito che i lati negativi non erano così complicato come questi articoli rendere il suono. In generale, l'Excel 2007 PIA è retrocompatibile-alla Excel 2003 PIA e tutto funziona bene. Ma una volta ho avuto in un pasticcio di registro simile al tuo e ha deciso di "fare la cosa giusta". Ho disinstallato entrambi e solo allora reinstallato Excel 2007.

Da lì ho installato Virtual PC, che è gratuito (VM ware è in realtà un po 'meglio, ma non è gratuito) e poi installato le mie versioni inferiori di Excel per 2003, 2002, 2000 e '97 su macchine virtuali separati. E 'sicuramente un lavoro da impostare, ma una volta fatto questo, tutto è pulito al 100%.

Detto questo, non credo che ci vuole in realtà sviluppano contro Bassa versioni di Excel su una macchina virtuale, sarebbe troppo difficile da usare Visual Studio ospitato all'interno di una macchina virtuale. Così queste macchine virtuali sono buone solo per testare la distribuzione per assicurarsi che il sistema può funzionare contro varie configurazioni client. Dare un senso?

Spero che questo aiuti!

Mike

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top