Актуальность темы обусловлена форсированием перехода Государственных ведомств и госкомпаний России с Windows на Astra Linux. Это было сделано на фоне заявления корпорации Microsoft о сворачивании бизнеса в РФ. Так как у автора, да и у многих других пользователей MS Office, за долгие годы работы скопилось ряд наработок, то вопрос об их работоспособности и переносе под новый офисный пакет, на платформе Linux, стоит остро, как и возможность малой автоматизации рутинных действий.

1. Введение


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


У каждого инженера со стажем рано или поздно скапливается множество программок, табличек, макросов упрощающих или облегчающих работу. Однако учитывая тот факт, что на законодательном уровне принято решение о прекращении закупок импортного ПО для критической информационной инфраструктуры и набирающие обороты процессы импортозамещения, на мой взгляд, пришло время поговорить о том, как рядовой инженер, скажем инженер-сметчик/инженер-ПТО сможет перевести часть своего легаси (устаревший код, который больше не поддерживается, не обновляется, но используется) на один из предлагающихся к импортозамещению офисных пакетов.

2. Сравнение и тестирование функциональности и производительности Офисных пакетов в Linux


2.1 Информация об оборудовании на котором будет происходить тестирование
Тестирование производительности я произвел на ноутбуке Hasee ZX7-CT5DA (он же Clevo N957TC), обзор которого я уже делал ранее на данном ресурсе, с предустановленным гипервизором Proxmox, в виртуальной машине с проброшенной видеокартой.. При этом гостевой операционной системой для тестов у меня используется полюбившийся мне Debian 11.3 non-free

Характеристики ноутбука:
ЦП — Intel Core i7-8700
ВК — GTX 1660Ti
ОЗУ — 16 GB
Установленные диски — 512GB Phison SSD SATA m.2/1TB Kingston KC2500 SSD NVMe m.2/250GB Samsung EVO 850 SSD SATA 2.5"
Дисплей — 15,6 ''IPS 45% NTSC

Настройки виртуальной машины

ProxMox работает на 1TB Kingston KC2500 SSD NVMe m.2, на нем же хранятся файлы виртуальных машин. Несмотря на проброшенный диск 512GB Phison SSD SATA m.2 в тестировании он участвовать не будет и служит лишь для обмена данными между виртуальной машиной и хостом (устройство, предоставляющее сервисы, выступающее сервером).
Тест дисковой подсистемы на хосте




Тест дисковой подсистемы в виртуальной машине

2.2 Краткая характеристика тестируемого ПО
MicroSoft Office 2010, установленный при помощи PlayOnLinux в Wine. Ныне устаревший офисный пакет от MicroSoft будет выступать в качестве системы для легаси, который необходимо будет перенести в другой офисный пакет по результатам тестов. 2010-я версия выбрана лишь только потому что, в моем случае, это последняя версия, которая устанавливается без проблем в PlayOnLinux на моей конфигурации в Debian 11. В общем и целом в представлении не нуждается.
Внешний вид MicroSoft Office

LibreOffice 7.0.4.2 — стандартный офисный пакет, который шел в комплекте с Debian 11.
Кроссплатформенный, свободно распространяемый офисный пакет с открытым исходным кодом, созданный как ответвление OpenOffice.org в 2010 году. Разрабатывается сообществом из более чем 480 программистов под эгидой некоммерческого фонда The Document Foundation за счёт пожертвований отдельных лиц и организаций.
по заверениям Wikipedia
Внешний вид и Версия LibreOffice


МойОфис Домашняя версия 2022.01. Сборка 4 — по моему скромному мнению офис, менеджеры которого наиболее активны в PR'е на различных площадках с целью продвижения своего продукта.
Экосистема приложений для совместной работы с документами с возможностью интеграции в закрытые облачные инфраструктуры и специализированные информационные системы. Разработчик «Новые облачные технологии» Продукты МойОфис включены в Единый реестр российских программ для электронных вычислительных машин и баз данных, полностью соответствуют законодательству РФ и дополнительным требованиям к офисному ПО, согласно постановлению Правительства №325 от 23 марта 2017 года. Приложения ориентированы на коммерческих и государственных заказчиков, сертифицированы на соответствие требованиям по информационной безопасности ФСТЭК, ФСБ и МО РФ и могут применяться для работы с конфиденциальной информацией и сведениями, составляющими государственную тайну.
по заверениям Wikipedia
Внешний вид и Версия МойОфис


OnlyOffice Desktop Editors версия 7.1.0.215
Офисный пакет с открытым исходным кодом, разработанный компанией Ascensio System SIA с головным офисом в Риге (Латвия). Решение включает в себя систему для управления документами, проектами, взаимоотношениями с клиентами и электронной почтой.
Доступны облачная версия и версия для развертывания в локальной сети. Кроме того, редакторы ONLYOFFICE интегрируются с популярными платформами для совместной работы, включая ownCloud, Nextcloud, SharePoint и другими. ONLYOFFICE является официальным технологическим партнером Nextcloud, ownCloud, SeaFile, Pydio, eXo Platform и XWiki.
по заверениям Wikipedia
Внешний вид и Версия OnlyOffice

Другие офисные программы в рамках данной статьи расматриваться не будут по разным причинам, например потому что WPS Office в бесплатной версии не имеет макросов, зато заявлена поддержка VBA, OpenOffice не встает в систему рядом с LibreOffice и требует его полного удаления, Р7-Офис — мои земляки, требует обязательную регистрацию что, на мой взгляд, совершенно неоправданно с т.з. популяризации ПО.

По сути из Российского ПО здесь только МойОфис, наверное на этом можно можно было бы и закончить не начав, но все же я продолжу, потому что и OnlyOffice открыл код редакторов под лицензией GNU AGPL v.3 , и LibreOffice под общественной лицензией MPL 2.0, а значит есть все основания сравнивать Российское ПО с открытым.

2.3 Постановка задачи
Производится Сравнение и тестирование Табличных редакторов Офисных пакетов будет с точки зрения удобства и функциональности программирования простых, но крайне необходимых макросов, которые будут автоматизировать работу в части формирования и заполнения шаблонных документов, а так же будет частично затронут вопрос работоспособности ключевых формул, которые будут помогать в форматировании и подготовке таких документов.

Иными словами рассмотрим возможность переписать программу, написанную мной в 2019-м году, для MS Excel при помощи VBA, для тех кто хочет заполнять файлы по своим шаблонам, с открытым VBA кодом. Выбор тестов продиктован желанием повторить все то, что мною было сделано несколько лет назад в рамках малой автоматизации, по заполнению шаблонов документов заранее подготовленными данными, с открытым VBA кодом.

2.4 Интерфейс и формулы
Далее будут приводится скриншоты для каждой операции каждого офисного табличного процессора из указанных выше офисных пакетов: MS Excel, LibreOffice Calc, МойОфис Таблицы Домашняя версия, OnlyOffice Таблица.
Последующий текст будет ориентирован на продвинутого пользователя программного пакета MS Office для русскоязычных пользователей. В конце статьи будет ссылка на файлы, в которых будут хранится все этапы тестов, для тех кто захочет попробовать повторить и сравнить на своих ПК.

2.4.1 Именованные диапазоны
Именованный диапазон это ячейка/диапазон ячеек, которому присвоено имя. Применяется в формулах, для определения границ печати (в MS Excel для выводимого диапазона на печать всегда присваивается имя диапазону Область_печати), а так же для выпадающих списков, но это мы немного забегаем вперед.

Для того что бы создать Именованный диапазон необходимо:
а) в MS Excel открыть вкладку «Формулы» и выбрать пункт «Диспетчер имен»
Скриншот окна в MS Excel
б) в LibreOffice Calc выделить диапазон данных, открыть меню «Данные» и выбрать пункт «Задать диапазон...»
Скриншот окна в LibreOffice Calc
в) в МойОфис Таблицы Домашняя версия можно использовать именованные диапазоны, созданные только с помощью сторонних программ, по состоянию на июнь 2022 года.
Скриншот окна в МойОфис Таблицы Домашняя версия
г) в OnlyOffice Таблица открыть вкладку «Формула», выбрать меню «Именованные диапазоны» и выбрать пункт «Диспетчер имен»
Скриншот окна в OnlyOffice Таблица

