1

Web サイトがデプロイされた Web サーバーに Excel ファイルがあります。シナリオでは、ユーザーが Web サーバーから Excel ファイルをダウンロードしてローカル ドライブに保存し、同じファイル パスを選択してデータをエクスポートできるようにする画面がありますが、以下のエラーが発生します。

ASP.NET は、要求されたリソースへのアクセスを許可されていません。リソースへのアクセス権を ASP.NET 要求 ID に付与することを検討してください。ASP.NET には、アプリケーションが偽装していない場合に使用されるベース プロセス ID (通常、IIS 5 では {MACHINE}\ASPNET、IIS 6 ではネットワーク サービス) があります。アプリケーションが を介して偽装している場合、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();
                }
            }
        }
        catch (Exception ex)
        {
            //code for any other type of exception
        }
    }
}
4

2 に答える 2

3

サーバー プロセスから Office オートメーションを安全に使用することはできません。ASP.NET でマクロを使用して Excel ドキュメントを編集する への回答を参照して、これを安全にするためにどこまで行かなければならないかを確認してください。Office 2010 COM を使用した ASP.NET Web サービスを参照して、ASP.NET から呼び出すだけで何が起こるかを確認してください。

簡単に言えば、問題は、Office Automation が、デスクトップ アプリケーションである Microsoft Office 製品をデスクトップ アプリケーションから自動化するように設計されていることです。サーバー アプリケーションからそれらを使用している場合、あらゆる種類のものが適切に動作しません。

于 2012-03-02T09:09:38.833 に答える
1

このサーバーへのリモート デスクトップ アクセスはありますか?

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

代わりに、Excel ライターを検討しましたか? EPPlusなど

于 2012-03-02T08:53:18.957 に答える