我有一些麻烦要说明为什么我会遇到异常。我有这样的事情:
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
正在返回真实。只是想明确这一点;)
答案 0 :(得分:14)
这是因为涉及两个流程,每个流程都有自己的当前工作目录(CWD)。
您的进程(调用File.Exists()
的进程)有一个CWD,它恰好包含您正在使用的文件。 Excel具有不同的CWD(可能是Excel可执行文件的位置),当然不包含该文件。
您可以使用以下方法解决此问题:
path = System.IO.Path.GetFullPath(path);
在将path
传递给Workbooks.open(path)
之前
可能可以通过使用ExecuteExcel4Macro
调用宏来更改Excel的CWD。 p>
请参阅此处了解详情: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)
答案 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