2.4.2 Выпадающий список в ячейке
Выпадающий список в ячейке служит, с одной стороны, для удобства Пользователя при выборе регламентированных вариантов ответа, с другой стороны, исключаются случайные ошибки при заполнении значениями там где это важно. При этом будьте аккуратными, потому что если ссылаться напрямую на диапазон ячеек отличный от текущего листа, то в MS Office 2007 и младше приводит к сбросу настроек выпадающего списка в ячейке через непродолжительное время. Но для MS Office 2013 и старше это уже не так актуально, поэтому для порядка и удобства ссылки на такие списки лучше делать через Именованный диапазон.

Для того что бы создать Выпадающий список в ячейке необходимо:
а) в MS Excel открыть вкладку «Данные» и выбрать пункт «Проверка данных»
Скриншот окна в MS Excel
б) в LibreOffice Calc открыть меню «Данные» и выбрать пункт «Проверка...»
Скриншот окна в LibreOffice Calc
в) в МойОфис Таблицы Домашняя версия, по состоянию на июнь 2022 года, выпадающий список своими средствами или сделанный в другом офисном пакете, сделать/задействовать невозможно.
Скриншот окна в МойОфис Таблицы Домашняя версия
г) в OnlyOffice Таблица открыть вкладку «Данные» и выбрать пункт «Проверка данных».
Скриншот окна в OnlyOffice Таблица

2.4.3 Условное форматирование
Условное форматирование (цветовая раскраска и форматирование текста) применяют тогда и там, когда привносят в таблицы элемент дизайна и наглядности, и когда необходимо выделить ошибки/выбивающиеся значение и т.д. и т.п., т.е. все то на что необходимо заострить/обратить внимание. Такое форматирование ячеек происходит по различным наборам условий.

Для того что бы создать Условное форматирование в ячейке необходимо:
а) в MS Excel выделить диапазон ячеек, открыть вкладку «Главная», открыть меню «Условное форматирование» и выбрать пункт «Создать правило...»
Скриншот окна в MS Excel
б) в LibreOffice Calc выделить диапазон ячеек, открыть меню «Формат», открыть подменю «Условное» и выбрать пункт «Условие...»
Скриншот окна в LibreOffice Calc
в) в МойОфис Таблицы Домашняя версия, по состоянию на июнь 2022 года, функционал Условного форматирования своими средствами сделать невозможно, но файлы созданные в других офисных программах отрабатываются корректно.
Скриншот окна в МойОфис Таблицы Домашняя версия
г) в OnlyOffice Таблица выделить диапазон ячеек, открыть вкладку «Главная», открыть меню «Условное форматирование» и выбрать пункт «Новое правило»
Скриншот окна в OnlyOffice Таблица

2.4.4 Получить диапазон области печати текущего листа формулой
Этот пункт и следующий будут из разряда колдунства. Такие функции необходимы в том случае, если Вам необходимо решать вопросы форматирования таблица/шаблона с учетом вывода на печать/принтер. Для этого используется формула MS Excel, которая для текущего листа выводит адрес диапазона печати в формате диапазона ячеек. Как мы помним MS Excel хранит диапазоны печати в именованных диапазонах «Область_печати», а так же оперативно отслеживает ее изменение в случае изменения границ области печати. =СЦЕПИТЬ(АДРЕС(СТРОКА(Область_печати);СТОЛБЕЦ(Область_печати);1;1);":";АДРЕС(СТРОКА(Область_печати)+ЧСТРОК(Область_печати)-1;СТОЛБЕЦ(Область_печати)+ЧИСЛСТОЛБ(Область_печати)-1;1;1))

После ввода формулы в ячейке:
а) в MS Excel обязательно настроить область печати на текущем листе и радоваться рабочей формуле. При настраивании области печати автоматически создается именованный диапазон с именем «Область_печати»
Скриншот окна в MS Excel
б) в LibreOffice Calc данный способ не работает, в этом табличном процессоре не поддерживается функция MS Excel ЧИСЛСТОЛБ, а LibreOffice Calc при задании границ печати не создает именованный диапазон со значениями для печати и хранит данные в другом виде. Если загрузить предварительно сохраненный рабочий файл в MS Excel, то формула отразит последнее значение отображенное в таблице при закрытии в MS Excel. Соответственно этот вариант не работает, т.е. нужен другой подход.
Скриншот окна в LibreOffice Calc
в) в МойОфис Таблицы Домашняя версия после ввода формулы в ячейке и задания границ печати получаем ошибку, т.к. у офисного пакета МойОфис сложные отношения с Именованными диапазонами. Если загрузить предварительно сохраненный рабочий файл в MS Excel, то мы получим нерабочую формулу.
Скриншот окна в МойОфис Таблицы Домашняя версия
г) в OnlyOffice Таблица обязательно настроить область печати на текущем листе и радоваться рабочей формуле.
Скриншот окна в OnlyOffice Таблица

2.4.5 Перенос текста формулами массива
Необходимость в переносе возникает тогда, когда текст должен быть разнесен по разным строкам, не путем изменения высоты ячейки, а именно быть разбит на несколько ячеек, да и еще с учетом максимально возможного количества отображаемых символов при печати
Формула + объяснение
Первая строка в A3:
=ПСТР(A1;1;105-ПОИСКПОЗ(" *";ПРАВСИМВ(ПСТР(A1;1;105);СТРОКА($B$1:$C$104));))
Вторая и последующие строки A4 и далее (протянуть):
=ПСТР(A$1;СУММ(ДЛСТР(A$3:A3))+2;105-2-ПОИСКПОЗ(" *";ПРАВСИМВ(ПСТР(A$1;СУММ(ДЛСТР(A$3:A3));105);СТРОКА($B$1:$C$104));))

Вводить формулы только через комбинацию клавиш Ctrl+Shift+Enter (в случае MS Excel)
Здесь:
— число 105 – максимальное число символов в строке, т.е. 105 символов;
— A1, ПСТР(A$1 – жесткая привязка на ячейку в которой содержится текст, который требуется разбить на несколько строк. При правках сохранять знак символа $;
— ДЛСТР(A$3:A3) – диапазон строк перед текущей строкой, необходим для определения начала позиции для копирования последующего блока текста. При правках сохранять знак символа $;
— СТРОКА($B$1:$C$104) – малофункциональный блок, который лучше не трогать, но стоит иметь ввиду, что если Ваш блок будет после 104-й строки, то необходимо будет диапазон скорректировать в сторону увеличения до максимальной строки в Вашем блоке текста. При правках сохранять знак символа $

После ввода формул в ячейке:
а) в MS Excel в ячейку А1 забиваем очень длинную тестовую фразу, с количеством символов больше 105 в несколько раз и радуемся результату:
Скриншот окна в MS Excel
б) в LibreOffice Calc данный способ не работает, т.к. он не знает функцию ПРАВСИМВ, а так же мне сходу не удалось запустить эти формулы ни через одну из комбинаций клавиш. Если загрузить предварительно сохраненный рабочий файл в MS Excel, то формула так же не работает. Соответственно нужен другой подход.
Скриншот окна в LibreOffice Calc
в) в МойОфис Таблицы Домашняя версия после ввода формулы в ячейки ведет себя так же как и LibreOffice Calc, с той лишь разницей, что у МойОфис нет проблем с функцией ПРАВСИМВ.
Скриншот окна в МойОфис Таблицы Домашняя версия
г) в OnlyOffice Таблица после ввода формулы в ячейки ведет себя так же как и LibreOffice Calc и МойОфис Таблицы Домашняя версия. Если загрузить предварительно сохраненный рабочий файл в MS Excel, то первоначально отображает вид как перед закрытием, но в случае правок в ячейке А1 пересчет формул заканчивается ошибкой.
Скриншот окна в OnlyOffice Таблица

2.4.6 Открытие файлов с большим количеством строк


Достаточно простой тест на ресурсоемкость. Давайте представим что у нас есть файл с большим числом строк данных, выгруженных из условной 1С, для чего смоделируем утрированную нагрузку, для этого:

