2

バックグラウンド

ASP.NET 2.0 を使用して、いくつかの社内ユーティリティを開発しています。その 1 つは、データベースからいくつかの情報を抽出し、データベースへのクエリに基づくデータを含む多数のスプレッドシートを含む Excel ワークブックを作成することです。

問題

概念実証のプロトタイプ (データベースから 1 つの項目をクエリし、Excel を開いてワークシートにデータを追加する単純な ASP.NET ページ) は、開発用コンピューターでローカルに実行するとうまく機能し、Excel スプレッドシートを問題なく作成して表示できます。要求どおり。ただし、サーバーで実行すると、 Excel をインスタンス化しようとすると次のエラーが発生します。

タイプ 'Microsoft.Office.Interop.Excel.ApplicationClass' の COM オブジェクトをインターフェイス タイプ 'Microsoft.Office.Interop.Excel._Application' にキャストできません。IID '{000208D5-0000-0000-C000-000000000046}' を持つインターフェイスの COM コンポーネントでの QueryInterface 呼び出しが次のエラーにより失敗したため、この操作は失敗しました: No such interface supported (HRESULT からの例外: 0x80004002 (E_NOINTERFACE)) .

解決?

Excel 2003 用の PIA を使用しており、サーバーには Excel 2003 と PIA がインストールされています。これがうまくいかない理由を説明したり、問題を追跡する方法についてのヒントを教えてもらえますか?

ご協力いただきありがとうございます。

4

5 に答える 5

1

ASP.NETアプリケーションプールを実行しているユーザーは、アプリケーションにアクセスできますか?そのユーザーとしてログインし(またはそのユーザーとして実行するようにアプリケーションプールを変更して)、Excelを開いてみてください。それが機能する場合は、失敗しているコードを使用して、そのユーザーとしてサーバー上でWinFormsアプリケーションを実行してみてください。

確かではありませんが、PIAアセンブリはzippy32を介して登録する必要があると思います。

ネットワークサービスとして実行している場合、Excelを起動できないと思われます(インタラクティブログイン、アカウントの制限など)。ASP.NETコードは、アプリケーションプール内で実行されます。IISマネージャーを使用して、アプリケーションプールを実行するユーザーを変更できます。コードが現在実行されているものを確認したい場合は、タスクマネージャーでw3wpプロセスを探してください。

テストのために、アプリケーションプールを変更して、Excelで作業していることがわかっているユーザーとして実行するようにします。

于 2008-11-12T23:08:38.857 に答える
1

Microsoftから(元のソースで強調):

Officeは不安定な動作を示す可能性があるため、Microsoftは現在、無人の非対話型クライアントアプリケーションまたはコンポーネント(ASP、ASP.NET、DCOM、およびNTサービスを含む)からのMicrosoftOfficeアプリケーションの自動化を推奨していません。または、Officeがこの環境で実行されている場合はデッドロック。

あなたがそれをすべきではない理由のリストで:

  • ...多くのサービスは、ユーザープロファイルを持たないアカウント(SYSTEMアカウントやIWAM_ [servername]アカウントなど)で実行されます。そのため、起動時にOfficeが正しく初期化されない場合があります。この状況では、OfficeはCreateObject関数またはCoCreateInstance関数でエラーを返します。Officeアプリケーションを起動できたとしても、ユーザープロファイルが存在しないと、他の機能が正しく動作しない場合があります。
  • 予期しないエラーが発生した場合、または機能を完了するために不特定のパラメーターが必要な場合、Officeは、ユーザーに何をしたいかを尋ねるモーダルダイアログボックスをユーザーに表示するように設計されています。非対話型デスクトップのモーダルダイアログボックスを閉じることはできません。したがって、そのスレッドは無期限に応答を停止(ハング)します。特定のコーディング手法はこの問題の可能性を減らすのに役立ちますが、これらの手法では問題を完全に防ぐことはできません。この事実だけでも、サーバー側の環境からOfficeアプリケーションを実行することは危険であり、サポートされていません。
  • サーバー側のコンポーネントは、複数のクライアントに対して最小限のオーバーヘッドと高いスループットを備えた、再入可能性の高いマルチスレッドCOMコンポーネントである必要があります。Officeアプリケーションは、ほとんどすべての点で正反対です。Officeアプリケーションは、再入可能ではないSTAベースの自動化サーバーであり、単一のクライアントに多様でありながらリソースを大量に消費する機能を提供するように設計されています。

また、コードは次のエラーをスローする可能性があります。

  • CoCreateInstance

    • 実行時エラー「429」:ActiveXコンポーネントはオブジェクトを作成できません
    • 実行時エラー'70':許可が拒否されました
    • CO_E_SERVER_EXEC_FAILURE(0x80080005):サーバーの実行に失敗しました
    • E_ACCESSDENIED(0x80070005):アクセスが拒否されました
    • ハングアップ
    • エラーなしで戻りますが、機能しませんでした

そして最後に:

Officeの設計には制限があるため、Office構成を変更しても、すべての問題を解決するには不十分です。Microsoftは、Officeをサーバー側にインストールする必要がなく、自動化よりも効率的かつ迅速に最も一般的なタスクを実行できるいくつかの代替手段を強くお勧めします。プロジェクトにサーバー側コンポーネントとしてOfficeを含める前に、代替案を検討してください。

于 2012-10-18T14:07:52.013 に答える
1

Aspose(商用)を使用しています。サーバー上のオフィスはあまり楽しいものではありません。

  • ライセンスには注意が必要です。
  • 時々、ハングしているプロセスを強制終了する必要があります。
  • 権利を正しく取得するには、ある程度の努力が必要です。

理由からPI(t)Aと呼ばれています...

于 2008-11-12T23:21:56.100 に答える
1

XLSX ファイル(Office 2007 の新機能ですが、Office 2003 用のプラグインがあります) の使用を検討してください。これは、Excel を必要とせずに操作できる XML ファイルを含む単なる ZIP ファイルです。(XML ベースの) SpreadsheetML は十分に文書化されており、プログラミングするのにそれほど複雑ではありません (Web 上のどこかに LINQ to SpreadsheetML が見つかるかもしれません)。

上で指摘したように、Excel は実際にはサーバー製品ではないため、サーバー上で使用するとあらゆる種類の問題に遭遇する可能性があります。

于 2008-11-12T23:54:23.087 に答える
1

問題は、アプリケーションを IIS にデプロイすると、突然 MTA COM アパートメント内で実行されることだと思います。Excel は STA コンポーネントであるため、MTA 内では作成できないと思います。使用しているページで aspcompat オプションを設定する必要があります

<%@ page aspcompat=true %>

詳細はこちら

于 2008-11-13T00:14:30.177 に答える