Использование Microsoft Interop для чтения и записи в ячейку Excel - PullRequest
1 голос
/ 02 марта 2012

У меня есть файл excel на веб-сервере, на котором развернут мой сайт. В этом сценарии у меня есть экран, который позволяет пользователю загрузить файл Excel с веб-сервера и сохранить его на локальном диске, а затем выбрать тот же путь к файлу для экспорта данных, но я получаю сообщение об ошибке ниже.

ASP.NET не авторизован для доступа к запрошенному ресурсу. Рассматривать предоставление прав доступа к ресурсу на запрос ASP.NET идентичность. ASP.NET имеет базовый идентификатор процесса (обычно {MACHINE} \ ASPNET на IIS 5 или сетевая служба на IIS 6), который используется, если приложение не олицетворяет. Если приложение подражая через, личность будет анонимный пользователь (обычно 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
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Вы не можете безопасно использовать Office Automation из процесса сервера. См. Ответ на Редактирование документа Excel с макросами в ASP.NET , чтобы узнать, как далеко вы должны зайти, чтобы сделать это безопасным. См. Веб-служба ASP.NET с использованием Office 2010 COM , чтобы узнать, что может произойти, если вы просто попытаетесь вызвать ее из ASP.NET.

Проблема, вкратце, заключается в том, что Office Automation была разработана для автоматизации из приложений для настольных компьютеров продуктов Microsoft Office, которые являются настольными приложениями. Все виды вещей не работают должным образом, когда вы используете их из серверного приложения.

1 голос
/ 02 марта 2012

У вас есть удаленный доступ к этому серверу?

Вам необходимо установить разрешения для папки, в которую экспортируется файл Excel, а также настроить разрешения в DCOMCNFG, чтобы пользователь AppPool мог автоматизировать Excel. (Пуск, Выполнение, DCOMCNFG, Службы компонентов, Компьютеры, Конфигурация DCOM и щелкните правой кнопкой мыши объект Microsoft Excel.

Рассматривали ли вы вместо писателя Excel? Такие как EPPlus .

...