Pull to refresh

Comments 55

Спасибо за статью, сам использую подобное. Для поклонников СПО все то же самое можно получить без макросов, из коробки, в OpenOffice и LibreOffice, нажав Ctrl+Shift+F4.

Но перед тем как нажать - нужно создать Базу данных подключить ее к Таблице Calc/Excel или Writer/Word. Пары минут хватит. Но настоящие айтишники никогда сами этим не пользуются, ведь тут нет никакой сложности.

А в MS Office есть такое?

Да, есть, я писал статью на Хабре несколько лет назад, есть работающее ПО, которым делюсь бесплатно
https://habr.com/ru/articles/359218/

Именно потому что это было в MS оно и появилось в Open/Libre

Если уж автоматизировать - то до конца.)) Навскидку есть две Python-библиотеки по генерации случайных данных: Faker (сам пользовался) и randominfo (первое, что выдал яндекс).

А автоматизация заявлений на отпуск теперь решается путём составления графика отпусков на год. :) По крайней мере так что у меня, что у жены.

Спасибо тебе, добрый человек, прямо то что нужно для работы! Вопрос, а с Либрой как работать? есть такого же рода код?

Я делал с Либровским аналогом Экселя, готовились трудовые договора, всякие формы автоматически заполнялись. Там же можно задать сразу и сколько экземпляров распечатывать. Хорошо получилось

Давно не работала с ним, там же есть возможность экспортировать файлы в формат docx и xlsx?

При помощи VBA без проблем можно формировать docx и xlsx
Вот моя программа, а тут нудная видеоинструкция к ней, хотя начать лучше с текстовой.

Меня сейчас интересует переписать это все дело под python под Линукс, желательно под Либровские форматы, что бы уйти совсем от MS Office

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

Но задачка у вас интересная, конечно :)

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

Прочтите первый комментарий про OpenOffice|LibreOffice. Там не код, а штатный, хорошо продуманный механизм как массовой Рассылки (по таблице или SQL-запросу, который легко изменить тут же), так и выборочного заполнения, т.е. Слияния - кнопкой Данные в Поля. Работает наглядно, прямо в приложении OpenOffice|LibreOffice.

Киллер-фича механизма - скрытие слогов, слов, абзацев и даже разделов (в т.ч. в виде внешних файлов) при Слиянии ч/з Условный/Скрытый текст , простые арифм. Расчеты формулами, ну и конечно же, безупречное авто-форматирование результата, т.к. используются Стили (слова переносятся по слогам, нет висячих строк, номер со 2-й стр, подписи в колонтитулах везде, кроме тех мест где они уже есть итд). Это называется авто-переверстка, шаблон (ODT-фaйл) в моем случае содержит шаблоны сразу 18-ти видов договоров/сделок и по сути является конструктором, но от пользователя требует минимум кликов. Табличные части договоров (расчет Цены, Приложения, Спецификации) - так же заполняются этим же механизмом, данными из бухучета (1С->TXT->OO/LO).

И Python, если сильно хочется, можно задействовать. Например, для бесплатного получения 20 реквизитов поставщика для договора по одному введенному ИНН, со склонением ФИО подписантов, переводом сумм и дат в слова прописью, с авто-подстановкой данных объекта недвижимости из реестра ЕГРП/ЕРН и так далее. Python входит в OpenOffice|LibreOffice и можно не беспокоить злых одминов, сделать все с ограниченной учеткой как в Windows, так и в Linux, и на любой разрядности/архитектуре CPU.

т.е. Слияния - кнопкой Данные в Поля. Работает наглядно, прямо в приложении OpenOffice|LibreOffice.

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

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

Табличные части договоров (расчет Цены, Приложения, Спецификации) - так же заполняются этим же механизмом, данными из бухучета (1С->TXT->OO/LO).

В своем решении я не предполагаю интеграцию с 1С и прочими сервисами. При этом параллельно нужно будет дополнительно реализовать вывод в xml именно по шаблонам Минстроя.


Собственно Слияние мне не подходит, я буду именно писать код на автоматическое заполнение по маркерам в виде текстовых меток/закладок/чего-то там еще, лишь бы работало.

Все обстоит гораздо лучше в OpenOffice|LibreOffice! Для слияния вида Таблица (отовсюду) ->Таблица Calc (а также Рисунок/Презентация Draw/Impress) - просто жмите Ctrl+Shift+F4 и перетаскиваете таблицу/запрос/view на Лист XLSX/ODS. Обновление таких "таблиц" настраивается - ручное/авто/макрос. Скорее всего Авто на заработает, поэтому Макрос. Примеры кода на https://forumooo.ru/

