Ошибка выполнения - экспорт Excel с использованием C # из IIS - PullRequest
0 голосов
/ 08 июня 2011

Когда я работаю в режиме отладки на моей локальной машине, проблем нет.Я могу экспортировать в Excel ...

private void ExportToExcel(string str)
    {
        _Excel.Application oXL;
        _Excel.Workbook oWB;
        _Excel.Worksheet oSheet;
        _Excel.Range oRange;

        // Start Excel and get Application object.
        oXL = new _Excel.Application();

        // Set some properties
        oXL.Visible = true;
        oXL.DisplayAlerts = false;

        // Get a new workbook.
        oWB = oXL.Workbooks.Add(Missing.Value);

        // Get the active sheet
        oSheet = (_Excel.Worksheet)oWB.ActiveSheet;
        oSheet.Name = "PO_Status";

        // Process the DataTable
        int rowCount = 1;
        foreach (DataRow dr in dtStatus(str).Rows)
        {
            rowCount += 1;
            for (int i = 1; i < dtStatus(str).Columns.Count + 1; i++)
            {
                // Add the header the first time through
                if (rowCount == 2)
                {
                    oSheet.Cells[1, i] = dtStatus(str).Columns[i - 1].ColumnName;
                }
                oSheet.Cells[rowCount, i] = dr[i - 1].ToString();
            }
        }

        // Resize the columns
        oRange = oSheet.get_Range(oSheet.Cells[1, 1],
                      oSheet.Cells[rowCount, dtStatus(str).Columns.Count]);
        oRange.EntireColumn.AutoFit();

        try
        {
            // Save the sheet and close
            oSheet = null;
            oRange = null;
            oWB.SaveAs("POStatus.xls", _Excel.XlFileFormat.xlWorkbookNormal,
                Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                _Excel.XlSaveAsAccessMode.xlExclusive,
                Missing.Value, Missing.Value, Missing.Value,
                Missing.Value, Missing.Value);
            //oWB.Close(Missing.Value, Missing.Value, Missing.Value);
            //oWB = null;
            //oXL.Quit();

            // Clean up
            // NOTE: When in release mode, this does the trick
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
        }
        catch (Exception ex)
        {
            Session["error"] = ex.Message;
            Response.Redirect("MessageBoard.aspx");
        }
    }

    private DataTable dtStatus(string str)
    {
        DataTable dt = new DataTable();
        SqlCommand cmd = new SqlCommand(@"Select " + str + ""
                            + " From tbl_RFI Full Join"
                            + " tbl_RFQ On tbl_RFI.RFINo = tbl_RFQ.RFINo Full Join"
                            + " tbl_NNB On tbl_RFQ.RFQNo = tbl_NNB.RFQNo Full Join"
                            + " tbl_PO On tbl_PO.NNBNo = tbl_NNB.NNBNo"
                            + " Where tbl_RFI.JobNo = '" + ddlJobNo.SelectedValue.ToString().Trim() + "'", connPMis);

        SqlDataAdapter adp = new SqlDataAdapter(cmd);
        adp.Fill(dt);

        return dt;
    }
}

Но когда я работаю на IIS, он не работает ... Я получил сообщение об ошибке, подобное этому

Ошибка выполнения Описание: Произошла ошибка приложенияна сервере.Текущие пользовательские настройки ошибок для этого приложения не позволяют удаленно просматривать подробности ошибки приложения (из соображений безопасности).Однако его могут просматривать браузеры, работающие на локальном сервере.

Подробно: Чтобы детали этого конкретного сообщения об ошибке можно было просматривать на удаленных компьютерах, создайте тег в файле конфигурации «web.config», расположенном в корневом каталоге текущего веб-приложения.Для этого тега должен быть установлен атрибут «mode» «Off».

Примечания: текущую страницу ошибки, которую вы видите, можно заменить специальной страницей ошибок, изменив defaultRedirect."атрибут тега конфигурации приложения, указывающий на URL-адрес пользовательской страницы ошибки.

Мой сервер - Windows Server 2008 / IIS7, за вашу помощь

Ответы [ 2 ]

1 голос
/ 08 июня 2011
  1. На сервере должен быть установлен Excel, чтобы это работало.

  2. Альтернативный способ увидеть полное исключение - если у вас есть доступ к серверуна рабочем столе, вы можете перейти на свою страницу с сервера, и, поскольку она локальная, вы получите полную трассировку стека.

  3. Это явно не рекомендуется для работы с Excel на сервере, говорит Microsoft: http://support.microsoft.com/kb/257757. Предпочтительным подходом является работа с библиотекой / dll, которая может читать и / или манипулировать файлами xls и xlsx без запуска и автоматизации какого-либо другого приложения.Существуют бесплатные библиотеки, такие как NPOI, и коммерческие продукты, такие как SpreadsheetGear и Aspose.У вас гораздо больше возможностей, если вы ограничите использование xlsx.

  4. Если вы действительно используете этот метод взаимодействия:

    a.Вам нужно более тщательно назначить все элементы переменным для последующей очистки.Например, каждый раз, когда вы делаете oSheet.Cells[1, i] в цикле, вы теряете ссылку на ячейку.

    b.Каждый ресурс, который вы назначаете, должен быть очищен путем вызова Marshal.ReleaseComObject(theVariable), когда вы закончите с ним.ЭТИ вещи не собраны, поэтому GC.Anything не будет иметь никакого эффекта.

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

1 голос
/ 08 июня 2011

Зайдите в свое приложение и в ваш web.config и измените ваш элемент

Это могут быть разрешения на сохранение файла Excel или ошибка запуска Excel, но нам нужно увидеть здесь сообщение об ошибке. Убедитесь, что местоположение, в которое вы сохраняете файл, имеет разрешения для учетной записи сетевой службы (или для любой другой учетной записи, в которой ваше приложение работает как учетная запись пула приложений в iis)

Смотрите следующую ссылку, чтобы найти множество других (лучших) способов сделать это.

Создание файла Excel (.XLS и .XLSX) из C #

...