8

我很难理解为什么会出现异常。我有这样的事情:

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是真的,但仍然找不到文件?如果我使用的是绝对路径,那么它可以工作。为什么?我想在没有绝对路径的情况下使用它,有什么想法吗?谢谢

编辑:当然与file.xls我的文件夹在同一个文件夹中.exe-> 这就是为什么(如预期的那样)File.Exists返回 true。只是想弄清楚这一点;)

4

4 回答 4

18

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

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

您可以使用以下方法解决此问题:

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

在传递path给之前Workbooks.open(path)

可以通过调用宏来更改 Excel 的CWDExecuteExcel4Macro

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

于 2013-05-06T09:08:29.523 回答
2

这是因为 Excel 是 .exe 之外的另一个进程,并且 Workbook.Open 中的文件名参数与 File.Exists 中的文件名参数的行为略有不同。

当您调用 File.Exists 时,文件名参数可以是绝对的或相对的。如果你使用 relative,它是相对于你的 .exe 的,所以它会找到放在你 .exe 文件夹中的文件。

当您创建 Excel.Application 对象时,您将获得一个新进程,该进程具有与 .exe 不同的工作目录。另请注意,当您将相对文件名路径传递给 Workbook.Open 函数时,它不会在 Excel 的工作目录中查找文件,而是使用 Office 的默认文档文件夹(通常是“我的文档”)。

因此,在这种情况下,您应该始终使用绝对路径。

于 2013-05-06T09:13:13.727 回答
0

我认为这是因为 xlApp.Workbooks.Open 函数只知道绝对路径,而不是 File.Exists 函数

于 2013-05-06T09:11:45.740 回答
0

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

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

string path = "TestTemplete.xltx";
path = System.IO.Path.GetFullPath(path);
Workbook wb = xlApp.Workbooks.Add(path);
于 2017-05-27T04:14:30.963 回答