Версионность данных обеспечивается на уровне самих данных (в БД и том к чему она подключена), либо просто храните все результирующие доки. В самом слиянии таинства нет, это просто замена. Хороший выходной формат - PDF, но есть удивительная возможность сделать Гибридный PDF для пост-правки и до-слияния уже сделанного. Microsoft Office так не может и не сможет никогда.

Из коробки OpenOffice|LibreOffice для Windows всегда содержит довольно свежий, для всех архитектур, но кастрированный Python (без pip, sqlite3, lzma, ctypes и еще нек-х либ). Это лечится, см. Форум https://forumooo.ru/ моя тема про Pandas. В Линукс обычно два Питона (OpenOffice|LibreOffice использует, кажется, системный). Для работы py-макросов нужно доустановить пакет, смотрите в Synaptic по слову libreoffice.

Для тиражирования и минимума движений есть только одно правильное решение - Portable-версии (есть и 32 и 64 бит). Сжатый архив с Portable - это 150 МБ, для современных интернетов просто мелочь. Для Linux есть flat- и др. вар-ты.

Без 1С-данных не обойтись никому, это повсеместная учетная система. Взаимодействие проще организовать ч/з TXT-файлы, их 1С рендерит безупречно с правильным разделителем \t Но придется впороться с nbsp-триадами и кодировкой. Не всякий лось рельсу перекусит, но питон ее просто обползет.

Файлы XML/JSON на выходе придется делать python-либами, их так много что проблема выбора - самая большая проблема.

Заполнение по маркерам/закладкам ничем не отличается от Полей БД, перетащенных из удобного Диспетчера данных (Ctrl+Shift+F4). Но вы лишитесь Автопереверстки (скрытый/условный текст, переменные документа, формулы для расчета в DOCX/ODT/PDF), и будете изобретать свой велосипед. Так делает большинство, поэтому призываю изучить штатный функционал. Он очень старый (конец 90-х) и с закидонами, но рабочий.

Есть небольшая проблема с экселем. Мы можем прочитать только текст. Да, в данном случае нам и нужен только текст. Но что, если понадобятся какие-нибудь формулы или ещё1 что посложнее? Вот тут и начинается серьёзная работа.

Для Python есть 500k+ либ, умеющих все. openpyxl читает формулы, предвычисленные значения, комментарии ячеек, условные форматы, стили, гиперссылки, и все это пишет обратно. Это же касается и формата ODS, быстро распространяющегося в коммерсах и службах.

Единственная сложность, на которую потратил много времени - экспорт графиков из Excel в Word.

Единственную библиотеку нашел - xlwings. И то она "запускает" реальный Excel, чтобы chart.to_png сделать. Хотелось бы еще вариантов :)

а не проще через пандас работать с данными и делать эти графики через matplotlib/seaborn? как минимум через сохранение в пнг можно и через matplotlib сделать, хотя бы без запуска Excel

Такой вариант рабочий, разумеется. И некоторые графики даже красивее получаются. Но:

  • надо много готового переделывать

  • для добавления графика в matplotlib будут мучить меня. А в Excel - сами нарисуют. И лишь пропишут его название в шаблоне Word.

Думаю, что в первую очередь нужно внедрять электронный документооборот, вместо генерации отпуска в word документ. Последующей печати, потом подписи, потом сканирования. Отправки j pg конкретному лицу по почте или прикрепление в систему, потом ожидание и т. д Ну вы поняли.

Внедрение ЭДО/EDM несопоставимо дороже и сложнее "лоскутной автоматизации снизу" (EDM это 1,5 года и столько же млн. руб.). И даже если каким-то чудом ЭДО включит в себя заполнение всех 20 видов существующих заявлений (не верю) - оно будет намного более сложным для пользователя и не искоренит бумажные образцы и писанину (верю и охотно, проходил внедрение не единожды, по обе стороны баррикады, в качестве руководителя проекта и кодера).

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

Рекомендую придумывать адреса электропочт в пространстве имён RFC 2606, это сильно поможет избежать неловких ситуаций, когда в лабораторную работу будет входить ещё и рассылка почты

Ага. Судя по тому, как сложно сейчас придумать незанятый адрес почты, половина из примера может оказаться существующими адресами.

Так-то вы Mail Merge переизобрели (ссылка). А там и формулы работают, и можно PowerQuery как источник данных использовать.