а) в MS Excel в ячейку A1 вводим арабскую единицу, в соседнюю ячейку B1 вводим формулу "=A1+1", протягиваем ячейку B1 вправо до тех пор, пока не будет цифра 100, а затем копируем формулы на 11750 строк, получаем файл размером 9,1Мб и радуемся результату:
Скриншот окна в MS Excel
При этом сам MS Excel в оперативной памяти занимает порядка 251 308 КиБ, прокрутка работает быстро и плавно, а так же ничего не тормозит.
б) в LibreOffice Calc открытие того же самого файла осуществляется быстро, прокрутка осуществляется быстро и плавно, а так же ничего не тормозит. В оперативной памяти LibreOffice Calc занимает порядка 701 254 КиБ.
Скриншот окна в LibreOffice Calc
в) в МойОфис Таблицы Домашняя версия открытие того же файла началось с вывода окна ожидания, прокрутка осуществляется с заметными глазу небольшими задержками, скролинг осуществляется неудобно из-за постоянных подгрузок, в оперативной памяти МойОфис Таблицы Домашняя версия занимает порядка 1 858 726 КиБ.
Скриншот окна в МойОфис Таблицы Домашняя версия
г) в OnlyOffice Таблица открытие того же файла осуществляется быстро, прокрутка происходит быстро и плавно, хотя на мой взгляд не такая плавная как LibreOffice Calc, в оперативной памяти OnlyOffice Таблица занимает порядка 618 188 КиБ.
Скриншот окна в OnlyOffice Таблица

2.5 Макросы
2.5.1 Краткий обзор редакторов Макросов в офисных пакетах
а) в MS Excel редактор VBA в представлении не нуждается. Visual Basic for Applications, на текущий момент, представляет собой немного упрощенную реализацию языка программирования Visual Basic 6.0. VBA, будучи языком, построенным на COM, позволяет использовать все доступные в операционной системе COM объекты и компоненты ActiveX.
VBA хорошо документирован. Справочная информация предоставлена как в локальном варианте, так и онлайн. Кроме того пользователи MS Office создали огромное число площадок, сайтов, групп, видео, книг по обучению и обмену опытом, в результате чего возможность программировать на VBA достаточно просто, т.к. относительно легко найти в сети подходящий пример, при условии что Вы правильно формулируете запрос.
Дополнительной возможностью, не мало важной для нас, является еще и тот факт, что выполнение макроса можно связать с кнопкой, которую можно расположить на рабочем листе книги, что так же повышает удобство.
Скриншот окна в MS Excel
б) в LibreOffice Calc используется LibreOffice Basic (LO Basic, LibreOffice Basic, OOo Basic, он же StarBasic), который в свою очередь частично совместим с VBA, но реализован иначе, из-за чего мы имеем разную производительность абсолютно идентичных макросов. Справочная информация предоставлена как в локальном варианте, так и онлайн, однако ресурсов посвященных этому BASIC'у намного меньше чем у VBA, тем не менее совместимость с VBA частично помогает решать вопросы.
Дополнительной возможностью, немаловажной для нас, является еще и тот факт, что выполнение макроса можно связать с кнопкой, которую можно расположить на рабочем листе книги, что так же повышает удобство.
Скриншот окна в LibreOffice Calc
в) в МойОфис Таблицы Домашняя версия в настоящий момент реализована поддержка Lua версии 5.3.2, который является свободно распространяемым, с открытым исходным кодом. На сколько я знаю, из широко известных программных продуктов, он так же используется для написания плагинов к FAR. Здесь по ссылке можно скачать справочник макрокоманд. В настоящий момент в рунете сообществ посвященных программированию на Lua только у FAR'а. Редактор имеет спартанский интерфейс, но есть поддержка, правда в тестовом режиме, записи макросов. Назначить кнопку для запуска макроса нельзя.
Скриншот окна в МойОфис Таблицы Домашняя версия
г) в OnlyOffice Таблица используется JavaScript API. Документация по нему… доступна на сайте разработчика. Интерфейс редактора макросов — спартанский, записи макросов нет. Назначить кнопку для запуска макроса нельзя.
Скриншот окна в OnlyOffice Таблица

2.5.2 Пишем тестирующий производительность макрос

Техзадание на макрос:

Тестовый этап №1 — в первую очередь нас интересует производительность операций ввода-вывода в ячейки. Для чего на каждом языке программирования будет написан код, который будет заполнять матрицу 1000х1000 ячеек случайными числами;
Тестовый этап №2 — затем будет осуществляться чтение с заполненного листа в массив (память);
Тестовый этап №3 — после чего макросом осуществим запись заполненного листа в 10 файлов на жесткий диск;
Все три тестовых этапа должны будут сопровождаться фиксацией времени выполнения каждого этапа, собственно это время мы и будем сравнивать в рамках статьи. Таким образом, мы протестируем операции ввода-вывода.

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

2.6.2.1 Макрос VBA в MS Excel


Макрос VBA в MS Excel
Rem -= Заполняем область на Лист1 1000х1000 ячеек случайными значениями до 1000 =-

        Dim wb As Workbook
        Dim x As Integer, y As Integer
        
            Set wb = ThisWorkbook
            wb.Sheets("Лист1").Cells(1, "B") = Format(time, "hh:mm:ss")
            Randomize time
            For x = 1 To 1000 Step 1
                For y = 1 To 1000 Step 1
                    wb.Sheets("Лист1").Cells(y + 6, x) = rnd * 1000
                Next y
            Next x
            wb.Sheets("Лист1").Cells(2, "B") = Format(time, "hh:mm:ss")

Rem -= Читаем область на Лист1 1000х1000 ячеек в массив в память устройства =-

        Dim q(1000, 1000) As Single
            For x = 1 To 1000 Step 1
                For y = 1 To 1000 Step 1
                    Let q(x, y) = wb.Sheets("Лист1").Cells(y + 6, x)
                Next y
            Next x
            wb.Sheets("Лист1").Cells(4, "B") = Format(time, "hh:mm:ss")
        
Rem -= Сохраняем Лист1 на жесткий диск в виде MS Excel фала 10 раз =-
        Dim ИмяФайла As String
            Application.DisplayAlerts = False
            For x = 1 To 10 Step 1
                Let ИмяФайла = ThisWorkbook.Path + "\" + "Test"
                Let ИмяФайла = ИмяФайла + CStr(x) + ".xlsx"
       
                wb.Sheets("Лист1").Copy
                ActiveWorkbook.SaveAs Filename:=ИмяФайла, _
                    FileFormat:=51
                    ActiveWindow.Close
            Next x
            Application.DisplayAlerts = True
            wb.Sheets("Лист1").Cells(6, "B") = Format(time, "hh:mm:ss")

Собственно, здесь все просто и без выкрутасов. Два вложенных цикла, в которых перебираются ячейки по X и Y, сперва заполняя случайными числами, а потом считывая их в массив. Сохранение тоже без каких-либо неожиданностей. Результат выполнения макроса в приведенном скриншоте.

2.6.2.2 Макрос LibreOffice Basic в LibreOffice Calc


Макрос LibreOffice Basic в LibreOffice Calc
Rem -= Заполняем область на Лист1 1000х1000 ячеек случайными значениями до 1000 =-

        Dim wb As Workbook
        Dim x As Integer, y As Integer
        
            Set wb = ThisWorkbook
            wb.Sheets("Лист1").Cells(1, "B") = Format(time, "hh:mm:ss")
            Randomize time
            For x = 1 To 1000 Step 1
                For y = 1 To 1000 Step 1
                    wb.Sheets("Лист1").Cells(y + 6, x) = rnd * 1000
                Next y
            Next x
            wb.Sheets("Лист1").Cells(2, "B") = Format(time, "hh:mm:ss")

Rem -= Читаем область на Лист1 1000х1000 ячеек в массив в память устройства =-

        Dim q(1000, 1000) As Single
            For x = 1 To 1000 Step 1
                For y = 1 To 1000 Step 1
                    Let q(x, y) = wb.Sheets("Лист1").Cells(y + 6, x)
                Next y
            Next x
            wb.Sheets("Лист1").Cells(4, "B") = Format(time, "hh:mm:ss")
        
Rem -= Сохраняем Лист1 на жесткий диск в виде MS Excel фала 10 раз =-
        Dim ИмяФайла As String
            Application.DisplayAlerts = False
            For x = 1 To 10 Step 1
                Let ИмяФайла = ThisWorkbook.Path + "\" + "Test"
                Let ИмяФайла = ИмяФайла + CStr(x) + ".xlsx"
       
                wb.Sheets("Лист1").Copy
                ActiveWorkbook.SaveAs Filename:=ИмяФайла, _
                    FileFormat:=51
                    ActiveWindow.Close
            Next x
            Application.DisplayAlerts = True
            wb.Sheets("Лист1").Cells(6, "B") = Format(time, "hh:mm:ss")

