2012-03-02 15 views
1

私のWebサイトが展開されているWebサーバー上にExcelファイルがあります。シナリオ、私は、ユーザーがWebサーバーからExcelファイルをダウンロードし、ローカルドライブに保存し、データをエクスポートするために同じファイルパスを選択できる画面があります。 bt以下のエラーが発生するMicrosoft Interopを使用してExcelセルを読み書きする

ASP.NETは要求されたリソースにアクセスする権限がありません。リソースへのアクセス権をASP.NET要求IDに付与することを検討してください。 ASP.NETには、アプリケーションが偽装されていない場合に使用される基本プロセスID(通常、IIS 5では{MACHINE} \ ASPNET、IIS 6ではネットワークサービス)があります。アプリケーションがviaを偽装している場合、IDは匿名ユーザー(通常はIUSR_MACHINENAME)または認証された要求ユーザーになります。ファイルへのASP.NETアクセスを許可するには、エクスプローラでファイルを右クリックし、[プロパティ]を選択して[セキュリティ]タブを選択します。適切なユーザーまたはグループを追加するには、[追加]をクリックします。 ASP.NETアカウントを強調表示し、必要なアクセスのチェックボックスをオンにします。以下

は私のコード

private void btnExportToExcel_Click(object sender, System.EventArgs e) 
    { 
     Microsoft.Office.Interop.Excel.ApplicationClass appExcel = new Microsoft.Office.Interop.Excel.ApplicationClass(); 
     DataSet dsResult = new DataSet(); 
     object missingValue = System.Reflection.Missing.Value; 
     decimal wkOpenBal = 0.00m; 
     decimal wkAddition = 0.00m; 
     decimal wkDisposal = 0.00m; 
     string rptDt = ""; 

     decimal os_p = 0.00M; 
     decimal os_s = 0.00M; 
     decimal closs_16_25 = 0.00M; 
     decimal closs_26 = 0.00M; 
     decimal os_clr_p = 0.00M; 
     decimal os_whs_p = 0.00M; 
     decimal os_clr_s = 0.00M; 
     decimal os_whs_s = 0.00M;   
     decimal mark_to_mkt = 0.00M; 
     decimal mark_to_mkt_error = 0.00M; 


     if(txtWeeklyFile.Value != "") 
     { 
      //DATABASE CALL 
      objBursaSubmission = (IBursaSubmission) ObjectFactory.Instance.GetObject(ObjectIdentifier.BursaSubmissionManager);      
      dsResult = objBursaSubmission.GetReportData(txtRptdt.Text); 

      try 
      { 
       if(dsResult != null && dsResult.Tables[0].Rows.Count > 0) 
       { 
        if(System.IO.File.Exists(txtWeeklyFile.Value.ToString())) 
        { 
         wkOpenBal = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["WK_OPENBAL"]); 
         wkAddition = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["WK_ADDITION"]); 
         wkDisposal = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["WK_DISPOSAL"]); 
         rptDt = dsResult.Tables[0].Rows[0]["LOGICAL_DT"].ToString();     

         os_p = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["OS_P"]); 
         os_s = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["OS_S"]); 
         closs_16_25 = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["CLOSS_16_25"]); 
         closs_26 = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["CLOSS_26"]); 
         os_clr_p = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["OS_CLR_P"]); 
         os_whs_p = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["OS_WHS_P"]); 
         os_clr_s = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["OS_CLR_S"]); 
         os_whs_s = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["OS_WHS_S"]); 
         mark_to_mkt = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["MARK_TO_MKT"]); 
         mark_to_mkt_error = Convert.ToDecimal(dsResult.Tables[0].Rows[0]["mark_to_mkt_error"]); 

         decimal clr_total_p = os_clr_p + os_whs_p; 
         decimal clr_total_s = os_clr_s + os_whs_s; 

         Microsoft.Office.Interop.Excel.Workbook wBook = appExcel.Workbooks.Open(txtWeeklyFile.Value.ToString(),Type.Missing,Type.Missing,Type.Missing, 
          Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing, 
          Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing); 

         //SHEET MARKET POSITION SHEET 1                
         Worksheet sheetMarktetPosition1 = (Worksheet)wBook.Sheets[1];      
         Range mPositionRange = sheetMarktetPosition1.UsedRange;     

         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[6,7]).Value2 = rptDt.ToString(); 

         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[14,3]).Value2 = os_p.ToString(); 
         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[14,7]).Value2 = mark_to_mkt.ToString();       
         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[16,3]).Value2 = os_s.ToString();        
         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[15,5]).Value2 = ""; 
         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[40,3]).Value2 = clr_total_p.ToString(); 
         ((Microsoft.Office.Interop.Excel.Range)mPositionRange.Cells[41,3]).Value2 = clr_total_s.ToString(); 

} 
+3

