Microsoft.Office.Interop.Excel работает слишком медленно - PullRequest
0 голосов
/ 26 мая 2018

Я использую Excel Interop, и у меня есть список объектов.Это занимает слишком много времени, когда я задаю свойства объектов в списке в ячейках Excel в цикле:

        workSheet = (Excel.Worksheet)wbook.ActiveSheet;
        var row = 1;
        foreach (var shiftStop in shiftStops)
        {
            row++;
            workSheet.Cells[row, "A"] = shiftStop.MachineName;
            workSheet.Cells[row, "B"] = shiftStop.MachineType;
            workSheet.Cells[row, "C"] = shiftStop.UnitName;

        }

Список shiftStops содержит около 4000 объектов.Требуется 4-5 минут, чтобы завершить возврат.Есть ли способ сделать этот процесс быстрее?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Каждый раз, когда вы совершаете вызов объекта в приложении Office, это занимает много времени, особенно через взаимодействие.Это особенно заметно в виде циклической операции, которую вы показываете.

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

Если в качестве shiftStops используется массив, код может выглядеть следующим образом:

    workSheet = (Excel.Worksheet)wbook.ActiveSheet;
    var row = 1;
    Excel.Range rng = worksheet.Cells[row, "A"];
    rng = rng.Resize(1, shiftStops.Length);
    rng.Value = shiftStops;
0 голосов
/ 27 мая 2018

Следующие функции обычно можно отключить во время выполнения кода:

  • Application.ScreenUpdating

    Отключить обновление экрана.Если для Application.ScreenUpdating установлено значение False, Excel не перерисовывает экран.Во время выполнения кода экран обновляется быстро, и пользователю обычно не нужно видеть каждое обновление.Однократное обновление экрана после выполнения кода повышает производительность.

  • Application.DisplayStatusBar

    Отключение строки состояния.Если для Application.DisplayStatusBar установлено значение False, Excel не отображает строку состояния.Настройка строки состояния отличается от настройки обновления экрана, так что вы можете по-прежнему отображать состояние текущей операции, даже если экран не обновляется.Однако, если вам не нужно отображать состояние каждой операции, отключение строки состояния во время выполнения кода также повышает производительность.

  • Application.Calculation

    Переключиться на ручной расчет.Если для Application.Calculation установлено значение xlCalculationManual, Excel вычисляет рабочую книгу только тогда, когда пользователь явно инициирует вычисление.В режиме автоматического расчета Excel определяет, когда рассчитывать.Например, каждый раз, когда значение ячейки, связанное с формулой, изменяется, Excel пересчитывает формулу.Если вы переключите режим вычисления в ручной, вы можете подождать, пока все ячейки, связанные с формулой, будут обновлены, прежде чем пересчитать рабочую книгу.Путем перерасчета рабочей книги только при необходимости во время выполнения кода вы можете повысить производительность.

  • Application.EnableEvents

    Отключить события.Если для Application.EnableEvents установлено значение False, Excel не вызывает события.Если есть надстройки, прослушивающие события Excel, эти надстройки потребляют ресурсы компьютера, когда они записывают события.Если для надстройки нет необходимости записывать события, происходящие во время выполнения кода, отключение событий повышает производительность.

  • ActiveSheet.DisplayPageBreaks

    Отключить разрывы страниц.Если для ActiveSheet.DisplayPageBreaks установлено значение False, Excel не отображает разрывы страниц.Нет необходимости пересчитывать разрывы страниц во время выполнения кода, а вычисление разрывов страниц после выполнения кода повышает производительность.

Подробнее об этом можно узнать в Производительность Excel: Советыдля оптимизации производительности препятствий статья.

Также я бы порекомендовал выпустить базовые COM-объекты.Все надстройки Excel должны систематически выпускать свои ссылки на объекты Excel, когда они больше не нужны.Невозможность систематического освобождения ссылки на объекты Excel может помешать правильному завершению работы Microsoft Office Excel.

Использование System.Runtime.InteropServices.Marshal.ReleaseComObject для освобождения объекта Excel после завершения использованияЭто.Затем установите переменную Nothing в Visual Basic (null в C #), чтобы освободить ссылку на объект.

...