Pull to refresh

Comments 32

Все это, конечно, хорошо… Но чем вас не устраивает стандартный режим «Слияние», существующий в MS WORD?

Действия те же:
1. Создаете шаблон письма и вставляете в нужные места поля.
2. Создаете таблицу (базу) данных.
3. Запускаете слияние.

меня эта фича спасла в армии от монотонного заполнения документов.
Ох… Надеюсь это была совсем не секретная часть…
Перечислю ещё раз проблемы слияния:

  1. Расположение книги менять нельзя (иначе придётся заново связывать документ)
  2. По сети не комфортно работать более чем одному юзеру (т. к. будет занята книга)
  3. В поле с датой не должно быть записей с текстом (иначе отображаться будет целое число)
  4. Периодически слетают связи (особенно, если применяете к полям фильтры)
  5. В поля слияния нельзя вставить неразрывный пробел и дефис — chr(160) и chr(30)
  6. Как итог: обновление множества документов превращается в боль
Сделаю ремарку, что это не относится к программе в посте.
Описанные вами недостатки просто курам на смех.
Вы просто не разбираетесь ни капли.
Я слиянием заполнял документы с таким количеством переменных, что вам и этой «программе» не снилось, при этом с использованием форматирования, автонумерации, перекрестных ссылок и проч.
А касаемо того, что вы тут понаписали:
1. Чтобы «перепривязать» документ достаточно его открыть и указать новое расположение парой кликов. И программе на Пайтон, по-вашему, все равно где документ лежит, да? Она сама весь комп и сетевое окружение обыскивает в поисках нужного файла? Смешно. Перепривязать документ в программе на Пайтон будет сложнее и совершенно невозможно для простого пользователя.
2. Что вы вообще несете? Excel для подписчиков Office 365 поддерживает совместное редактирование. В конце концов, можно в OneDrive сохранить книгу и редактировать всем офисом одновременно. А для чтения из файла при автозаполнении совместный доступ не нужен.
3. Вообще хрень написали. Все ячейки с данными после редактирования надо форматировать в «Текст». Тогда все всегда будет отображаться, как надо, и экспортироваться в Ворд без проблем.
4. Какие связи у вас слетают? Нейронов мозга? Структуру таблицы для заполнения менять нельзя, особенно строку заголовков (или придется менять переменные в вордовском шаблоне). Если вам надо применять фильтры или сделать более удобный интерфейс для ввода данных, выносите все на отдельный лист и там творите, что хотите, Ворд разрешает выбрать из какого листа импортировать данные.
5. Вообще непонятно что, куда и зачем вы собрались вставлять. Текстовое содержимое импортируется из ячейки Excel, если в нем есть дефис, то он перенесется. Если вы хотели в само поле слияния добавить текст в Ворде, то сначала Shift+F9 нажимаете и можете писать, что угодно, кроме двойных кавычек (их писать либо двойным ' либо спецсимволом, чтобы автоматом заменить все кавычки на спецсимвол «кавычки», копируете в буфер код спецсимвола с соответствующей вкладки Ворда, далее Ctrl+F, заменить — найти ", заменить на «из буфера обмена» в панеле расширенных настроек).
6. Только если вы — криворукий ламер, который не шарит в теме вообще, но считает своим долгом писать всякую фигню с видом знатока.
Продолжай заниматься любимыми игрушками, сынок. В автоматизацию только не лезь, лады?
Предлагаю сразу пресечь неконструктивный диалог в этой плоскости.

Какой диалог? Вы не пропустили мой коммент, что эта статья бессмысленная, потому что изобретает велосипед, который, в придачу, ещё и не ездит.
Для слияния надо было настроить Эксель и Ворд.
Для вашего метода надо настроить Эксель, Ворд и написать программу на Пайтоне.
А bopoh13 просто брызжет слюнями во все стороны.

Насколько мне понятно, вы раскритиковали недостатки Слияния, приведенные bopoh13. После он «брызнул слюной». Я так понял, брызги в вашу сторону полетели?
Что касается программы на python, возможно Слияние в данном случае более эффективно. Каждый выберет свой вариант.
А почему не использовался макрос документа Word?
Потому что использовался python. Вы можете изложить свое решение.
Изложил. Настойчиво рекомендую почитать о VBA, он явно потерял популярность после перехода на .net, но его возможностей более, чем достаточно для описанных тобою запросов по автоматизации. Мое решение работает по сети, с одновременным редактированием, на любой машине где стоит ворд или опенворд (макросы в опенворде тоже работают).

Я немного знаю питон, т.к. являюсь ведущим разработчиком компании пищущей софт на питоне, а это тот еще изврат. Меня всегда удивляет и удивляла ненужность решений на питоне (яве, бейсике… любой другой язык) там, где это не нужно.
nikoloza, автор статьи походу вообще не разбирается в Word, а ты его спрашиваешь про экспорт. Пройти по полям и заполнить их содержимым из макроса VBA и сохранить в пдф это 2 строки, без питона и docx. А автор статьи скорее всего reportlab тебе установит и начнет PDF сущностями оперировать, поскольку разобраться в Word он не удосужился.

Итак. В Документе расставляются поля, в данном случае я это сделал через DocVarField.
После в макросе VBA это решается так:
Sub Macros()

With ActiveDocument.Variables
 .Item("EMITENT") = "Емитент"
 .Item("ADDRESS1") = "Адрес"
 .Item("DIRECTOR") = "Директор"
End With

ActiveDocument.Fields.Update
ActiveDocument.SaveAs2 FileName:="newname.pdf", FileFormat:=wdFormatPDF

End Sub


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

Две строки, только Word без Питона. Как тебе такое Илон Маск?
А если питон и шаблоны на linux машине?
в другой статье приводил пример, как написать макрос, работающий на любой машине где есть либро офис, опен оффис или word. в данном случае Питон для заполнения шаблонов не нужен.
Подскажите ссылку, пожалуйста, на статью.
Я думал это твоя статья: habr.com/ru/post/455808, обе статьи — эта и вторая появились в одно время.
Нет, я просто мимо проходил.
vse rabotaet i na linux. seychas potestil na ubuntu 16.04 (raspberry).
odno «no». nado doustanovit` moduli cherez pip:
apt-get install libxml2-dev libxslt-dev
pip install lxml
pip install docxtpl
pip install openpyxl

i v samoy programme ne ispol`zovat` russie simvoli, i.e.:
from docxtpl import DocxTemplate
import openpyxl

test=[]
wb = openpyxl.load_workbook('zaprosi.xlsx')
sheet=wb.get_active_sheet()

for row in sheet['B3':'F7']:
    for cellObj in row:
        if cellObj.value==None or cellObj.value==" ":
            continue
        #print(cellObj.value)
        test.append(cellObj.value)
print(test)

x=0
while x<len(test):
    doc = DocxTemplate("shablon.docx")
    context = { 'emitent' : test[x],'address1' : test[x+1],'uchastnik' : test[x+2],'address2' : test[x+3],'director' : test[x+4] }
    doc.render(context)
    doc.save(test[x]+'.docx')    
    x+=5
добавлена конвертация в pdf. не совсем красиво, но смысл понятен:

import sys
import os
import comtypes.client
from docxtpl import DocxTemplate

doc = DocxTemplate("шаблон.docx")
context = { 'emitent' : 'ООО Ромашка', 'address1' : 'г. Москва, ул. Долгоруковская, д. 0', 'участник': 'ООО Участник', 'адрес_участника': 'г. Москва, ул. Полевая, д. 0', 'director': 'И.И. Иванов'}
doc.render(context)
doc.save("final.docx")

wdFormatPDF = 17

in_file = os.path.abspath ("final.docx")
out_file = os.path.abspath("final.pdf")

word = comtypes.client.CreateObject('Word.Application')
doc = word.Documents.Open(in_file)
doc.SaveAs(out_file, FileFormat=wdFormatPDF)
doc.Close()
word.Quit()
Сomtypes работает только в виндовс это аналог com+ addins в виндовом оффисе.
Сохранение в ворде в пдф через макрос делается в одну команду:

ActiveDocument.ExportAsFixedFormat OutputFileName:= _
        filename, ExportFormat:=wdExportFormatPDF, _
        OpenAfterExport:=False, OptimizeFor:=wdExportOptimizeForPrint, Range:= _
        wdExportAllDocument, BitmapMissingFonts:= True


Если я правильно помню, то это сработает для любой ос.

zoldaten,
если ты делаешь
word = comtypes.client.CreateObject('Word.Application')

то DocxTemplate уже ненужен, ты же фактически ворд запустил в питоне. работай тогда уже с настоящими командами ворда, как я писал выше:

wdFormatPDF = 17
in_file = os.path.abspath ("final.docx")
out_file = os.path.abspath("final.pdf")
word = comtypes.client.CreateObject('Word.Application')
doc = word.Documents.Open(in_file)
doc.Variables.Item("EMITENT") = "Емитент"
doc.Variables.Item("ADDRESS1") = "Адрес"
doc.Variables.Item("DIRECTOR") = "Директор"
doc.Fields.Update
doc.SaveAs(out_file, FileFormat=wdFormatPDF)


Сomtypes работает только в виндовс

Это верное замечание.
то DocxTemplate уже ненужен, ты же фактически ворд запустил в питоне.

Да, ваш вариант красивее на python, ближе к PEPу. Уверен, что он также работает.

Автор, большое спасибо за заметку. Я быстро нашел и сделал то, что мне нужно.


Не обращайте внимание на возмущение матерых офисников и VBA-шников: вы покушаетесь со своим "новомодным питоном" на старое доброе "святое".


Но хоть я сам в свое время по уши закапывался в объектную модель офисных приложений и написал кучу макросов на VBA в Word-е, Excel и Access, скорость создания прототипа на Питоне несравнима с тем же, на VBA. Я уж не говорю про кучу прокликиваний, которые надо сделать для слияния в ворде и экселе. Мне вот лень таблички заполнять, жать Ctrl+1, чтобы сформатировать ячейки в текст и т.д. Мне вот тоже проще кодом считать из json-а все детали под заполнение и потом в консоли нашлепать документов.

Тоже хочу высказать благодарность за статью. Поклонники творчества MS удивляют. Они забывают, что вообще-то docx обрабатывается не только с помощью MS Word, но и кучей других, в т.ч. бесплатных пакетов, в первую очередь — LibreOffice, который по некоторым параметрам удобнее. Если кому-то хочется платить за довольно глючное решение ежегодно, — это его дело. А решение с помощью Python отличается простотой и изяществом.

А еще тут на днях взялся писать что-то типа тестов (с автоисправлением ряда типовых ошибок) для контента из кучи docx файлов и понял, что надо мигрировать в этом проекте на odt: document.xml внутри docx — это просто какая-то жуткая каша из тегов на любой чих. Прочитать еще можно, все склеив и выкинув теги, а вот собрать обратно в ровно том же виде, ничего не испортив — не так просто. То ли дело понятный и стройный content.xml внутри odt, где предложения (и слова) не разрываются тегами по желанию левой пятки Word-а. — их можно и прочитать, и поправить, собрав обратно в точно такой же валидный документ, только без ошибок.

Здравствуйте! Подскажите, "шаблон.docx " обязательно должен располагаться локально? Нельзя ли разместить его в облаке, скажем в гитхабе?

Можно. Вот идеи, которые мне пришли на этот счет:

  • Если использовать веб-сервер: расположить файл в корне index.html и скачать файл через GET запрос по ссылке http://mydomain.local/шаблон.docx. Дальше в коде программы можно загрузить его не как файл, а как двоичные данные и работать с шаблоном дальше.

  • В Файловой шаре (NFS): скормить путь к файлу \\MYHOMEPC\\share\\шаблон.docx и работать с шаблоном дальше. Главное, чтобы у вашего компьютера был доступ к этой шаре.

  • Любые другие протоколы, позволяющие реализовать обмен файлами.

спасибо, есть ещё способ при помощи библиотеки request в python, с помощью её и реализовал

Автор, спасибо за статью!

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

Sign up to leave a comment.

Articles