2013-05-06 27 views
5

Neden bir istisna alıyorum anlama konusunda bazı sorunum var.Excel: yalnızca mutlak yol kullanılıyorsa dosyayı açabilir, neden?

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

İstisna:: Böyle bir şey var

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

Eh that's yüzden seni File.Exists ile kontrol, bu yüzden bu durum anlamıyorum. Peki bu nasıl çalışır, File.Exists doğru, ancak dosya hala bulunamıyor? Mutlak bir yol kullanıyorum, o zaman çalışıyor. Niye ya? Bunu mutlak yoldan, herhangi bir fikrin olmadan kullanmak isterim? Teşekkür ederiz

Düzenleme: tabiki file.xls benim .exe ile aynı klasörde var -> that´s why (beklendiği gibi) File.Exists doğru döndürüyor. Sadece bunu açık yapmak istedim;)

cevap

13

Bu, her biri kendi Geçerli Çalışma Dizini'ne (CWD) sahip olan iki işlemin olması nedeniyle olur.

İşleminiz (aradığınız File.Exists()), kullandığınız dosyayı tuttuğunuz bir CWD'ye sahiptir. Excel, elbette dosyayı tutmayan farklı bir CWD'ye (muhtemelen Excel uygulamasının yeri) sahiptir.

kullanarak bunları düzeltebilirsiniz:

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

Workbooks.open(path)

için path geçirmeden önce ExecuteExcel4Macro kullanarak bir makro arayarak Excel CWD değiştirmek mümkün olabilir.

bazı detayları için buraya bakınız: Set Current Directory in Excel.Application via .NET Office PIA

+0

Teşekkür ederim, şimdi anladım. GetFullPath kullanmak için çözüm güzel bir çözümdür :) – sabisabi

0

i xlApp.Workbooks.Open işlevi yalnızca mutlak yolunu bildiği için öyle düşünüyorum, değil Excel başka süreç daha uzun olduğundan File.Exists

Bu
2

işlev sever Workbook.Open dosyasındaki .exe ve dosya adı parametresinin File.Exists dosyasındaki dosya adı parametresinden biraz farklı bir davranışı vardır.

File.Exists'i çağırdığınızda, dosya adı parametresi mutlak veya göreli olabilir. Göreceli olarak kullanırsanız, .exe dosyanızın göreceli bir değeri vardır; bu nedenle, .exe dosyanızın dosyasına yerleştirilmiş dosyayı bulacaktır.

Bir Excel.Application nesnesi oluşturduğunuzda, .exe'nizden ayrı bir çalışma dizini ile yeni bir işlem alırsınız. Ayrıca, Workbook.Open işlevine göreli bir dosya adı yolunu ilettiğinizde, dosyanın Excel'in çalışma dizininde görünmeyeceğini, bunun yerine Office için varsayılan belge klasörünü (genellikle "Belgelerim") kullanacağını unutmayın.

Bu senaryoda her zaman mutlak yolu kullanmalısınız.

0

Matthew Watson's answer Çok faydalı buldum. Workbooks.Add() yöntemi için göreli bir yol belirlemek de yararlıdır. İşte referans için benim kodum:

İlgili konular