2013-05-06 6 views
5

Ho qualche problema a capire perché sto ottenendo un'eccezione. Ho qualcosa di simile:Excel: può aprire il file solo se si utilizza il percorso assoluto, perché?

string path = "file.xls"; 
if (File.Exists(path)) 
{ 
    Excel.Application xlApp = new Excel.Application(); 
    Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(path); //exception 
    //... 
} 

Eccezione:

Unhandled Exception: System.Runtime.InteropServices.COMException: 'file.xls' could not be found 

Bene è per questo sto controllando con File.Exists, così io non ottenere questa eccezione. Quindi, come funziona, File.Exists è vero, ma il file non può ancora essere trovato? Se sto usando un percorso assoluto, allora funziona. Perché? Mi piacerebbe usare questo senza il percorso assoluto, qualche idea? Grazie

Modifica: ovviamente lo file.xls si trova nella stessa cartella del mio .exe -> ecco perché (come previsto) File.Exists restituisce true. Volevo solo chiarirlo;)

risposta

13

Ciò accade perché sono coinvolti due processi, ciascuno dei quali ha la propria directory di lavoro corrente (CWD).

Il processo (quello che chiama File.Exists()) ha un CWD che si verifica per contenere il file che si sta utilizzando. Excel ha un CWD diverso (probabilmente il percorso dell'eseguibile di Excel) che ovviamente non contiene il file.

È possibile risolvere questo problema utilizzando:

path = System.IO.Path.GetFullPath(path); 

prima di passare path-Workbooks.open(path)

E potrebbe essere possibile modificare CWD di Excel chiamando una macro utilizzando ExecuteExcel4Macro.

Vedi qui per alcuni dettagli: Set Current Directory in Excel.Application via .NET Office PIA

+0

Grazie, ora ho capito. La soluzione per utilizzare GetFullPath è una soluzione piacevole :) – sabisabi

0

credo che sia perché la funzione xlApp.Workbooks.Open conosce solo il percorso assoluto, non ama File.Exists funzionano

2

Questo perché Excel è un altro processo che il tuo .exe e il parametro filename in Workbook.Open ha un comportamento leggermente diverso rispetto al parametro filename in File.Exists.

Quando si chiama File.Exists, il parametro filename può essere assoluto o relativo. Se usi parente, è relativo al tuo .exe, quindi troverà il file inserito nella cartella .exe.

Quando si crea un oggetto Excel.Application si ottiene un nuovo processo con una directory di lavoro separata dal proprio .exe. Si noti inoltre che quando si passa un percorso relativo al nome file alla funzione Workbook.Open, non cercherà il file nella directory di lavoro di Excel, ma utilizzerà invece la cartella documenti predefinita per Office (in genere "Documenti").

Quindi, è sempre necessario utilizzare il percorso assoluto in questo scenario.

0

Ho trovato Matthew Watson's answer molto utile. È anche utile impostare un percorso relativo per il metodo Workbooks.Add(). Ecco il mio codice di riferimento:

Excel.Application xlApp = new Excel.Application(); 

string path = "TestTemplete.xltx"; 
path = System.IO.Path.GetFullPath(path); 
Workbook wb = xlApp.Workbooks.Add(path); 
Problemi correlati