Интересно, по емайлам уже много спама накидано?

Вы бы замазывали такое на скриншотах. По разглашению перс. данных по головке не погладят.

"Не погладить" в данном случае может только сам субъект ПД, а его нет в природе.

Мне казалось, это должен делать Роскомнадзор

он занят

Пользовался именно таким способом однажды, но немного для других целей, а именно - для заполнения данных в пакете документов. Например, есть какая-то работа, у неё титульник, план, сама работа, какой-то вывод и они все имеют одинаковые поля, типа темы, периодов дат и т.д. И очень легко в случае изменения такого поля, упустить какой-то один файл.
А с этим способом можно исправить данные в эксельке и сгенерить весь пакет заново, единственная проблема, это если такие документы включают в себя доработки от руки, которые невозможно или достаточно сложно мигрировать после генерации.

Миллениалы изобрели "Слияние документов" в Ворде

Зумеры, вы ведь про них?. Автор именно из них. А миллениалы итак знают о стандартном функционале MS Office)

Когда родился этот мем зумеры еще под стол пешком ходили. Не переделывать же теперь!)

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

А там есть функция, чтобы выдернуть значение не конкретной ячейки, а сразу весь столбец или лист в массив?

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

А как к примеру сделать, если мне в ворде надо сформировать таблицу, но количество строк в ней от раза к разу различное?

В docxtpl если передаются табличные данные в шаблоне можно писать циклы:

Для Powerpoint так не умею, только ячейки :(

Только пару дней назад с намучился именно с таблицами. Источников как создавать шаблоны именно для таблиц на русском практически нет.

Очень помог github (видимо разработчика библиотеки). Содержит кучу шаблонов Word и соответствующего кода на python.

Там даже есть вариант шаблона таблицы с динамическим количеством столбцов.

На самом деле docxtpl содержит 2 пакета - python-docx для чтения/записи файлов word и пакет шаблонизатор jinja2, который используется в django для заполнения шаблонов html страниц.

Интересное решение, спасибо, может где пригодится... Но лично я по-старинке базы данных в СУБД Access веду....

Слишком просто, надо было на ассемблере.

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

Классно, спасибо что поделились! Вообще появляется желание создать какой-то отдельных канал, чисто чтобы обсуждать и делиться такими решениями в автоматизации )

появляется желание создать какой-то отдельных канал

Я бы на такой с радостью подписался)

подскажите, как поменять формат даты с "год-месяц-день" на "день.месяц.год"? И желательно, чтобы между числами точки были в конечном документе

для этого есть специальный метод .strftime("%d.%m.%Y")

Если нужно заморочиться чуть сильнее, то подобное можно сделать без ODF или MS Office шаблонов сразу в PDF. Я как-то по работе делал генератор отчётов через WeasyPrint (по ссылке если прокрутить есть классные примеры). Пишется как обычная HTML страница, а параметры типа формата (A4, Letter и т.п.), отступов, шрифтов, колонтитулов и прочего задаются через CSS.

Да, это сложнее, но сильно гибче, поэтому и написал. Вдруг кому понадобится.

Ещё чуть-чуть и вспомнят что есть LaTeX, и тебе шаблоны и тебе вёрстка качественная и тебе PDF из коробки.

Только чтобы сделать "как в Ворде" - надо свой стилевой пакет писать.

вроде бы в Ворде есть переменные, которые можно заранее заявить а потом заполнять через скрипт, так что всё ещё проще, можно без двойных скобок сделать

Хорошая статья в целом, но здесь как из пушки по воробьям. Ведь таблица стандартная столбцы это название полей и строки под ними. Такая задача решается с помощью обычного слияния шаблона docx средствами самого ms word. Я бы не заморачивался с python если у вас таблица не виде матрицы, где используются например формулы гпр или впр, такие таблицы сложные и проще использовать python. А так обычное слияние данных.

Режет глаз {Имя Фамилия} в именительном падеже в строке «От кого». По правилам русского языка все-таки должно быть {Фамилия Имя} в родительном падеже.

Подскажите, а как быть, если нужно в шаблон docx для одной ссылки вставить несколько ячеек из xlsx при этом просто добавляя текст, а не затирая предыдущие ячейки?

Пока не понимаю, как с этим разобраться.

Подскажите, в шаблоне есть параметр {{телефон}} - необязательный (может отсутствовать в таблице excel). В случае, если он отсутствует, то нужно параметр оставить пустым. Как такое реализовать?

Sign up to leave a comment.

Articles