Экспорт таблицы из Excel в LibreOffice

Автор Fiona, 29 мая 2020, 10:32

0 Пользователи и 1 гость просматривают эту тему.

Fiona

Всем доброго времени суток!

Помогите, пожалуйста... Может кто-то сталкивался с подобной проблемой?
Файл xlsm при открытии в LO удивительным образом сохраняет все кнопки управления, обработчики событий - но после первого запуска макроса таблице словно память отшибает: кнопки не действуют, пока явно не назначишь макрос, ячейки листа не идентифицируются, макросы на событие листа не вызываются.
В чем корень зла?

kompilainenn

В том, что ЛибреОфис - это НЕ МСОфис. Если цель - обработать XLSM в Либре, а затем сохранить в этот же формат и потом работать с ним в Экселе, то это работать не будет
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Fiona

Цель - оценка возможности перехода на LO. Файл сохранен в формате LO,  но отрабатывает только один раз.

kompilainenn

Тогда нужно смотреть файл и немного его доработать. В том числе сами макросы, поскольку Либра макросы VBA понимает, но далеко не до конца
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Fiona

Это понятно:) без доработки макрос  бы и не запустился. Вопрос, почему кнопки управления перестают работать? Как они, после сохранения в ods, определяют событие кнопки, а потом перестают определять это событие после выполнения макроса? В настройках ничего интересного на эту тему не нашла...

Fiona

Добрый день!
Решила к этой теме вернуться... Не могу найти ни на форуме, ни у Питоньяка. Через запись макроса инициируется добавление области в табличке InsertColumnsBefore средствами dispatcher, а как это в макросе прописать не для thisComponent, а для загруженного из thisComponent файла? Причем, с сохранением форматов и формул...  :-\ Помогите, пожалуйста, может есть наработки. Есть нечто похожее для строки, но там копирование в пустую область, а мне нужно раздвинуть колонки, чтобы адаптировать загружаемый файл к новому шаблону.

sokol92

В дополнение и закрепление материала книги А.Питоньяка можно использовать краткое руководство . Там есть и про вставку столбцов (со сдвигом вправо). Диспетчером лучше не пользоваться, если есть "прямой" путь.
Можно для вставки столбцов  также использовать метод insertCells интерфейса XCellRangeMovement. Второй параметр этого метода должен соответствовать COLUMN (4) в перечислении CellInsertMode.
Владимир.

Fiona


Fiona

Здравствуйте!
Наконец, благодаря Вашей коллективной помощи, все работает. Единственно, с увеличением объема импортируемого файла, возникает проблема быстродействия. Когда загружаемый xlsm порядка 3 mb, разница во времени загрузки по сравнению с excel не критична, пара минут. А при загрузке файла размером в 11 mb  время загрузки в разы больше, чем в excel. Почитала, что раньше была в настройках вкладка Память, теперь ее нет. Но конкретно на моем ноуте с аппаратным ускорением вообще проблемы (не могла открыть 7 офис, пока не отключила эту опцию). К вопросу об использовании python начальство отнеслось насторожено. Но может ли этот функционал или что-то иное ускорить копирование листа в 5 тысяч строк? Речь не идет об обработки базы данных (бухи параллельно с базой данных ведут учет в excel для консолидированной отчетности). В течение года шаблон меняется, чтобы не вводить данные в новый шаблон заново используется импорт данных из уже заполненной  таблицы в 120 листов (с учетом возможных изменений структуры - соответственно, просто скопировать лист нет возможности, копируются только заполненные незащищенные ячейки). Помогите, пожалуйста, дайте идею - у Вас это замечательно получается :)

economist

#9
Для правильных идей мало вводных.

Если переходить на LO Calс - так переходить, т.е. истребить формат XLSM в принципе. Но сначала нужно попробовать на АРМ начальников, кто "останется с Excel" - открыть на их машинах ODS-файл и поработать в нем. Если им не зайдет ODS в Excel (глюки итп) - пиши пропало.

Быстро читать XLS/ODS можно по разному, вот в порядке убывания скорости (Win7):

Без пересчета ячеек
- Python + Pandas
- MS ADO (OLE DB)
- Python + opynpyxl
- LO Base, подключенное к XLS
- LO Base, подключенное к ODBC MS Excel Driver

С пересчетом ячеек
- MS Excel
- LO Calc

Если XLS 10 Мб, значит в нем 20k строк и 50 столбцов. Это уже объемы для SQL-баз данных. Либо можно хранить данные в (одном/нескольких) CSV или одном SQLite-файле, а Excel/Calc/BASE/Python+Pandas - просто их "отображать", выполнять запросы, делать отчеты и дополнять.

