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
Думаю, что в первую очередь нужно внедрять электронный документооборот, вместо генерации отпуска в word документ. Последующей печати, потом подписи, потом сканирования. Отправки j pg конкретному лицу по почте или прикрепление в систему, потом ожидание и т. д Ну вы поняли.
Внедрение ЭДО/EDM несопоставимо дороже и сложнее "лоскутной автоматизации снизу" (EDM это 1,5 года и столько же млн. руб.). И даже если каким-то чудом ЭДО включит в себя заполнение всех 20 видов существующих заявлений (не верю) - оно будет намного более сложным для пользователя и не искоренит бумажные образцы и писанину (верю и охотно, проходил внедрение не единожды, по обе стороны баррикады, в качестве руководителя проекта и кодера).
Все данные были придуманы из головы, совпадения с реальными лицами абсолютно случайны. Адреса электронных почт я также придумала
Рекомендую придумывать адреса электропочт в пространстве имён RFC 2606, это сильно поможет избежать неловких ситуаций, когда в лабораторную работу будет входить ещё и рассылка почты
Интересно, по емайлам уже много спама накидано?
Вы бы замазывали такое на скриншотах. По разглашению перс. данных по головке не погладят.
Пользовался именно таким способом однажды, но немного для других целей, а именно - для заполнения данных в пакете документов. Например, есть какая-то работа, у неё титульник, план, сама работа, какой-то вывод и они все имеют одинаковые поля, типа темы, периодов дат и т.д. И очень легко в случае изменения такого поля, упустить какой-то один файл.
А с этим способом можно исправить данные в эксельке и сгенерить весь пакет заново, единственная проблема, это если такие документы включают в себя доработки от руки, которые невозможно или достаточно сложно мигрировать после генерации.
Миллениалы изобрели "Слияние документов" в Ворде
А потом всем сотрудникам компании дружно возвращаются заявления с пометкой: "от кого" должно быть в родительном падеже. Пожалуйста исправьте.
А там есть функция, чтобы выдернуть значение не конкретной ячейки, а сразу весь столбец или лист в массив?
а что если необходимо взять данные и создать по шаблону не много файлов, а один в котором этот шаблон будет повторяться много раз? например сделать перечень фио - должность и ещё - слить вордовские файлы в один чтобы не было разбивок на странички по числу файлов (сплошной текст, дописать данные в файл)
А как к примеру сделать, если мне в ворде надо сформировать таблицу, но количество строк в ней от раза к разу различное?
есть модуль python-docx для создания таблиц в вордовских документах, вот тут хорошая статья с примерами https://docs-python.ru/packages/modul-python-docx-python/rabota-tablitsej/
В docxtpl если передаются табличные данные в шаблоне можно писать циклы:
Для Powerpoint так не умею, только ячейки :(
Только пару дней назад с намучился именно с таблицами. Источников как создавать шаблоны именно для таблиц на русском практически нет.
Очень помог github (видимо разработчика библиотеки). Содержит кучу шаблонов Word и соответствующего кода на python.
Там даже есть вариант шаблона таблицы с динамическим количеством столбцов.
На самом деле docxtpl содержит 2 пакета - python-docx для чтения/записи файлов word и пакет шаблонизатор jinja2, который используется в django для заполнения шаблонов html страниц.
Интересное решение, спасибо, может где пригодится... Но лично я по-старинке базы данных в СУБД Access веду....
Слишком просто, надо было на ассемблере.
Буквально недавно решал подобную задачу средствами powershella, только в качестве источника данных брал текстовый файл с разделителями и парсил его регуляркой. Может кому и пригодится.
подскажите, как поменять формат даты с "год-месяц-день" на "день.месяц.год"? И желательно, чтобы между числами точки были в конечном документе
Если нужно заморочиться чуть сильнее, то подобное можно сделать без ODF или MS Office шаблонов сразу в PDF. Я как-то по работе делал генератор отчётов через WeasyPrint (по ссылке если прокрутить есть классные примеры). Пишется как обычная HTML страница, а параметры типа формата (A4, Letter и т.п.), отступов, шрифтов, колонтитулов и прочего задаются через CSS.
Да, это сложнее, но сильно гибче, поэтому и написал. Вдруг кому понадобится.
Ещё чуть-чуть и вспомнят что есть LaTeX, и тебе шаблоны и тебе вёрстка качественная и тебе PDF из коробки.
вроде бы в Ворде есть переменные, которые можно заранее заявить а потом заполнять через скрипт, так что всё ещё проще, можно без двойных скобок сделать
Хорошая статья в целом, но здесь как из пушки по воробьям. Ведь таблица стандартная столбцы это название полей и строки под ними. Такая задача решается с помощью обычного слияния шаблона docx средствами самого ms word. Я бы не заморачивался с python если у вас таблица не виде матрицы, где используются например формулы гпр или впр, такие таблицы сложные и проще использовать python. А так обычное слияние данных.
Режет глаз {Имя Фамилия} в именительном падеже в строке «От кого». По правилам русского языка все-таки должно быть {Фамилия Имя} в родительном падеже.
Подскажите, а как быть, если нужно в шаблон docx для одной ссылки вставить несколько ячеек из xlsx при этом просто добавляя текст, а не затирая предыдущие ячейки?
Пока не понимаю, как с этим разобраться.
Подскажите, в шаблоне есть параметр {{телефон}} - необязательный (может отсутствовать в таблице excel). В случае, если он отсутствует, то нужно параметр оставить пустым. Как такое реализовать?
Автоматизируем создание отчетов в Word с данными из Excel на Python