Ошибка в Excel = новый Microsoft.Office.Interop.Excel.ApplicationClass (); "при размещении на сервере .. [dcomcnfg] - PullRequest
1 голос
/ 18 августа 2011

Ниже приведен код, который выдает ошибку при размещении на серверном ПК.

try
{
    //Variable Declarations
    Microsoft.Office.Interop.Excel._Workbook oWB;
    Microsoft.Office.Interop.Excel.Application oXL = null;

    Microsoft.Office.Interop.Excel.Workbook workbook;
    Microsoft.Office.Interop.Excel.Worksheet NwSheet = null;
    Microsoft.Office.Interop.Excel.Worksheet NwSheetSummary;
    Microsoft.Office.Interop.Excel.Worksheet NwSheetIndividualTotal;
    Microsoft.Office.Interop.Excel.Range ShtRange;
    Microsoft.Office.Interop.Excel.Sheets sheets;

    Microsoft.Office.Interop.Excel.ApplicationClass excel = new Microsoft.Office.Interop.Excel.ApplicationClass();

    excel.Workbooks.Add(System.Reflection.Missing.Value);

    excel.Quit();
    excel = null;

    //Opening Excel file(myData.xlsx)
    workbook = excel.Workbooks.Open(System.Web.HttpContext.Current.Server.MapPath("~/Template/Template.xlsx"), Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
    sheets = workbook.Worksheets;
    foreach (Worksheet ws in sheets)
    {
        if (ws.Index == 5)
            NwSheet = ws;
        if (ws.Index == 1)
            NwSheetSummary = ws;
        if (ws.Index == 4)
            NwSheetIndividualTotal = ws;
    }

    //Reading Excel file.
    //Creating datatable to read the containt of the Sheet in File.
    System.Data.DataTable dt = export.Tables[0];

    int rowCount = 8;

    if (dt.Columns.Contains("RowID"))
        dt.Columns.Remove("RowID");
    if (dt.Columns.Contains("Week"))
        dt.Columns.Remove("Week");
    if (dt.Columns.Contains("Year"))
        dt.Columns.Remove("Year");
    foreach (DataRow dr in dt.Rows)
    {

        rowCount += 1;
        for (int i = 1; i < dt.Columns.Count + 1; i++)
        {
            // Add the header the first time through 
            if (rowCount == 8)
            {
                //NwSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName;
            }
            NwSheet.Cells[rowCount, i] = dr[i - 1].ToString();
        }
    }

    for (int count = 0; count <= dt.Rows.Count; count++)
    {
        // NwSheet.get_Range("A9", Missing.Value).Value2 = dt.Rows[count]["SlNo"].ToString();


    }
    workbook.RefreshAll();
    String path = Convert.ToString(ConfigurationManager.AppSettings["DefaultPath"]);

    CreateFileOrFolder(workbook, week);
    NwSheet = null;
    ShtRange = null;
    workbook.Close(Missing.Value, Missing.Value, Missing.Value);
    workbook = null;
    oXL.Quit();
    excel.Quit();
    //appExl.Quit();
    status = true;
}

Теперь он работает нормально на моем локальном ПК с Interop Excel 12.0, но не при размещении на сервере с таким же 12.0.

получена ошибка

Не удалось получить фабрику класса COM для компонента с CLSID {00024500-0000-0000-C000-000000000046} из-за следующей ошибки: 80070005.

После поиска ошибки я прошел через другие форумы, и они упомянули give rights to Network Services to Microsoft Excel Application in dcomcnfg. Я сделал то же самое, но это бесполезно.

Это не сработало, и я получил ту же ошибку. Подобно :- Конфигурация dcomcnfge

Который говорит: -

Перейти в Панель управления -> Администрирование -> Службы компонентов -> Компьютеры -> Мой компьютер -> Конфигурация DCOM -> Приложение Microsoft Excel. -> Щелкните правой кнопкой мыши, чтобы получить диалоговое окно свойств. Перейдите на вкладку Безопасность и настройте соответствующие разрешения.

Я пытался дать все возможные права, но ошибка сохраняется. !!

Пожалуйста, помогите ..

...