Несмотря на то что VBA и LibreOffice Basic имеют отличия, в этом фрагменте макрос LibreOffice Basic идеально повторяет код для VBA. Так же все просто и без выкрутасов. Два вложенных цикла, в которых перебираются ячейки по X и Y, сперва заполняя случайными числами, а потом считывая их в массив. Сохранение тоже без каких-либо неожиданностей. Результат выполнения макроса в приведенном скриншоте. Заметна разница в операциях заполнения/чтения ячеек в файле, по сравнению с VBA, при чем на порядок, но тут же в 2,5 раза выше скорость доступа к диску, при записи файлов.

2.6.2.3 Макрос Lua в МойОфис Таблица Домашняя версия


Предвосхищая удивленный возглас — да, здесь все сложно. К сожалению мне не удалось разобраться с записью макросом таблиц в несколько файлов, а так же с передачей времени в переменную. Тут меня ждало фиаско: Lua позволяет работать со временем, т.е. можно получить текущее время в переменную и записать его в ячейку, но проблема в том, что os.time() здесь не работает, а при использовании DocumentAPI.DateTime из инструкции макрос выдает ошибку: либо nil, либо пусто, если прописать его в переменную с конвертацией типа в текст. Примеров по использованию этого API в сети нет. Соответственно все замеры времени сделаны на секундомере смартфона и содержат некоторую погрешность, в отличие от других случаев оценки времени для других Офисов в статье. Каюсь, ибо грешен.

Продолжим, если совершить действие по вставке в ячейку любого числа и записать его, то мы получим монструозный код.
Макрос Lua в МойОфис Таблица Домашняя версия
-- This macros is generated by the MacroRecorder feature.

function changeTableSelection(anchorOffsetRow, anchorOffsetColumn, cursorOffsetRow, cursorOffsetColumn)
    local selection = EditorAPI.getSelection()
    local tbl = selection:getTable()
    local beginRow = selection:getBeginRow() + anchorOffsetRow
    local beginColumn = selection:getBeginColumn() + anchorOffsetColumn
    local lastRow = cursorOffsetRow and selection:getLastRow() + cursorOffsetRow or beginRow
    local lastColumn = cursorOffsetColumn and selection:getLastColumn() + cursorOffsetColumn or beginColumn
    assert(beginRow >= 0 and beginRow <= lastRow, 'Selection goes out of the top border of the sheet')
    assert(beginColumn >= 0 and beginColumn <= lastColumn, 'Selection goes out of the left border of the sheet')
    if (lastRow >= tbl:getRowsCount()) then
        tbl:insertRowAfter(tbl:getRowsCount() - 1, false, lastRow - tbl:getRowsCount() + 1)
    end
    if (lastColumn >= tbl:getColumnsCount()) then
         tbl:insertColumnAfter(tbl:getColumnsCount() - 1, false, lastColumn - tbl:getColumnsCount() + 1)
    end
    local position = DocumentAPI.CellRangePosition(beginRow, beginColumn, lastRow, lastColumn)
    EditorAPI.setSelection(tbl:getCellRange(position))
end

function updateFormulaInCurrentCell(value)
    local selection = EditorAPI.getSelection()
    local cellPos = DocumentAPI.CellPosition(selection:getBeginRow(), selection:getBeginColumn())
    selection:getTable():getCell(cellPos):setContent(value)
end

--main
changeTableSelection(5, 2, nil, nil)
updateFormulaInCurrentCell('1')
EditorAPI.changeSelection(EditorAPI.SelectionMode.Move, EditorAPI.SelectionDirection.Down, EditorAPI.TableSelectionUnit.ToClosestCell)

Здесь монструозная текстом функция changeTableSelection вызывает смещение относительно текущей позиции курсора на задаваемое число ячеек по строкам и столбцам, а EditorAPI.changeSelection(EditorAPI.SelectionMode.Move, EditorAPI.SelectionDirection.Down, EditorAPI.TableSelectionUnit.ToClosestCell) сдвиг курсора после ввода на одну ячейку вниз. Собственно на этой механике постоянного перемещения курсора и строится адресация записи в ячейку, сама же запись происходит через функцию updateFormulaInCurrentCell. Пользуясь этим мы пишем Первый вариант макроса на заполнение поля 1000 на 1000 ячеек.
Первый вариант макроса на заполнение поля 1000 на 1000 ячеек.
-- This macros is generated by the MacroRecorder feature.

function changeTableSelection(anchorOffsetRow, anchorOffsetColumn, cursorOffsetRow, cursorOffsetColumn)
    local selection = EditorAPI.getSelection()
    local tbl = selection:getTable()
    local beginRow = selection:getBeginRow() + anchorOffsetRow
    local beginColumn = selection:getBeginColumn() + anchorOffsetColumn
    local lastRow = cursorOffsetRow and selection:getLastRow() + cursorOffsetRow or beginRow
    local lastColumn = cursorOffsetColumn and selection:getLastColumn() + cursorOffsetColumn or beginColumn
    assert(beginRow >= 0 and beginRow <= lastRow, 'Selection goes out of the top border of the sheet')
    assert(beginColumn >= 0 and beginColumn <= lastColumn, 'Selection goes out of the left border of the sheet')
    if (lastRow >= tbl:getRowsCount()) then
        tbl:insertRowAfter(tbl:getRowsCount() - 1, false, lastRow - tbl:getRowsCount() + 1)
    end
    if (lastColumn >= tbl:getColumnsCount()) then
         tbl:insertColumnAfter(tbl:getColumnsCount() - 1, false, lastColumn - tbl:getColumnsCount() + 1)
    end
    local position = DocumentAPI.CellRangePosition(beginRow, beginColumn, lastRow, lastColumn)
    EditorAPI.setSelection(tbl:getCellRange(position))
end

function updateFormulaInCurrentCell(value)
    local selection = EditorAPI.getSelection()
    local cellPos = DocumentAPI.CellPosition(selection:getBeginRow(), selection:getBeginColumn())
    selection:getTable():getCell(cellPos):setContent(value)
end

--main
-- перед стартом поместить курсор в ячейку А1

for x=1, 1000, 1 do
	for y=1, 1000, 1 do
		updateFormulaInCurrentCell(math.random()*1000)
                EditorAPI.changeSelection(EditorAPI.SelectionMode.Move, EditorAPI.SelectionDirection.Down, EditorAPI.TableSelectionUnit.ToClosestCell)
	end
	changeTableSelection(-1000, 1, nil, nil)
end

Тут нужно сказать еще об одном нюансе. МойОфис таблицы не позволяет иметь на листе кол-во столбцов больше 1000 (ALL). Что наводит на некоторые мысли связанные с ограничениями работы ПО.
Однако я отвлекся, т.к. время выполнения макроса было слишком большое, то мне пришлось оценивать скорость по выполнению лишь одной его части — записи одного столбца. При заполнении 1-го столбца на 1000 ячеек случайными числами от 1 до 1000 тратится время 1мин. 54 сек. Таким образом поле 1000 х 1000 ячеек будет заполнено за время =(60+54)сек/столбец * 1000 столбцов / 60сек / 60мин = 31,67час.

Однако в инструкции есть другой метод адресации для записи в ячейку через getCell(DocumentAPI.CellPosition(y, х)). Пишем теперь уже совсем простенький макрос:
Второй вариант макроса на заполнение поля 1000 на 1000 ячеек.
local tbl = document:getBlocks():getTable(1)

for x=0, 1000, 1 do
	for y=0, 1000, 1 do
        tbl:getCell(DocumentAPI.CellPosition(y, x)):setNumber(math.random()*1000)
	end
end

Что выглядит значительно проще для восприятия и логики работы, но при этом… Оценка времени велась так же: при заполнении 1-го столбца на 1000 ячеек случайными числами от 1 до 1000 тратится время 6минут. Таким образом поле 1000 х 1000 ячеек будет заполнено за время = 6мин/столбец * 1000 столбцов / 60 мин = 100час. Видимо из-за этой разницы функционал записи макроса генерирует не этот код, а другой, более объемный.

