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->それが(予想どおり)trueを返す理由File.Existsです。これを明確にしたかっただけです;)

4

4 に答える 4

18

これは、関連する 2 つのプロセスがあり、それぞれに独自の現在の作業ディレクトリ (CWD) があるために発生します。

あなたのプロセス( を呼び出すプロセスFile.Exists())には、使用しているファイルをたまたま保持する CWD があります。Excelには、もちろんファイルを保持しない別のCWD(おそらくExcel実行可能ファイルの場所)があります。

これを修正するには、次を使用します。

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

に渡す前pathWorkbooks.open(path)

を使用してマクロを呼び出すことで、Excel の CWD を変更できる場合がありますExecuteExcel4Macro

詳細については、こちらを参照してください: .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 に答える