none
Подвисает простой документ с группировкой на базовых операциях вроде прокрутки RRS feed

  • Вопрос

  • Здравствуйте!

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

    1. 25 столбцов (полей дюжина), 25к строк, 7 уровней группировки разной степени вложенности, 3-8 МБ размером

    2. никаких формул, объектов, итогов, форматирование простейшее (максимум изменены цвет шрифта и цвет фона) - считать ничего не нужно

    3. ячейки если и объединены, но только "в строчку"

    Подвисание наблюдается:

    1. при прокрутке и изменении размеров окна, как вертикальных, так и горизонтальных (то есть длительность задержки зависит только от количества ячеек, на 99,99999% скрытых группировкой, которые "зачем-то" нужно проверить, выводить ли на экран)

    2. после указанных операций - при выделении произвольной ячейки (часто, но не всегда - четкой закономерности не выявил)

    3. на компьютерах офисной конфигурации (3ГГц, 2 ядра) и серверах (2,4ГГц, 16 ядер), память, жесткий диск, видеокарта, не нагружаются - только процессор, при этом распараллеливается не очень-то

    4. в любых версиях excel (2010-2016, x86|x64, online)

    Подвисание не наблюдается в сторонних продуктах, например, LibreOffice - но это не вариант.

    Что пробовали помимо версий и платформ - разные форматы файла (xls, xlsx, xlsb, ods), безопасный режим, разные настройки, но не все.

    Может быть есть какой-то вариант заставить Excel корректно работать с таким файлом, что-то вроде "не проверять скрытые ячейки", ведь они элементом типа Группировка скрыты, а не вручную каждая (да это и невозможно)

    P.S. сам файл



    6 июня 2018 г. 12:00

Ответы

  • Таки нашел решение и ... дело было [не в бабине] в объединенных ячейках, которые 1С при создании выгрузки использовала для форматирования страницы (путем объединения ячеек в соседних пустых, естественно, столбцах достигалась нужная ширина столбца и отступы между заголовками столбцов). Дело оставалось за малым - убрать все объединения, убрать Перенос по словам, выставить автоширину столбцов. При использовании самого Excel'я возникала проблема - отключение Переноса по словам ведет к исчезновению Отступов в ячейках (а без них файл со структурой нечитаем). Пришлось вспоминать VBA, затем изучать VBS, затем PowerShell (VBA-макрос из другого файла не особо-то выполнишь) - для автоматического выполнения данной процедуры

    $excel = new-object -comobject excel.application
    $book = $excel.workbooks.open($args[0])
    $worksheet = $book.worksheets.item(1)
    $worksheet.Range("C12").Select()
    $excel.ActiveCell.CurrentRegion.Select()
    $col=$excel.Selection.Columns.Count
    $excel.Selection.UnMerge()
    $excel.Selection.Resize($excel.Selection.Rows.Count, 8).Select()
    $excel.Selection.WrapText = $false
    $excel.Selection.Offset(0, 8).Select()
    $excel.Selection.Resize(1,$col-8).Select()
    $excel.Selection.EntireColumn.AutoFit()
    $excel.displayAlerts = $false
    $book.Save()
    $book.Close()
    $excel.Quit()

    После такой обработки файла все летает и выглядит практически (на 99,7%) так же. 

    В общем, Группировка работает на славу, но вкупе с ежестрочными объединениями ячеек переварить ее может пока только либра.

    21 августа 2018 г. 9:10

Все ответы

  • А вы не пробовали использовать макросы для скрытия строк и столбцов?

    В этой статье, и ответах после нее, прописано несколько вариантов, для разных условий скрытия ячеек.

    https://www.planetaexcel.ru/techniques/9/121/

    Скрытие/отображение ненужных строк и столбцов

    p.s.

    Если это не ваш вариант, то прошу прощения.


    Не ищи Бога, не в камне, не в храме - ищи Бога внутри себя. Ищущий, да обрящет.

    11 июня 2018 г. 0:20
  • piligrim2180, спасибо за ответ, но это выгрузка, да и Excel при выводе на экран текущего View без разницы как скрыты ячейки, важно только сколько их скрыто (даже уровни группировки здесь ни при чем). Просто, давно не имел дела с Excel и совсем забыл, что объектным подходом там практически не пахнет и подобные макросы только подтверждают, что даже внутри самой программы скрытый уровень группировки суть последовательность скрытых строк с одинаковым подряд outlinelevel. Для проверки пробовал :lol: убирать все группировки и скрывать 26к строк с данными или же группировать их 1 группировкой и сворачивать уровень - и там, и там наблюдаются одинаковые подвисания на десятки секунд, если переместиться вниз так, чтобы View со скрытыми строками достаточно устарел и стерся из памяти (так и не понял, что важнее: количество секунд за границей View или удаление от нее), а потом прокрутить страницу вверх до таблицы.

    В общем, жаль, что Excel не умеет ООП (что забавно, думал LibreOffice каким-то образом просто хранит в памяти сформированный View даже за пределами экрана - так нет, там и сворачивание\разворачивание уровней мгновенное)

    11 июня 2018 г. 7:35
  • Попробуйте воспользоваться статьёй "Excel повышение производительности вычислений", возможно она подскажет вам путь решения проблемы.

    Да, я Жук, три пары лапок и фасеточные глаза :))

    12 июня 2018 г. 10:59
    Модератор
  • Таки нашел решение и ... дело было [не в бабине] в объединенных ячейках, которые 1С при создании выгрузки использовала для форматирования страницы (путем объединения ячеек в соседних пустых, естественно, столбцах достигалась нужная ширина столбца и отступы между заголовками столбцов). Дело оставалось за малым - убрать все объединения, убрать Перенос по словам, выставить автоширину столбцов. При использовании самого Excel'я возникала проблема - отключение Переноса по словам ведет к исчезновению Отступов в ячейках (а без них файл со структурой нечитаем). Пришлось вспоминать VBA, затем изучать VBS, затем PowerShell (VBA-макрос из другого файла не особо-то выполнишь) - для автоматического выполнения данной процедуры

    $excel = new-object -comobject excel.application
    $book = $excel.workbooks.open($args[0])
    $worksheet = $book.worksheets.item(1)
    $worksheet.Range("C12").Select()
    $excel.ActiveCell.CurrentRegion.Select()
    $col=$excel.Selection.Columns.Count
    $excel.Selection.UnMerge()
    $excel.Selection.Resize($excel.Selection.Rows.Count, 8).Select()
    $excel.Selection.WrapText = $false
    $excel.Selection.Offset(0, 8).Select()
    $excel.Selection.Resize(1,$col-8).Select()
    $excel.Selection.EntireColumn.AutoFit()
    $excel.displayAlerts = $false
    $book.Save()
    $book.Close()
    $excel.Quit()

    После такой обработки файла все летает и выглядит практически (на 99,7%) так же. 

    В общем, Группировка работает на славу, но вкупе с ежестрочными объединениями ячеек переварить ее может пока только либра.

    21 августа 2018 г. 9:10