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);