Дальше пишем макрос на чтение поля 1000 х 1000 ячеек в массив.
Чтение поля 1000 х 1000 ячеек в массив
local tbl = document:getBlocks():getTable(1)

Arr = {}
for x=1, 1000, 1 do
	Arr[x] = {}
	for y=1, 1000, 1 do
            Arr[x][y]=tostring(tbl:getCell(DocumentAPI.CellPosition(y-1, x-1)):getFormattedValue());
	end
end


Который выполняется за… 12 секунд. С чем связана такая разница между временем записи данными в ячейки и считыванием их в память на Lua в МойОфис — хороший вопрос!

При беглом знакомстве был выявлен минус работы с макросами это то, что область таблицы недоступна для навигации и правок, пока открыт редактор макросов. В том же MS Excel можно без проблем переключаться между таблицей и редактором. Так же, в отличие от того же редактора VBA, не исправляется регистр букв в соответствии с внутренними представлениями о прекрасном. Зато тут есть консоль в которую выводятся как ошибки выполнения, так и через print() содержание переменных, что удобно при отладке. Работа с массивами непривычна, т.к. они не жесткие, как я привык по Basic, Pascal, C. В сети мало информации и примеров. Документация на сайте представлена всего лишь одной инструкцией, которая хоть и идет с примерами, но их явно недостаточно. В сети нет сообществ по обмену опытом программирования макросами Lua в МойОфис, но, справедливости ради, есть сообщество по Lua, что не одно и то же. Нет жесткой типизации переменных. В общем это другая парадигма отличная от той что меня учили в 90-е… может это и хорошо, но в целом непривычно.

2.6.2.4 Макрос JS в OnlyOffice Desktop Editors


Макрос JS в OnlyOffice Desktop Editors
var oWorksheet = Api.GetActiveSheet();
 var arr = new Array(1001);


// Из-за отсутствия прямой цифровой адресации по колонкам обхожу ограничение через костыль

   for (let x1 = 1; x1 <= 1001; x1++) {
        let t="A" + x1;
        arr[x1]=oWorksheet.GetRange(t).GetValue();    
    } 
    
// Заполняем поле на листе 1000 х 1000 ячеек 
   
   var currentdate1 = new Date();
   let t1 = currentdate1.getHours() + ":" 
          + currentdate1.getMinutes() + ":"
          + currentdate1.getSeconds();
   
   oWorksheet.GetRange("C1").SetValue(t1);
    
   for (let y = 7; y <= 1007; y++) {
  
    
       for (let x2 = 2; x2 <= 1001; x2++) {
           oWorksheet.GetRange(arr[x2] + y).SetValue(Math.random()*1000); 
        } 
        oWorksheet.GetRange("D1").SetValue(y);
    }

  
  var currentdate2 = new Date();
    let t2 = currentdate2.getHours() + ":" 
           + currentdate2.getMinutes() + ":"
           + currentdate2.getSeconds();
   
    oWorksheet.GetRange("C3").SetValue(t2);   
    
  // читаем поле на листе 1000 х 1000 ячеек в массив
 
 var arr1 = Array(1001);
 
   for (let y1 = 7; y1 <= 1007; y1++) {
  
    oWorksheet.GetRange("D1").SetValue(y1);
       for (let x3 = 1; x3 <= 1000; x3++) {
          arr1[x3]= oWorksheet.GetRange(arr[x3] + y1).GetValue();
        } 
        oWorksheet.GetRange("D1").SetValue(arr1[1000]);
    }
  
  var currentdate3 = new Date();
    let t3 = currentdate3.getHours() + ":" 
           + currentdate3.getMinutes() + ":"
           + currentdate3.getSeconds();
   
   oWorksheet.GetRange("C4").SetValue(t3);  


Здесь сразу возникли трудности, с частью из которых удалось разобраться благодаря справке на сайте OnlyOffice , другие вещи пришлось google'ить. В ряде случаев выручили примеры кода, так что справка очень даже полезная. Например из чтения документации я понял что в явном виде JS не поддерживает многомерные массивы и это нужно обходить, потом вышли накладки с повторным использованием переменных в коде, из-за чего пришлось их дублировать. Что не критично, но в то же время не совсем корректно. При адресации к ячейке необходимо прописывать адреса исключительно текстом, например «D7», в отличие от тех же Basic'ов/Lua где столбец-строка допускают в макросе использовать цифровую адресацию, что не удобно, но не критично и решается через дополнительный массив.
Какие-то моменты от меня ускользнули, т.к. это мой первый код на JS да и еще в виде макроса. К сожалению OnlyOffice при такой масштабной портянке значений 1000 х 1000 ячеек постоянно вис, вылетал, из-за чего код пришлось прогонять частями. При этом, насколько я понял из описания, поправьте если ошибаюсь, JS не позволяет макросом сохранить текущий лист в файл. Нет, OnlyOffice двигает функционал генерации документов с помощью ONLYOFFICE DocumentBuilder, здесь про него написано на официальном сайте, но это внешний модуль, благодаря которому программируя можно создавать новые файлы (однако придется прописывать весь текст и форматирование таким образом отдельным макросом), в то время как я планирую использовать уже готовые шаблоны, для чего открывать файлы с диска, производить манипуляции и сохранять как новый файл, таким образом исключая необходимость программировать стили оформления и заполняемый текст. Запросив поддержку я получил ответ в чате, что по десктопной версии они не консультируют и предложили пролистать несколько десятков страниц форумов и справки.
Еще один минус работы с макросами в ONLYOFFICE это то, что как и в МойОфис область таблицы недоступна для навигации и правок, пока открыт редактор макросов. В отличие от MS Excel, где можно без проблем переключаться между таблицей и редактором. Так же, в отличие от того же редактора VBA, не исправляется регистр букв в соответствии с внутренними представлениями о прекрасном. Зато есть всплывающая подсказка, предлагающая закончить вводимый текст, что удобно. Общие ошибки подсвечиваются, но комментарии по ним куцые. Часто код останавливает без вывода ошибок, если они связаны с логикой, и разобраться почему ты напортачил, т.е. подсмотреть по коду ошибки куда копать — нельзя.

Результат выполнения макроса в приведенном скриншоте. В операциях ввода-вывода на текущем листе макрос отрабатывает быстрее чем VBA, но не критично, но при этом файл на больших данных виснет. Сохранение такого файла занимает 20сек.

3. Выводы


3.1 Оценка производительности Офисных продуктов

Результаты тестирования возможностей.

Результаты тестирования макросов.

3.2 Оценка альтернатив для замены MS Office
На текущий момент, из рассмотренных офисных пакетов, оптимальной заменой MS Office, с учетом связки возможностей таблиц и макросов, будет LibreOffice, а если не касаться вопросов макросов и огромных файлов, то OnlyOffice так же может быть рекомендован к домашнему использованию. МойОфис, на фоне остальных офисных продуктов, откровенно подкачал, здесь и меньшее количество поддерживаемых формул/функционала, здесь и слабая справка по продукту, особенно в части макросов.

Что же касается проблемы переноса моей программы «Автоматизированное заполнение документации» для заполнения Ваших шаблонов и документов, то лучше всего ее переносить на базу LibreOffice с полной перезаписью кода. При этом полученный вариант будет работать медленнее чем на MS Office, из-за медленного StarBasic. На текущий момент ни МойОфис, ни OnlyOffice не смогут в полной мере справиться с реализацией такого функционала, а искренне жаль…

3.3 Оценка перспективы будущего малой автоматизации в Linux
Все нижеперечисленное есть лишь скромное мнение автора, который не претендует на истину в последней инстанции.

На мой взгляд объективно лучшим для малой автоматизации есть пакет MS Office, не смотря на старые подходы, тому же VBA уже 29 лет, если считать с момента первого появления в составе Офисного пакета в далеком 1993м году. Однако он работает и на нем написано огромное количество кода, а если учесть что такой подход не требует дополнительной установки ПО/библиотек, то это означает отсутствие барьеров для распространения и внедрения кроме воли самих пользователей.

