web-dev-qa-db-ja.com

C#でExcelファイルを開くことができません

プロジェクトに次のC#関数があります。これは、既存のExcelブックオブジェクトを開いて返すことになっています。

Application _excelApp;

// ...

private Workbook OpenXL(string path, string filename)
{
    try
    {
        if (_excelApp == null)
        {
            _excelApp = new Application();
        }

        Workbook workBook = _excelApp.Workbooks.Open(path + filename,   // Name
                                                     0,                 // Do not update links
                                                     true);             // Open read-only

        return workBook;
    }
    catch (Exception e)
    {
        _excelApp = null;
        throw new ArgumentException("Error opening " + path + filename, e);
    }
}

しかし、「C:\」と「scratch.xlsx」を使用して実行すると、Open()呼び出しは次のエラーをスローします。

Microsoft Excel cannot access the file 'C:\scratch.xlsx'. There are several possible reasons:

• The file name or path does not exist.
• The file is being used by another program.
• The workbook you are trying to save has the same name as a currently open workbook.

ファイルとパスは存在します。エラーメッセージからパスをコピーしてコマンドウィンドウに貼り付けたところ、ファイルがExcelに読み込まれました。ファイルはロックされていません。Excelはファイルを正常に開くことができますが、再起動した直後でもプログラムはできません。私はそれを保存しようとはしていません、私はそれを開こうとしているので、最後のオプションは無関係です。

この単純なコードが機能しない理由を理解するのに迷っています。どんな提案でも大歓迎です。

[編集]個人のネットワークドライブ(M :)とUSBスティックからそのファイルを開こうとしました。すべて無駄に。

アプリケーションは実際にはWindowsサービスであり、ローカルシステムアカウントで実行され、レポートを生成します。現在、アクセスの問題はまったくなく、CSVレポートを作成しています。現在、Excelファイルをテンプレートレポートとして開き、さまざまなフィールドに入力できるようにしようとしています。失敗するのはExcelファイルを開いたときです。誰もが提案している管理者アカウントオプションは、CSVファイルを問題なく書き込むことができるので、赤ニシンだと思います。 [/編集]

---アリステア。

10
user41013

次のページを見つけました:

http://social.msdn.Microsoft.com/Forums/en-US/b81a3c4e-62db-488b-af06-44421818ef91/Excel-2007-automation-on-top-of-a-windows-server- 2008-x64

それが言うところ...

オフィス製品のUIを自動化することはサポートされていません。 Windows Server2008とExcel2007は、指定されたステートメントを強制しているようです。

次に、質問者は、コマンドラインプログラムの同じコードに問題はありませんが、Excelファイルを開くことができないWindowsサービスを使用している状況を正確に説明します。

応答では、次のフォルダーを作成することをお勧めします。

Windows 2008 Server x64:C:\ Windows\SysWOW64\config\systemprofile\Desktop

Windows 2008 Server x86:C:\ Windows\System32\config\systemprofile\Desktop

私はこれを試しました、そしてそれは御馳走を働かせました!なぜそれが必要なのか、そして欠点を誰かが説明できますか?

ありがとう、

---アリステア。

34
user41013

プログラムを管理者として実行します。ユーザーが管理者として実行されていない限り、プログラムからC:/にアクセスすることはできません。 ApplicationManifestを変更することで、プログラムを管理者として実行する必要があるユーザーにプロンプ​​トを表示させることができます。 。NETアプリケーションを管理者として強制的に実行するにはどうすればよいですか?

4
Pharap

同じ問題が発生し、「レジストリハック」に関する情報を調査しました。

結局のところ、レジストリ値を変更せず、すべてが正しく機能する別のソリューションを見つけました。

この解決策は...

・Windows 2008 Server x64

このフォルダを作ってください。

  C:\Windows\SysWOW64\config\systemprofile\Desktop

・Windows 2008 Server x86

このフォルダを作ってください。

 C:\Windows\System32\config\systemprofile\Desktop

... dcomcnfg.exeの代わりに。

この操作により、私のシステムのオフィスオートメーションの問題が解消されました。

Excelでファイルを開くには、systemprofileフォルダーにデスクトップフォルダーが必要なようです。

Windows2008から消え、Windows2003にフォルダがあり、このエラーの原因だと思います。

「レジストリハック」より安全だと思います。

この解決策を試してみたら、結果を教えてください。

2
thejustv