Excel:如果使用绝对path只能打开文件,为什么?

我有一些麻烦来说明为什么我会得到一个例外。 我有这样的东西:

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

例外:

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

那么这就是为什么我要检查File.Exists ,所以我没有得到这个例外。 那么这是如何工作的, File.Exists是真的,但文件仍然无法find? 如果我使用绝对path,那么它的工作。 为什么? 我想用这个没有绝对path,有什么想法? 谢谢

编辑:当然file.xls是在我的.exe文件相同的文件夹 – >这就是为什么(如预期的) File.Exists返回true。 只是想说清楚;)

发生这种情况是因为涉及两个过程,每个过程都有自己的当前工作目录(CWD)。

你的进程(调用File.Exists() )有一个CWD,它恰好保存了你正在使用的文件。 Excel有一个不同的CWD(可能是Excel可执行文件的位置),当然不包含该文件。

您可以通过使用以下方法解决此问

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

在将path传递到Workbooks.open(path)

可能通过使用ExecuteExcel4Macro调用一个macros来改变Excel的CWD。

有关详细信息,请参阅此处: 通过.NET Office PIA在Excel.Application中设置当前目录

这是因为Excel是另一个比您的.exe和在Workbook.Open中的文件名参数具有稍微不同的行为比File.Exists中的文件名参数的过程。

当您调用File.Exists时,filename参数可能是绝对的或相对的。 如果您使用相对,它是相对于您的.exe,所以它会find放置在您的.exe文件夹中的文件。

当你创build一个Excel.Application对象的时候,你会从你的.exe文件中得到一个独立的工作目录。 还要注意,当您将相对文件名path传递给Workbook.Open函数时,它不会在Excel的工作目录中查找该文件,而是使用Office的默认文档文件夹(通常为“我的文档”)。

所以,你应该总是在这种情况下使用绝对path。

我想这是因为xlApp.Workbooks.Open函数只知道绝对path,不喜欢File.Exists函数

我发现Matthew Watson的回答非常有帮助。 为Workbooks.Add()方法设置相对path也很有用。 这里是我的代码供参考:

 Excel.Application xlApp = new Excel.Application(); string path = "TestTemplete.xltx"; path = System.IO.Path.GetFullPath(path); Workbook wb = xlApp.Workbooks.Add(path);