Размещение текста в заголовке на всех листах Excel (циклы: foreach, для) - низкая производительность (C #) - PullRequest
1 голос
/ 06 июля 2019

Я хотел бы вставить текст в заголовок КАЖДОГО листа в Excel. К сожалению, это занимает очень много времени. Я попробовал две петли: foreach и для. Ниже приведен простой код, который я использую с секундомером. Похоже, Excel требуется около 0,7 сек для одного листа. Даже если в цикле ОДИН лист, это займет 0,5 сек. и чем больше листов будет открыто, тем дольше будет петля для всех. Конечно, случай с одним листом просто для того, чтобы представить ситуацию. Для 10 листов это занимает 7,5 секунд, и мне нужно делать это каждый раз, когда пользователь сохраняет рабочую книгу. С включенной опцией автосохранения это может быть сложно.

Я верю, что есть другая возможность сделать это, но я не могу найти никакого решения. Я читал о сортировке, но 7,5 секунд? Возможно, есть что-то такое, как быстрая встроенная множественная вставка, например, AllSheets.PageSetup.LeftHeader?

Можете поделиться своим опытом по этой теме?

//aWb is an Active WorkBook

Stopwatch sw = new Stopwatch();
sw.Start();

foreach (Excel.Worksheet ew in aWb.Worksheets) //7:541 for 10 sheets
{
    ew.PageSetup.LeftHeader = "LeftHeader";
}
sw.Stop();
MessageBox.Show("Foreach: " + sw.Elapsed.Seconds + ":" + sw.Elapsed.Milliseconds);

sw.Reset();
sw.Start();

for (int x = 1; x <= Application.Sheets.Count; x++) //7:318 for 10 sheets
{
    aWb.Sheets[x].PageSetup.LeftHeader = "LeftHeader";
}
sw.Stop();
MessageBox.Show("For: " + sw.Elapsed.Seconds + ":" + sw.Elapsed.Milliseconds);

1 Ответ

0 голосов
/ 07 июля 2019

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

  • Application.ScreenUpdating - отключить обновление экрана, чтобы ускорить макроскод.Вы не сможете увидеть, что делает макрос, но он будет работать быстрее.Не забудьте установить свойство ScreenUpdating обратно в True, когда ваш макрос завершится.
  • Worksheet.EnableCalculation - True, если Microsoft Excel автоматически пересчитывает лист при необходимости.False, если Excel не пересчитывает лист.Если значение этого свойства равно False, вы не можете запросить пересчет.Когда вы изменяете значение с False на True, Excel пересчитывает лист.
  • Application.Calculation - Возвращает или задает значение XlCalculation, представляющее режим расчета.

Кроме того, я бы посоветовал поиграть с Open XML SDK , иногда гораздо быстрее выполнить работу без автоматизации Excel.

...