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

时间:2013-05-06 08:29:22

标签: c# .net excel file

我有一些麻烦要说明为什么我会遇到异常。我有这样的事情:

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正在返回真实。只是想明确这一点;)

4 个答案:

答案 0 :(得分:14)

这是因为涉及两个流程,每个流程都有自己的当前工作目录(CWD)。

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

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

path = System.IO.Path.GetFullPath(path);
在将path传递给Workbooks.open(path)

之前

可能可以通过使用ExecuteExcel4Macro调用宏来更改Excel的CWD。

请参阅此处了解详情:Set Current Directory in Excel.Application via .NET Office PIA

答案 1 :(得分:2)

这是因为Excel是除.exe之外的另一个进程,而Workbook.Open中的filename参数与File.Exists中的filename参数略有不同。

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

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

因此,您应始终在此方案中使用绝对路径。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我发现to this for details非常有帮助。为Workbooks.Add()方法设置相对路径也很有用。这是我的参考代码:

# Due to possible changes in the u-boot version, we might have some
# issues flashing gpt or recognizing the _a/_b partitions.
# Just to be safe, flash and reboot to the updated version
fastboot \
  flash gpt        "${OS}"/partition-table.img \
  flash u-boot     "${VENDOR}"/u-boot-edison.bin \
  erase misc \
  reboot bootloader \
  "$@"
sleep 5  <----- Add this line