33

簡単なアプリケーションを作成し、IIS6.0でホストしました。コードでは、Excel オブジェクトをインスタンス化しているだけです。

using excel = Microsoft.Office.Interop.Excel.Application;

namespace TestHosting
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            excel excelObj=new Microsoft.Office.Interop.Excel.Application();
        }
    }
}

次のエラーが表示されます

 "Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005 Access is denied." (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).

システム構成:

Windows Server 2008、64 ビットのエンタープライズ エディション。 サービス パック 2

インターネットで見つけた多くの可能な解決策を試しましたが、どれもうまくいきませんでした。

私が試したいくつかの解決策は以下のとおりです

1) パス "C:\Windows\SysWOW64\config\systemprofile" の下にデスクトップ アプリケーションを作成する 2) DCOMCNFG で Microsfot.EXcelApplicaiton の完全な権限/制御を設定する 3) タスク マネージャーですべての Excel インスタンスを強制終了する

この点で私を助けてください.

4

14 に答える 14

52
  1. サーバーに Office ランタイムがインストールされていることを確認します。
  2. Windows Server 2008 を使用している場合、Office 相互運用機能を使用するのは時間のかかる構成です。手順は次のとおりです。

Open XML に移行するか、以下のように構成することをお勧めします。

  • MS Office Pro の最新版をインストールします (私は 2010 Pro を使用しました)。
  • ユーザー ExcelUser を作成します。WordUser に管理者グループを割り当てる
  • [コンピューター] -> [管理] に移動します
  • 以下のオプションでユーザーを追加
  • ユーザー オプション パスワード無期限
  • パスワードは変更できません

Com+ 構成

  • [コントロール パネル] - > [管理者] -> [コンポーネント サービス] -> [DCOM 構成] に移動します。
  • Microsoft Word 97 - 2003 のプロパティを開く
  • 一般 -> 認証レベル: なし
  • セキュリティ -> 3 つの権限をすべてカスタマイズして、全員を許可する
  • ID -> このユーザー -> ExcelUser /password を使用
  • Excel アプリを起動して、問題がないことを確認します

3.DCOM Config で Microsoft Excel アプリケーションのセキュリティ設定を変更します。

コントロール パネル --> 管理ツール --> コンポーネント サービス --> コンピューター --> myComputer --> DCOM 構成 --> Microsoft Excel アプリケーション。

右クリックしてプロパティ ダイアログを表示します。[セキュリティ] タブに移動し、アクセス許可をカスタマイズします

ここの投稿を参照してください: Excel オブジェクトの作成中のエラー、COM を使用した WCFでのExcel 操作

于 2013-08-02T12:07:07.760 に答える
41

場合によっては、新しいアプリケーション プールを作成し、DCOMCNFG 経由で解決できないことがあります。次に、別の方法があります。

アプリケーション プールのID (モデル名) をLocalSystemに設定します。

根本的な原因はわかりませんが、問題は一度解決します。

于 2014-03-13T15:08:36.423 に答える
4
  1. IIS ユーザーまたはグループ ユーザーに読み取り/書き込み権限を付与する

  2. 開始 -> 実行 -> inetmgr

    既定の Web サイトの ASP.NET 認証を有効にする

3. 64 ビット (x64) の場合、次のフォルダーを作成します: C:\Windows\SysWOW64\config\systemprofile\Desktop

32 ビット (x86) の場合、次のフォルダーを作成します: C:\Windows\System32\config\systemprofile\Desktop

Windows サービスが systemprofile の下で実行されている場合、Desktop フォルダーが必要です。このフォルダは、XP およびそれ以前の Windows Server バージョンでは自動的に作成されましたが、Vista および Windows 2008 Server では作成されませんでした。

于 2013-07-22T11:57:40.897 に答える
3

次のことを試してください。

  1. Office 相互運用機能アセンブリがインストールされていることを確認します。
  2. 開発と運用のアセンブリのバージョンを確認します。
  3. systemprofile の下に Desktop フォルダーを作成します。
  4. サービス ユーザーに対して DCOM セキュリティを明示的に設定します。

詳細はこちら

于 2014-01-27T05:06:53.380 に答える
3

私にとってうまくいった解決策は、アプリケーションプールが開始されたユーザーを変更することです(ApplicationPoolIdentityには明らかにCOMオブジェクトにアクセスするための十分な権限がありません)。

幸運を!

于 2013-09-20T08:59:27.740 に答える
2

サーバーにExcelがインストールされていますか?使用している相互運用インターフェイスは、Excel アプリケーションがそこにインストールされている必要がある Excelを自動化するために使用されます。ページ リクエスト サイクルごとに、Excel.exe の個別のインスタンスが起動される可能性があります。これを Web アプリケーションの一部として実行しないことを強くお勧めします。

なぜこれをしたいのですか?Excel ドキュメントを生成したい場合は、このスレッドの他の場所で言及されている OpenXML など、これを行うためのはるかに優れた方法があります。サーバー上で Excel を実行しないでください。

OpenXML SDK ダウンロードへのリンク: http://www.microsoft.com/en-us/download/details.aspx?id=5124

于 2013-08-07T00:40:32.257 に答える
2

簡単なアプリケーションを作成しました

アプリケーションのターゲット プロセッサは何ですか? 私はそれがそうだと推測していますx86-それで、x64またはに設定しanycpuます。

あなたが抱えている問題は、64 ビット プロセスが 32 ビット dll にアクセスしようとしていることが原因だと思います。

また、ターゲット プロセッサを変更できない場合は、IIS のアプリケーション プール設定から 32 ビット アプリケーションを有効にしてみてください。

于 2013-08-06T21:41:14.183 に答える
1

これは許可の問題のようです。processMonitor を実行して、必要なアクセス許可を判断することをお勧めします。

于 2013-08-06T20:50:03.453 に答える
1

NPOIを使用してExcelを読み書きします。無料でオープン ソースです。

たとえば

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

//.....

private void button1_Click(object sender, EventArgs e)
{
    HSSFWorkbook hssfwb;
    using (FileStream file = new FileStream(@"c:\test.xls", FileMode.Open, FileAccess.Read))
    {
        hssfwb= new HSSFWorkbook(file);
    }

    ISheet sheet = hssfwb.GetSheet("Arkusz1");
    for (int row = 0; row <= sheet.LastRowNum; row++)
    {
        if (sheet.GetRow(row) != null) //null is when the row only contains empty cells 
        {
            MessageBox.Show(string.Format("Row {0} = {1}", row, sheet.GetRow(row).GetCell(0).StringCellValue));
        }
    }
}  

このStackoverflowの質問を参照してください

于 2013-08-07T04:57:03.847 に答える
0

これを使って

管理者グループにユーザーを作成する

以下のように、このユーザーの詳細を Web 構成に追加します

<system.web>
   <identity impersonate="true"
    userName="User Name"
    password="Password" />
    `enter code here`</system.web>

IIS を再起動して再度確認する

-トニー-

于 2013-12-10T13:26:58.307 に答える