http://support.microsoft.com/kb/257757マイクロソフトでは現在、無人で非対話型のクライアントアプリケーションまたはコンポーネント(ASP、ASP.NETなど)からMicrosoft Officeアプリケーションの自動化を推奨していません。 、DCOM、およびNTサービス)、Officeがこの環境で実行されると、不安定な動作やデッドロックが発生する可能性があるためです。 –

答えて

3

あなたは安全からOfficeオートメーションを使用することはできませんサーバプロセスを使用する場合は、Editing an Excel document with Macros in ASP.NETへの回答を参照してください。ASP.NET Web Service using office 2010 COMを参照すると、ASP.NETから呼び出すだけで何が起きるかを知ることができます。

問題は簡単ですOffice Automationは、デスクトップアプリケーションから、デスクトップアプリケーションであるMicrosoft Office製品を自動化するように設計されています。サーバーアプリケーションからそれらを使用しているときに、正しく動作しません。

+0

U r right John、それ以前はActiveXコントロールの助けを借りてクライアント側でしたが、私たちのクライアントはすべてのユーザー端末でActiveXコントロールを無効にしました。私たちはサーバー側に移ることにしました。 今私たちはサーバー側にそれを保持し、許可も提供しなければなりません。そのイントラネットアプリケーションには、このアプリケーションを使用するgngのユーザーが4人おり、IE上でActiveXコントロールを有効にする準備ができていません どのようにして現在のサーバー側のコードを作成して実行できますか? ありがとう – SeeSharp

+2

「起動して実行する」ことはできません。Office Automationのサーバーサイドを使用するというアイデアは根本的に壊れています。唯一の例外は、http://stackoverflow.com/a/9493163/76337のパターンに従う場合です。彼のコードが非常に複雑な理由があることに注意してください.Office Automationを設計したやり方以外の方法で "Mother Nature"を欺くのは本当に悪いことです。 –

1

であるあなたは、このサーバーへのリモートデスクトップアクセスを持っていますか?

Excelファイルをエクスポートするフォルダにアクセス許可を設定するだけでなく、AppPoolユーザーがExcelを自動化できるようにDCOMCNFGでアクセス許可を設定する必要があります。 (スタート、ファイル名を指定して実行、DCOMCNFG、コンポーネントサービス、コンピュータ、DCOMの構成と右Microsoft Excelのオブジェクトをクリックします。

があなたの代わりにExcelのライターをして考えがありますか?このようなEPPlusとして。

+0

ありがとうMakit 私はリモートデスクトップアクセスを持っていません。クライアントがベンダーの従業員にサーバーアクセスを提供しないためです。 許可に関する限り、同じ画面を使用する複数のユーザーがいます。今問題は私のコードが私のポストに投稿したクライアントマシンのサーバー側とファイルです。どのように私はサーバーで許可ポリシーを設定することができますので、いつでもユーザーのデータをエクスポートして、アプリケーションのdosentが何らかのエラーをスローします。 任意のヘルプ ありがとう – SeeSharp

+0

トラブルシューティングの観点からは良い回答です。 +1、結果の回避策が有利でない場合でも。 –

関連する問題