Excel Automation работает очень медленно! - PullRequest
0 голосов
/ 18 декабря 2009

На моем компьютере отчет генерируется примерно за 3-4 секунды, и так было на всех компьютерах раньше. Но недавно на паре компьютеров в офисе генерация отчетов начала занимать 30-40 секунд. На других компьютерах это все еще быстро. Я попытался переустановить MS Office без удачи.

Например, этот код занимает !!! 3 !!! секунды для выполнения:

xlWS.Name = "INVOICE";
xlWS.PageSetup.PaperSize = XlPaperSize.xlPaperA4;
xlWS.PageSetup.TopMargin = xl.CentimetersToPoints(1.5);
xlWS.PageSetup.LeftMargin = xl.CentimetersToPoints(1);
xlWS.PageSetup.BottomMargin = xl.CentimetersToPoints(1.5);
xlWS.PageSetup.RightMargin = xl.CentimetersToPoints(1);
xlWS.PageSetup.Zoom = 60;

Что это может быть?
Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 18 декабря 2009

Измените принтер по умолчанию на локальный принтер вместо сетевого принтера. Наденьте сетевой кабель, чтобы быть уверенным. Затем попросите администратора локальной сети отправить сообщение на serverfault.com

1 голос
/ 18 декабря 2009

SpreadsheetGear for .NET , вероятно, значительно ускорит ваше приложение. Вы можете прочитать цитаты нескольких наших клиентов здесь - многие из этих цитат указывают на улучшения производительности, предоставляемые SpreadsheetGear для .NET.

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

Отказ от ответственности: я владею SpreadsheetGear LLC

1 голос
/ 18 декабря 2009

Свойства Worksheet.PageSetup очень медленны при их установке, но очень быстры, чтобы просто получить значение.

Таким образом, лучший способ - сначала проверить каждое значение, чтобы убедиться, что вам нужно установить его, а затем только те свойства, которые вам нужны. Кроме того, он может помочь установить «Application.ScreenUpdating = False» и «Application.Calculation = xlCalculationManual».

Используя ваш код в качестве отправной точки, обновленный код может выглядеть примерно так:

Excel.Application excelApp = xlWS.Application;

bool origScreenUpdating = excelApp.ScreenUpdating;

Excel.XlCalculation origCalcMode = excelApp.Calculation;

try
{
    myExcelApp.ScreenUpdating = False;

    myExcelApp.Calculation = xlCalculationManual;

    xlWS.Name = "INVOICE";

    if (xlWS.PageSetup.PaperSize != XlPaperSize.xlPaperA4)
    {
        xlWS.PageSetup.PaperSize = XlPaperSize.xlPaperA4;
    }

    if (xlWS.PageSetup.TopMargin != xl.CentimetersToPoints(1.5))
    {
        xlWS.PageSetup.TopMargin = xl.CentimetersToPoints(1.5);
    }

    if (xlWS.PageSetup.LeftMargin != xl.CentimetersToPoints(1))
    {
        xlWS.PageSetup.LeftMargin = xl.CentimetersToPoints(1);
    }

    if (xlWS.PageSetup.BottomMargin != xl.CentimetersToPoints(1.5))
    {
        xlWS.PageSetup.BottomMargin = xl.CentimetersToPoints(1.5);
    }

    if (xlWS.PageSetup.RightMargin != xl.CentimetersToPoints(1))
    {
        xlWS.PageSetup.RightMargin = xl.CentimetersToPoints(1);
    }

    if (xlWS.PageSetup.Zoom != 60)
    {
        xlWS.PageSetup.Zoom = 60;
    }
}
finally
{
    myExcelApp.ScreenUpdating = origScreenUpdating;
    myExcelApp.Calculation = origCalcMode;
}

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

Но я скрестил пальцы за тебя ...

- Майк

(Кстати, для перекрестных ссылок, вот ответ VBA, который я дал на ту же тему, где OP видел хорошее улучшение производительности: Как быстрее печатать в Excel VBA? )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...