Для начала - сохраните ваш 120-страничный XLS в TXT, с разделителем табуляция, безо всяких допоопций типа кавычек, кодировку - win, не utf-8. И дальше в пустом Calc Лист - Вставить лист... - из файла - Связь. Данные можно "слегка" отформатировать. Попробуйте пооткрывать этот файл по сети LAN (не wifi), с разных машин, оцените скорость открытия. Если она устраивает - идем дальше.

Но если нужно, грубо говоря, вашу ежедневную выгрузку в XLS/TXT из 1С/итп максимально быстро обрабатывать (чистить, заменять) и потом делать запросы/группировки/суммировать - то для себя определил 3 самых быстрых способа, все на базе свободного ПО:

1) Python + Pandas в JupyterLab, в браузере. Пример - одна таблица бухпроводок 3,5 млн строк на 50 столбцов (20 лет, 100 млрд. выручки). Загружается сначала из CSV, а потом - из более быстрых колоночных хранилищ (PKL, Parquet, hd5 итд) - вся целиком в RAM (занимает там 5GB) на PC i5/8GB RAM/HDD - за 5 секунд. Любой сложный запрос с группировкой и суммированием ~15% строк - за 1 секунду. Всё что проще - мгновенно. Ничего быстрее нет и быть не может.  

2) LO Base Base/Calc/Writer + ODBC/JDBC SQlite - самый быстрая однофайловая база данных, сродни MSAccess. Та же таблица. Открывается мгновенно. Тот же сложный запрос - за 5 секунд. Вполне всё можно настроить самому, без прав админа. Если часто обращаться к файлу по сети (3-5 человек) - скорость запроса падает до 10-15 секунд, возникают таймауты на 5 сек. при записи кем-то. При чтении - таймаутов нет, но падает скорость до 10 сек.

3) LO Base/Calc/Writer + FireBird Server/MySQL/PosrtgreSQL. Та же таблица. Открывается мгновенно. Тот же сложный запрос - за 10 секунд. Очень хорошо масштабируется на несколько десятков и сотен аналитиков. Требует выделенного сервера и его админства.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mikekaganski

Обратите внимание, что Calc достаточно быстро работает с большими объёмами данных, если они однородные. "Однородные" значит, что в массиве данных нет пустых строк или строк с другим типом данных ("подзаголовков", скажем). Как только появляются такие вставки, Calc начинает тормозить.
С уважением,
Михаил Каганский

Fiona

Спасибо, этого более чем достаточно для размышления

sokol92

Здравствуйте, Fiona (к сожалению, не знаю имени)!

1. О времени открытия файла.
Файл ФСД (образца 2016 года) формата .xlsm объемом в 20 MB у меня открывается в Excel 2016 (32-) 20 сек. В Calc - 1 мин 25 сек. Так и должно быть, поскольку .xlsm - не родной формат для Calc.
Если тот же файл сохранить в Calc в формате .ods и заново открыть, то (судя по слайдеру) он открывается 15 сек. и еще 45 секунд уходит на подбор высоты строк, с чем, очевидно, можно побороться (сделать так, чтобы при открытии подбор высоты не происходил).

2. О копировании данных.
Скорости копирования диапазонов ячеек в Excel и Calc сопоставимы. Попробуйте, например, скопировать в Calc в другой документ вручную через буфер обмена заполненный диапазон в 5 000 строк и 50 столбцов. Время работы макроса (после детального изучения UNO-объектов  :)) будет не хуже.

Если речь идет о переносе данных из одной версии бланка ФСД в другую, то точно в LO можно сделать не медленнее, поскольку макросы бланка в Excel (сужу по 2016 году) далеко не оптимальны.

3. О Basic. Обсуждать замену языка на данном этапе явно преждевременно, поскольку текущие "тормоза" с Basic не связаны (а связаны с освоением достаточно сложной объектной модели LO).

На всякий случай, характеристики моего компьютера: Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz 2.81 GHz, ОП 16 ГБ, Windows 10 Pro.
Владимир.

eeigor

#13
Цитата: sokol92 от 10 июня 2020, 13:25можно использовать краткое руководство
Зд. есть одна ошибка на странице 2:
Access to ranges
Randomly (ex third sheet)
Ran = ThisComponent.Sheets.getCellRangeByPosition(2, 2, 1, 6, 13)  '(2, 1, 6, 13, 2)  - аргумент "Номер листа" идет последним
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Цитата: sokol92 от 20 августа 2020, 13:42сделать так, чтобы при открытии подбор высоты не происходил
sokol92, а как это сделать? (Ответ #12)
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community