単純なアプリケーションを作成し、IIS6.でホストしました。コードでは、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ビットのエンタープライズエディション Service Pack 2
私はインターネットで見つけた多くの可能な解決策を試しましたが、それらのどれも私のために働いていませんでした。
私が試したいくつかの解決策は以下です
1)パス "C:\ Windows\SysWOW64\config\systemprofile"でデスクトップアプリケーションを作成2)DCOMCNFGでMicrosfot.EXcelApplicaitonの完全な権限/制御を設定3)タスクマネージャーですべてのExcelインスタンスを削除
この点で私を助けてください、これは単なるサンプルアプリですが、私の元のアプリでは主にExcelから/へのデータの読み取りと書き込みについてです。
より良いのは、Open XMLに移行するか、以下のように構成することです
Com +の構成
3. DCOM ConfigでMicrosoft Excelアプリケーションのセキュリティ設定を変更します。
[コントロールパネル]-> [管理ツール]-> [コンポーネントサービス]-> [コンピューター]-> [myComputer]-> [DCOM構成]-> [Microsoft Excelアプリケーション]。
右クリックしてプロパティダイアログを取得します。 [セキュリティ]タブに移動し、権限をカスタマイズします
こちらの投稿を参照してください: Excelオブジェクトの作成中のエラー 、 COMを使用したWCFでのExcel操作
場合によっては、新しいアプリケーションプールを作成しても、DCOMCNFGで解決できないことがあります。次に、別の方法があります:
アプリケーションプールのIdentity(モデル名)をLocalSystemに設定します。
私は根本原因を知りませんが、それは私の問題を一度解決します。
応答するには遅すぎます。しかし、これがまだ問題に直面している人を助けるなら。私はこれを修正しました:
→サイトを共有プールではなく専用プールに設定します。
→32ビットアプリケーションのサポートを有効にします。
→アプリケーションプールのIDをLocalSystemに設定します。
IISユーザーまたはグループユーザーに読み取り/書き込み許可を与える
スタート->実行-> inetmgr
デフォルトWebサイトのASP.NET認証を有効にします
3. 64ビット(x64)の場合、次のフォルダーを作成します:C:\ Windows\SysWOW64\config\systemprofile\Desktop
32ビット(x86)の場合、次のフォルダーを作成します:C:\ Windows\System32\config\systemprofile\Desktop
Windowsサービスがsystemprofileで実行されている場合、デスクトップフォルダーが必要です。このフォルダーは、XP以前のWindows Serverバージョンで自動的に作成されましたが、VistaおよびWindows 2008 Serverでは作成されませんでした。
私のために働いた解決策は、アプリケーションプールが起動されているユーザーを変更することです(ApplicationPoolIdentityには明らかにCOMオブジェクトにアクセスするための十分な権限がありません)。
幸運を!
次のことを試してください。
詳細を見つけることができます here
個人的に、私はこれらの正確なステップを実行しました:
*相互運用機能アセンブリのインストール:MicrosoftのWebサイトからインストールできます https://www.Microsoft.com/en-us/download/details.aspx?id=3508&tduid=(09cd06700e5e2553aa540650ec905f71)(256380) (2459594)(TnL5HPStwNw-yuTjfb1FeDiXvvZxhh.RQ)()
*アセンブリバージョンの確認:開発マシンと実稼働マシンのアセンブリのバージョンを確認します。アセンブリはGACにあります。未亡人7では、このフォルダーは%windir%\ Assemblyです。
*デスクトップフォルダーの作成:サービスはsystemprofileの下のデスクトップフォルダーを使用するため、フォルダーがない場合はこのフォルダーを作成する必要があります。フォルダーの場所は次のとおりです。64ビットアプリケーションの場合:C:\ Windows\SysWOW64\config\systemprofile\Desktop 32ビットアプリケーションの場合:C:\ Windows\System32\config\systemprofile\Desktop
* DCOMユーザー権限を追加します。
---実行ウィンドウを起動し、「dcomcnfg」と入力します。
---コンポーネントサービスの展開->コンピューター->マイコンピューター-> DCOM構成。
--- Microsoft Excelアプリケーションを探します。それを右クリックしてプロパティを選択し、[セキュリティ]タブを選択します。
---「起動許可とアクティベーション許可」および「アクセス許可」の下の「カスタマイズ」ラジオボタンを選択し、両方の「編集」ボタンをクリックして、次のようにユーザーを追加します。
--------- [追加]ボタンとユーザー 'IIS_IUSRS'および 'NETWORK SERVICE'をクリックし、完全な権限を付与します。
--- [ID]タブに移動し、[インタラクティブユーザー]オプションを選択します。
--- [適用]をクリックして[OK]をクリックします。
サーバーにExcelがインストールされていますか?使用している相互運用インターフェースは、Excelアプリケーションのインストールが必要なautomateExcelに使用されます。各ページリクエストサイクルは、Excel.exeの個別のインスタンスを起動する可能性があります。これをWebアプリケーションの一部として行うことは強くお勧めします。
なぜこれをしたいのですか? Excelドキュメントを生成する場合は、muchより良い方法があります。このスレッドの他の場所で言及されているOpenXMLも含まれます。 サーバーでExcelを実行しないでください!
OpenXML SDKダウンロードへのリンク: http://www.Microsoft.com/en-us/download/details.aspx?id=5124
簡単なアプリケーションを作成しました
アプリケーションのターゲットプロセッサは何ですか?私はそれがx86
だと推測しているので、x64
またはanycpu
に設定します。
あなたが抱えている問題は、64ビットプロセスが32ビットDLLにアクセスしようとしているためだと思います。
また、ターゲットプロセッサを変更できない場合は、IISのアプリケーションプール設定から32ビットアプリケーションを有効にしてみてください。
[〜#〜] 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 question
このリンクを使用して、Excel、Wordオブジェクトの「アクセス拒否」問題を解決できます。これは本当に便利なリンクです
これは許可の問題のようです。 processMonitorを実行して、必要な許可を決定することをお勧めします。
2日前にこの問題に出くわし、完全に2日間を費やしたため、DCOMCNFGでIUSRユーザーグループへのアクセス権を与える必要があることがわかりました->マイコンピューターのプロパティ-> Comセキュリティ->起動とアクティベーションのアクセス許可- >デフォルトを編集し、IUSRにすべての権限を付与します。
それが誰かを助けることを願っています...
これを使って
<system.web>
<identity impersonate="true"
userName="User Name"
password="Password" />
`enter code here`</system.web>
-トニー-