И JS, и Lua, и StarBasic уступают, по разным причинам, VBA. Отказ от иностранного ПО часть таких барьеров возводит, потому что ограничивает выбор ПО, и здесь мы получаем ситуацию, когда альтернативы сами по себе, без установки дополнительного ПО, откровенно не вывозят по сравнению с VBA. На текущий момент, VBA в таких условиях для сохранения возможностей, перспективнее всего будет заменить внешним ПО, позволяющим многофункциональную работу и редактирование форматов файлов электронных таблиц, например python или аналогичных. Что поднимет не только порог вхождения новым пользователям/разработчикам, но так же вызовет вопросы с установкой и настройкой нового ПО. Однако это не прогресс в технологиях, а откат, т.к. сократится число потенциальных пользователей, которые смогут выступить в роли программиста на час. Что в свою очередь вызовет увеличение трудоемкости в документообороте страны.

PS.

Ссылка на облако с файлами для статьи
Всем Добра!

Комментарии (49)


  1. nerudo
    12.07.2022 10:55
    +1

    Я человек простой, табличками пользуюсь как дикарь телескопом. Один из самых болезненных для меня в плане производительности кейсов — скопировать более-менее сложную структурированную страничку из веба и вставить в таблицы. Совершенно рандомным образом (видимо в зависимости от сложности скрытой структуры страницы) это может занимать от секунд до минут, а то и вовсе насмерть повиснуть. У всяких веб-поделий с этим и вовсе беда.


    1. LuchS-lynx Автор
      12.07.2022 11:01
      +3

      Если приведете пример для тестирования, в Вашем случае, то такую вставку провернуть не будет сложно. С меня тогда отчет по всем озвученным офисам.


    1. dodgev
      12.07.2022 11:36
      +1

      А вы вставляете через правую кнопку мыши "только значения" или просто ctrl-V?


  1. OneManStudio
    12.07.2022 11:02

    Если брать сравнение в контексте указанных вами законов, то выбор только Мой офис и Р7 офис (который onlyoffice по сути).
    Почему? Потому что План перехода на отечественное ПО, работает уже лет 6, и подразумевает не только платный софт а вообще ВСЕ ПО которое используется. И не важно что это опенсорс и его не надо покупать. Потому для госов и муниципалов можете вычеркнуть любой опенсорс если он вне реестра отечественного ПО.


    1. LuchS-lynx Автор
      12.07.2022 11:05
      +1

      Закон ничего не говорит о том что Вы должны ставить на Ваш личный ПК/ноутбук, более того Закон ничего не говорит о ПО, которым может пользоваться Подрядчик, да, ему придется подстраиваться под Заказчика, но на часть машин он может поставить тот же LibreOffice и пользоваться им в свое удовольствие. Кроме того, только в сравнении познается мир.


      1. OneManStudio
        12.07.2022 11:33
        +1

        Прочитайте еще раз свое введение к статье. Вы рассматриваете как раз в контексте законов по импортозамещению и кии т.е. те рабочие места на которые эти законы распространяются. Я вот тоже не вижу какая разница что у вас на личном ноутбуке если это вне рамок вашей же статьи.


        А для офиса и дома, я бы выбрал и выбрал еще два года назад onlyoffice.
        - он используется у яндекса в облаке;
        - его используют часть госов закупая как Р7 офис;
        - можно развернуть даже на домашнем сервере;
        - интеграция с документ сервером поддерживается достаточно большим количеством сервисов;
        - отличная совместимость с документами ms, плюс конвертирует pdf в docx значительно лучше чем даже 2013 офис.

        Либра на этом фоне выглядит как пережиток, который использовали в виду отсутствия каких либо адекватных альтернатив.


        1. LuchS-lynx Автор
          12.07.2022 11:45

          MS Office - это то что по плану должно уйти, МойОфис - то что должно прийти ему на смену в гос.органах и структурах Заказчика, LibreOffice/OnlyOffice - альтернативы которые имеют все шансы прописаться на домашних ПК Пользователей, в бизнесе который не связан с КИИ, на ПК/ноутбуках в структурах Подрядчика (про которых в Указе Президента ни слова), а так же выступают фоном для сравнения.


          1. OneManStudio
            12.07.2022 12:03

            У Мой Офис есть конкурент, Р7 офис, это локализованное подразделение OnlyOffice которое есть в реестре отечественного ПО и которое уже закупают так же как и Мой Офис. Смотря кто тендер выиграет. Поэтому мой выбор и упал на Only так как он охватывает вообще все и для домашнего и коммерческого использования бесплатен, для госов платен, но там идет его брат близнец Р7.
            Мой офис щупал, но по мне он даже до Либры не дорос как бы его не пиарили. Может быть сейчас что то изменилось, но желания нет, да и смысла не вижу его снова щупать.


            1. LuchS-lynx Автор
              12.07.2022 12:07

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


              1. OneManStudio
                12.07.2022 21:05

                Потому что Р7 позиционируется для госсектора и для комерсов, которые должны отвечать требованиям защиты (КИИ). Для всего остального есть onlyofficе. Мой офис просто часто и на хабре и новостях, но зайдите посмотрите клиентов Р7 на их сайте. Будете приятно удивлены. Да я им симпатизирую, потому что у них и саппорт даже в рамках комьюнити продуктов адекватный и всегда рады фидбеку. Я за такие продукты, а не за просто рекламу. Инструмент должен работать в первую очередь и иметь адекватный саппорт.

                Ну и если вам не нравиться что надо заполнить форму для Р7,вспомните что пару лет назад мой офис вообще попробовать можно было сугубо купив его версию для десктопа даже для домашнего использования. При этом ключ присылали несколько дней. Если вам сложно заполнить форму, думаю писать что не смотрел потому что это сложно, ну такое себе, тем более для хабра.


        1. economist75
          12.07.2022 21:28

          LibreOffice как раз наиболее реальный "импортозаместитель" MSO - в силу 100% доступности юзерам с ограниченными правами (без прав инсталляции), из-за реально высокой скорости работы и функционала, соразмерного с MSO и превышающего функционал конкурентов.

          Все тесты в которых в статье "выиграл" VBA + MS Excel -- LibreOffice Calc выиграет, если задействовать другой встроенный в него язык программирования, не требующий, как и VBA, установки, также имеющий IDE c автодополнением и интроспекцией. Я о языке Python. Да и сам LibreOffice работает в режиме Portable, т.е. просто распаковывается на любой диск, раздел, флешку (занимая там ~1 Гб) .

          Чтобы Calc c Python обогнал MS Excel c VBA в несколько раз - нужны сторонние библиотеки Pandas и Numpy (написаны на С++, Fortran итд), которые можно как установить через pip, а можно просто скачать и распаковать. Подробности описал тут: https://forumooo.ru/index.php/topic,8696.0.html Именно возможность тайком бесплатно распаковать LibreOffice с подкапотным Python и использовать в т.ч. и в госконторах - делает его растущим и перспективным средством офисной автоматизации.


          1. InChaos
            13.07.2022 09:38
            +1

            LibreOffice как раз наиболее реальный "импортозаместитель" MSO - в силу 100% доступности юзерам с ограниченными правами (без прав инсталляции)

            Импортозамещение требуется только в госорганах, и тут ставится софт на рабочую машинку админами, у пользователей в таких структурах 100% гарантия нет никаких прав, кроме как читать/писать из/в определенные папки и запускать "белый" список софта. А так как его нет в реестре, значит он никак, по определению, на меожет быть реальным "импортозаместителем" MSO"


        1. neuroonet
          13.07.2022 13:59

          • Ну а МойОфис в Меил (вк)

          • Есть мобильное приложение и куча других продуктов

          • По новостям Мойофис мелькает сильно чаще как и отметил автор, из чего делаю вывод, что закупают его чаще. Вероятно не просто так.

          • Плюс домашняя версия у Р7 не бесплатная. Это остановит буквально всех пользователей. Они за майкрософт то в большинство своем не платили, а уж за это и подавно не будут.

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


          1. LuchS-lynx Автор
            13.07.2022 14:27

            По статье автору хочется задать только один вопрос - почему тестировалась домашняя версия для решения рабочих задач.

            Я ищу наиболее массовую платформу, что бы переписать свою программу и ее функционал в рамках малой автоматизации. Чем более доступная платформа, тем лучше и ниже порог входа для потенциального пользователя.


            1. neuroonet
              13.07.2022 17:13

              Ну можно и микроскопом гвозди забивать, просто молотком это все же удобнее и правильнее.


  1. QuAzI
    12.07.2022 11:08
    -4

    Уже много лет как пора VBA закопать и принять уже очевидную мысль: либо таблички для юзверей, либо разрабатывать полноценный софт с нормальными переносимыми компонентами не тянущими за собой "единственно правильную" версию офиса для выгрузки в таблицу.
    Потому что всё это VBA работает через... даже в разных версиях самого MSO, не говоря о вопросах безопасности запуска всяких левых скриптов...
    И некоторые окологосы с этой их любовью к креативу из говна и палок уже много лет как портят людям жизнь с этими их "рекомендациями".


    1. Myclass
      12.07.2022 11:59
      +7

      ну конечно-же — или белое или чёрное. Ведь в жизни тоже нет никаких полутонов. #ирония

      Легко сказать про других "… окологосы с этой их любовью к креативу из говна и палок уже много лет..". Но ведь мы понимаем, что за всем этим стоит не только тупость разработчиков или тех, кто пытается с VBA что-нибудь автоматизировать — не хватает знаний, времени, хорошего наставника итд.

      На любом языке пишется немало плохого кода — но от этого не язык — проблема. А именно его использование. Литературным языком тоже не каждый пользоваться правильно может — что из этого — язык запретить?

      Мне анализ автора понравился, хоть лично мне он и не нужен.

      а ваш "… полноценный софт с нормальными переносимыми компонентами.." больше тянет на утопию. Верить в совершенный подход — пустая трата времени, сил и нервов. Хоть я вас и понимаю. Но у нас есть всегда возможность — если нам это не подходит, то можем не смотреть, не пользоваться, игнорировать. А ещё лучше — помогать другим, если можем — стать лучше.


    1. Alexsandr_SE
      12.07.2022 15:18
      +1

      А сколько софта написаного на VBA есть и все ещё работающего и развивающегося. Это служебный софт, но оно работает и за него платят.


    1. InChaos
      13.07.2022 09:41
      +1

      Как раз в госах он очень востребован. Чтоб в каком то проприетарном софте что то изменить/добаить столько уйдет времени и согласований, дождешься к пенсии, а то еще и откажут. Поэтому просто делается макрос небольшой, берется выгрузка данных и все работает тут же и сразу.


  1. killov
    12.07.2022 11:53
    +1

    Почему нельзя было в формуле "ПРАВСИМВ" заменить на "ПРАВ"?


    1. LuchS-lynx Автор
      12.07.2022 13:51

      Спасибо за подсказку, потому что с LibreOffice я знаком поверхностно и до написания этой статьи я ней не работал.
      Судя по описанию и функционалу ПРАВ в LibreOffice эквивалентен ПРАВСИМВ в MS Office, но при этом именно как массив в составе формулы все равно не работает. Т.к. логика блока с этими формулами в массиве заключается в том, что общую длинную строку нарезают на более короткие по символу - разделителю пробелу, но так что бы такие строки не превышали по длине 105 символов (но последнее настраивается через модификацию формулы). А кроме того этот нюанс, как и вопрос с диапазоном печати, показывают что LibreOffice не только не пытается копировать на 100% MS Office, но и местами реализует решения иначе, из-за чего простое копирование "в лоб", не проходит.


      1. killov
        12.07.2022 14:58

        Если честно, за время, сопоставимое с конструированием функции из примера, можно написать функцию на BASICe, которая будет лишена подобных ограничений. Разобраться там один раз и недолго.


        1. Myclass
          12.07.2022 15:06
          +1

          Каждый раз такие как вы забывают, что программист конечно-же может всё сделать у себя в visual Studio это профессиональней. Но. Для этого нужны намного большие знания и навыки программирования, среда для разработки итд. Хороших Программистов мало. В отделе продаж или маркетинга в компании, юзеры которых не имеют никаких администраторских прав, что-либо устанавливать у себя на компах - как вы собираетесь это реализовать?


          1. killov
            12.07.2022 15:29

            Это не профессиональней, это проще.


  1. dlinyj
    12.07.2022 12:20

    Пользуюсь WPS офис под линукс, и горя не знаю. Ещё сейчас пробую SoftMaker Office — вполне вменяем.


    1. nikweter
      12.07.2022 12:29

      В softmaker разве есть макросы?

      Еще недавно яндекс присылал какое-то заявление на подключение онлайн кассы в docx. Там редактирование залочено, разрешено править только в определенных полях. В итоге только onlyoffice мог заполнить, он просто плевать хотел на запрет, редактировал весь файл. МС офис редактировал только в нужных местах, остальные вообще не могли редактировать файл.


      1. peacemakerv
        12.07.2022 12:40

        Есть, и их SoftMaker Basic (https://www.softmaker.net/down/bm2021manual_en.pdf) очень похож, и, по-моему, сильно совместим с VBA. Но, правда, мне не удалось заставить его открыть файл и преднастроить форматирование листа для вывода на принтер (в отличие от Мелкомягкого оригинала).

        Но ... Note: BasicMaker is available only under Windows. It is not included in all versions of SoftMaker Office.


        1. nikweter
          12.07.2022 12:59

          А, у меня как раз Linux основная ОС, поэтому и думал что нет макросов.


        1. 13werwolf13
          12.07.2022 14:46

          в отличие от Мелкомягкого оригинала

          кто ещё оригинал.. я конечно возможно что-то путаю, но емнип мелкомягкие в своё время купили свой офис у softmaker..


      1. dlinyj
        13.07.2022 12:39

        Не в курсе, третий день использую.


    1. LuchS-lynx Автор
      12.07.2022 14:06
      +2

      ИМХО, WPS Office максимально близкий к MS Office в части функционала, даже VBA поддерживает, но в платной версии и только под Windows. Я все же старался выбрать нативные офисные пакеты под Linux и с поддержкой макросов в доступной версии, а не по подписке.


      1. dlinyj
        13.07.2022 12:40

        Ну лично мне важно удобство, пока WPS рулит. Он не безгрешен, проблем там хватает.


  1. Geckelberryfinn
    12.07.2022 13:03
    +1

    Насколько я помню, раньше можно было в разы повысить производительность операций с ячейками, запретив обновление интерфейса Excel:

    Application.ScreenUpdating = False


    1. Myclass
      12.07.2022 13:26

      также и видимость Worksheet(а) отключать стоит — иногда скорость тоже увиличивает.


    1. LuchS-lynx Автор
      12.07.2022 13:39
      +3

      Можно, по опыту - для ускорения VBA достаточно на время работы макроса отключить, предварительно отладив код, всякую отрисовку интерфейса и расчет формул (с последним надо аккуратнее), а в конце макроса включить опции обратно. Даже без оптимизации кода такой подход ускоряет время выполнение макроса на порядок или даже порядки. У меня при заполнении шаблона с 1.5мин. на 1 лист время упало до 9 секунд.

      'Ускоряем Excel путём отключения всего "тормозящего"
      Public Sub AccelerateExcel()
      
      'Больше не обновляем страницы после каждого действия
      Application.ScreenUpdating = False
      
      'Расчёты переводим в ручной режим
      Application.Calculation = xlCalculationManual
      
      'Отключаем события
      Application.EnableEvents = False
      
      'Не отображаем границы ячеек
      If Workbooks.Count Then
      ActiveWorkbook.ActiveSheet.DisplayPageBreaks = False
      End If
      
      'Отключаем статусную строку
      Application.DisplayStatusBar = False
      
      'Отключаем сообщения Excel
      Application.DisplayAlerts = False
      
      End Sub


  1. Johan_Palych
    12.07.2022 13:16

    "При этом гостевой операционной системой для тестов у меня используется полюбившийся мне Debian 11.3 non-free..."
    Уже 11.4.0+nonfree.
    Я просто хочу уточнить, Вы "Debian 11.3 non-free" позиционируете как отдельный дистрибутив?
    Все тесты установки MS Office на wine

    https://appdb.winehq.org/objectManager.php?sClass=application&iId=31

    Для работы с ПО от MS лучше использовать виртуалку с Windows:
    SQL Server Management Studio (SSMS), MS Power BI Desktop,
    MS: Visio Professional 2013-21, Project Professional 2013-21

    Для нативного Debian 11.4 Bullseye(совместим с Ubuntu 20.04) c репами от ms:

    ms-teams, mssql-server-2019-22(Linux), vscode, dotnet-sdk, aspnetcore-runtime,
    dotnet-runtime, PowerShell, mono (alias nuget=«mono /usr/local/bin/nuget.exe»)
    https://packages.microsoft.com/
    Azure Data Studio - почти аналог SSMS для macOS и Linux
    https://github.com/microsoft/azuredatastudio


    1. LuchS-lynx Автор
      12.07.2022 13:34

      Уже 11.4.0+nonfree.

      Debian 11.4 вышел 09.07.2022, в то время как основные тесты прогонялись в июне месяце, а последние были завершены 04.07.2022, дальше текст полировался + я ожидал ответ на пару запросов.

      Я просто хочу уточнить, Вы "Debian 11.3 non-free" позиционируете как отдельный дистрибутив?

      Дистрибутив Linux'а - Debian, версии номер 11.3, редакция non-free.
      Хост крутится на Proxmox 7.2-1 (что тот же Debian Linux, только в профиль), на нем виртуальная машина с гостем Debian 11.3 редакции non-free, последнюю я использую т.к. при установке мне был нужен видеодрайвер для ноутбучной GTX1660ti. Просто с это версией Debian'а проблем было меньше всего, хотя можно то же самое провернуть с классической версией. Настройки ВМ для тестирования офисных пакетов - в этой статье в скриншоте.

      Для работы с ПО от MS лучше использовать виртуалку с Windows

      Лучше - согласен, но смысл в том, что согласно Указа Президента РФ чиновники и структура Заказчика, а так же объекты КИИ к 2025му году должны перейти массово на российское ПО. Я не буду обсуждать на сколько каждая программа в нем имеет % российского кода, но операционной системы MS Windows там нет. Соответственно и тестирование было на Linux'е. Почему Debian? Потому что на сегодня это самый плодовитый дистрибутив-прародитель, пресловутая Astra Linux базируется на Debian, другое дело там версия 10-я, кажется, но тут могу ошибаться.


      1. 13werwolf13
        12.07.2022 14:47

        но операционной системы MS Windows там нет

        так там и M$ office нет..


        1. LuchS-lynx Автор
          12.07.2022 14:53
          +1

          Нет, но сравнивать никто не запрещает, что бы понимать что нас ждет.


  1. kompilainenn2
    12.07.2022 13:31

    Почему LibreOffice использовали устаревший, двухлетней давности? Текущая версия 7.3.4.

    Ну и это, я про производительность особо ничего не увиде в статье


    1. LuchS-lynx Автор
      12.07.2022 13:44

      Почему LibreOffice использовали устаревший, двухлетней давности? Текущая версия 7.3.4.

      Использовался тот что шел в репозиториях Debian'а. Если брать наши российские дистрибутивы Linux'а, то там из коробки тоже не очень свежее ПО. Да, можно было установить посвежее, но я на MS Windows получил того же порядка результаты в версии для винды.

      Ну и это, я про производительность особо ничего не увиде в статье

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


      1. Johan_Palych
        12.07.2022 15:06
        +1

        Debian Backports - официальный репозиторий пакетов,
        адаптированных для работы в стабильной (stable) версии,
        иными словами предоставляет свежие версии программ.

        apt-cache policy libreoffice
        sudo apt install -t bullseye-backports libreoffice


  1. 13werwolf13
    12.07.2022 15:01

    а мне вот интересно почему для тестирования была выбрана плазмащель? (не подумайте что я гномосек, я кедераст, сам я кеды люблю и юзаю евридей!!)

    ТС в коментах не раз упомянул что старался приблизиться к импортозамещённой астре. в астре дефолтное DE это FLY. его конечно нет в других дистрах, но к нему можно приблизиться по потреблению ресурсов и кол-ву фоновых процессов используя например lxqt, а кеды несмотря на всю свою крутизну довольно монструозны, редко ставятся в офисах и что самое печальное имеют свойство влиять на подобные тесты внезапно запуская в фоне baloo или ещё что нибудь что немного поднагрузит процессор, или диск, или откушает память.. в общем так себе выбор. всё это конечно поправимо (например akonadi можно перевести с mysql на sqlite или просто выключить, baloo так же отключается, да и саму плазму можно перевести на xrandr вместо opengl) но зачем если можно было сразу взять что-то более подходящее для тестов.

    в своё время я тоже сравнивал несколько офисных пакетов. под виндой победил wps office, а под линуксом softmaker. (тут дело не только в производительности, учитывалось многое включая то как быстро юзвери переставали нужеть что непривычно и начинали пользоваться)
    в итоге во всех сравнительных таблицах кроме одной M$ был последним проигрывая даже либре и опёнку. единственное в чём он побеждал это размер открываемых файлов (в частности размер таблиц). но при этом он так нещадно насиловал ресурсы что плюс сомнительный, к тому же в реальной жизни я так и не столкнулся с ситуацией когда табличка нужная для работы у какого нибудь юзверя не влезла бы в либру или wps


    1. LuchS-lynx Автор
      12.07.2022 15:22

      а мне вот интересно почему для тестирования была выбрана плазма

      Потому что она нравится ТС'e =) при этом каждый волен выбирать и работать в том что ему ближе, ТС не навязывает.

      ТС в коментах не раз упомянул что старался приблизиться к импортозамещённой астре.

      Помимо Astra Linux, которая имеет свое графическое окружение, в реестре российского ПО идут такие Линуксы, как: Rosa Linux, Alt Linux, Ред ОС, которые по дефолту комплектуются в т.ч. и KDE, в принципе KDE можно установить и на Astra Linux, но тут уже нет пределу совершенству.

      в своё время я тоже сравнивал несколько офисных пакетов. под виндой победил wps office, а под линуксом softmaker.

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

      Возможно в Вашем кейсе некоторое время тому назад была одна ситуация, сегодня - ситуация другая.


      1. Johan_Palych
        12.07.2022 15:49

        А у меня пока нет альтернатив для Oracle's AutoVue и Primavera P6 EPPM. Капстрой и ремонты. Ну только если Spider Project.


  1. myoffice_ru
    12.07.2022 17:16

    Спасибо за вашу глубинно проработанную публикацию и мнение о нашем продукте. Должны сказать, что мы немного разочарованы выбором неподходящего решения для такого рода тестирования. Существенную долю вашего обзора занимает изучение средств автоматизации. Однако в рассмотренном вами бесплатном продукте для частных лиц «МойОфис Стандартный. Домашняя версия» эта функциональность ограничена только макрокомандами, которые позволяют автоматизировать работу только внутри самого документа и не имеют возможности взаимодействовать с файловой системой компьютера. В коммерческом продукте «МойОфис Стандартный» существует возможность подключения внешних надстроек — они обладают значительно большими возможностями, в том числе, позволяют задействовать внешние библиотеки и способны работать с файлами. Будем рады предоставить вам на тестирование актуальную версию дистрибутива «МойОфис Стандартный» и надеемся на объективную корректировку выводов в вашем обзоре.


  1. 0x131315
    12.07.2022 19:07

    Таблички табличками, но их паркинг это что-то. На PHP наиболее лёгкий вариант парсера через php office открывает xlsx табличку на 60мб (порядка 150к простейших записей без формул и форматирования) аж 10 минут, тогда как java-парсео в libre на это тратит секунд 10.

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


  1. SandroSmith
    13.07.2022 01:37

    то в MS Office 2007 и младше приводит к сбросу настроек

    "Младше" в вашем понимании - это 2003, XP, 2000? В ту сторону? Судя по дальнейшему "Но для MS Office 2013 и старше это уже не так актуально" - так и есть.

    Но "младше" - это "вышел позже". Так что должно быть наоборот.

    Или вообще избегать этих наречий и использовать "ранняя/поздняя версии".


  1. Enigmat
    14.07.2022 14:00

    В смысле нет коммьюнити по Lua? А как же https://www.lua.org/community.html? Скажите еще, что книжек нет. Есть же совершенно бомбическое издание от автора языка Роберту Иерузалимски (https://dmkpress.com/catalog/computer/programming/978-5-97060-203-4/), в котором очень подробно описаны все применяемые в языке конструкции. Если бы вы прочитали книгу, то вряд ли бы вписали в недостатки «Нет жесткой типизации переменных», так как это не бага, а фича самого языка Lua.