vivianpinto Ответов: 3

Backgroundworker for excel отлично работает в тестовой среде, но не реагирует после публикации


Уважаемый друг.
Я создаю файл excel на сервере, который будет загружен для клиента.
Я использую backgroundworker и он отлично работает во время тестирования на моем локальном компьютере
После публикации я могу видеть процесс IIS Woeker (32)на работающем сервере.
Но ничего не происходит

Что я уже пробовал:

namespace SCQA
{
    public partial class TestMaster : System.Web.UI.Page
    {
        BackgroundWorker bgView = new BackgroundWorker();

        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected void btnBackGround_Click(object sender, EventArgs e)
        {
            bgView = new BackgroundWorker();
            bgView.WorkerSupportsCancellation = true;
            bgView.DoWork += new DoWorkEventHandler(bw_DoWork);
            bgView.WorkerReportsProgress = true;            
            bgView.RunWorkerAsync();
        }

        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            Excel.Application xlApp;
            Excel.Worksheet xlWorkSheet;
            xlApp = new Excel.Application();
            xlWorkSheet = new Excel.Worksheet();
            Excel.Workbook xlWorkBook = xlApp.Workbooks.Add("C:\\Model.xlsx");
            xlWorkSheet = xlWorkBook.ActiveSheet;
            xlApp.DisplayAlerts = false;
            try
            {
                var _with1 = xlWorkSheet;
                _with1.Cells[1, 1] = "SCQA OVER TIME on - " + DateTime.Now.ToString("dd/MMM/yyyy");

            }
            catch (Exception ex) { }

            string fInfo = "D:\\SCQA_DOC\\ModelOut.xlsx";
            xlWorkBook.SaveAs(fInfo, xlWorkBook.FileFormat, Type.Missing, Type.Missing, false, false, Excel.XlSaveAsAccessMode.xlExclusive, false, false, Type.Missing, Type.Missing, Type.Missing);
            xlWorkBook.Close();
            xlApp.DisplayAlerts = true;
            releaseObject(xlApp);
            releaseObject(xlWorkBook);
            releaseObject(xlWorkSheet);
            //Button5_Click(null, EventArgs.Empty);        
            Response.Write("alert('Completed')");
        }
    }
}

Graeme_Grant

IIS может блокировать доступ к приложению. Пожалуйста, посмотрите на ссылку об удаленной отладке, чтобы увидеть, что на самом деле происходит на сервере.

3 Ответов

Рейтинг:
2

Graeme_Grant

try
{
	var _with1 = xlWorkSheet;
	_with1.Cells[1, 1] = "SCQA OVER TIME on - " + DateTime.Now.ToString("dd/MMM/yyyy");

}
catch (Exception ex) { }

Есть ли причина, по которой у вас есть это в производственном коде???

Если что-то не получается, нужно начинать отладку. Visual Studio имеет функцию удаленной отладки. вы даже можете установить точки останова и пройти через код. Подробнее читайте здесь: Удаленная отладка в Visual Studio | Microsoft Docs[^]

Кроме того, задумывались ли вы о том, что Excel не может быть установлен на вашем веб-сервере?

ОБНОВЛЕНИЕ

Запуск excel на веб-сервере может быть очень проблематичным, даже если вы можете решить свою проблему. Как правило, веб-серверы могут иметь одно, десятки, сотни, тысячи и т. д. одновременных подключений. Клиент excel не предназначен для этой цели. Тебе было бы лучше:
1. Поиск сторонней платной или бесплатной библиотеки, которая может работать с файлами excel;
2. просто создайте CSV-файлы, которые можно загрузить и импортировать в Excel;
3. используйте API Office 365 и используйте его для создания файлов. Office 365 предназначен для обработки этих типов рабочих нагрузок.


OriginalGriff

"Привет, Грэм Грант
Я хочу создать файл Excel на сервере (установить значения по умолчанию и установить макросы в этом excel) перед доставкой клиенту.
Я установил ту же версию office на этом сервере и другие приложения Windows, способные работать на этом сервере."

Опубликовано в качестве решения.

Graeme_Grant

Спасибо... отправил репью против его вопроса.

Рейтинг:
2

Dave Kreskowiak

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

Но ты не можешь этого сделать. Офисные приложения не являются реентерабельными, то есть, если два веб-запроса поступают и оба делают что-то с Excel одновременно, Excel выйдет из строя или сделает что-то очень неожиданное и почти невозможное для воспроизведения.

Кроме того, некоторые операции в Excel требуют активного входа пользователя в консоль на сервере, чтобы работать, потому что они создают свои собственные диалоговые окна. На веб-сервере этот пользователь никогда не будет входить в систему, чтобы отвечать на диалоги. Эти диалоги не будут отображаться на клиентских компьютерах. Excel будет висеть, вечно ожидая ввода, который никогда не поступит.

Вы не можете использовать Office Interop в веб-приложении. Вы должны переписать этот код, чтобы выполнять операции с книгами с помощью библиотеки, такой как OpenXML SDK, ClosedXML или какой-либо другой библиотеки.


Рейтинг:
1

vivianpinto

Понял, Грэм. Спасибо за ваше предложение.
Я попробовал это в другом, я получаю эту ошибку.

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



 protected void Button1_Click(object sender, EventArgs e)
        {
            Excel.Application xlApp;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            object misValue = System.Reflection.Missing.Value;
            xlApp = new Excel.Application();
            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            for (int i = 1; i <= 100; i++)
                for (int j = 1; j < 100; j++)
                    xlWorkSheet.Cells[i, j] = i + "  : " + j;
            Response.ContentType = "application/vnd.ms-excel";
            Response.AppendHeader("Content-Disposition", "attachment; 
            filename=translationText.xlsx");
            Response.Write("<table>");
            for (int i = 1; i <= 100; i++)
            {
                Response.Write("<tr>");
                for (int j = 1; j < 100; j++)
                {
                    Response.Write("<td>" + i + "  : " + j + "</td>");
                }
                Response.Write("</tr>");
            }
            Response.Write("</table>");
            Response.Flush();
            Response.End();

            xlWorkBook.Close(true, misValue, misValue);
            xlApp.Quit();

            releaseObject(xlWorkSheet);
            releaseObject(xlWorkBook);
            releaseObject(xlApp);
}


Dave Kreskowiak

Перестаньте публиковать ответы на другие посты в качестве решения вашего собственного вопроса. Таким образом, человек, которому вы отвечаете, не получает уведомления о том, что вы что-то опубликовали.