Рендеринг большого количества данных из ленты excel С#

У меня есть проект надстройки excel в С#, который создает и загружает данные на лист excel, я пытался оптимизировать загрузку данных из 127 000 строк, что занимает минуту и ​​30 секунд только для записи 127 тыс. строк в лист excel. Я пробовал несколько способов записи на лист excel, например, создание диапазона и блока массива и установка этого блока массива в диапазон, таким образом, очень медленно, я когда-то смог подобрать с помощью ListObject SetDataBinding с datatable удерживая данные.

listObject.ListObject.AutoSetDataBoundColumnHeaders = true;
listObject.ListObject.SetDataBinding(data);
listObject.ListObject.Disconnect();

Этот процесс намного быстрее, но по-прежнему занимает 1 и 30 операций записи на экран. Есть ли другой вариант сократить время. Я обнаружил, что в проекте без ленты скорость резко возрастает.


person AC25    schedule 16.01.2014    source источник


Ответы (1)


Надстройки Excel нередко блокируют пользовательский интерфейс и отображают индикатор выполнения во время работы.

При этом существуют Interop-версии свойств, которые я описываю в этом посте #21052583">Заменить этот цикл While на более эффективный код?. Методы, которые я описываю, — это 2 самых простых способа ускорить взаимодействие с таблицами данных Excel. Ссылки на версии свойств VBA для взаимодействия можно найти здесь: MSDN:_Application.ScreenUpdating и здесь: MSDN:_Application.Calculation.

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

Еще одна вещь, которую следует учитывать, это то, какая часть операции занимает много времени. Получает ли он данные из какого-то внешнего источника? Записывает ли он данные в Excel? Это какая-то операция перевода между источником данных и Excel? Если решение, о котором я упоминал выше, работает хорошо, отлично! Если это не так, вам нужно провести дополнительное расследование, чтобы увидеть, может быть, ваш источник данных предоставляет данные слишком медленно, или, может быть, вы выполняете много операций преобразования данных, и это увязает. В 9 случаях из 10, когда дело доходит до такой работы с Excel, именно ScreenUpdating и Calculation замедляют работу, остальные 10% могут быть трудными для понимания.

person Pete Garafano    schedule 16.01.2014
comment
расчет установлен вручную, а для обновления экрана установлено значение false. Я привязываю данные к объекту списка, и кажется, что я не могу сократить время. Я запустил демонстрационный проект, в котором не используется лента, и скорость выполнения той же работы значительно выше. Знаете ли вы, почему лента / надстройка такая и что делать, чтобы ее устранить. Спасибо - person AC25; 16.01.2014