Комментарии 32
Действия те же:
1. Создаете шаблон письма и вставляете в нужные места поля.
2. Создаете таблицу (базу) данных.
3. Запускаете слияние.
Только шагов меньше.
- Расположение книги менять нельзя (иначе придётся заново связывать документ)
- По сети не комфортно работать более чем одному юзеру (т. к. будет занята книга)
- В поле с датой не должно быть записей с текстом (иначе отображаться будет целое число)
- Периодически слетают связи (особенно, если применяете к полям фильтры)
- В поля слияния нельзя вставить неразрывный пробел и дефис — chr(160) и chr(30)
- Как итог: обновление множества документов превращается в боль
Вы просто не разбираетесь ни капли.
Я слиянием заполнял документы с таким количеством переменных, что вам и этой «программе» не снилось, при этом с использованием форматирования, автонумерации, перекрестных ссылок и проч.
А касаемо того, что вы тут понаписали:
1. Чтобы «перепривязать» документ достаточно его открыть и указать новое расположение парой кликов. И программе на Пайтон, по-вашему, все равно где документ лежит, да? Она сама весь комп и сетевое окружение обыскивает в поисках нужного файла? Смешно. Перепривязать документ в программе на Пайтон будет сложнее и совершенно невозможно для простого пользователя.
2. Что вы вообще несете? Excel для подписчиков Office 365 поддерживает совместное редактирование. В конце концов, можно в OneDrive сохранить книгу и редактировать всем офисом одновременно. А для чтения из файла при автозаполнении совместный доступ не нужен.
3. Вообще хрень написали. Все ячейки с данными после редактирования надо форматировать в «Текст». Тогда все всегда будет отображаться, как надо, и экспортироваться в Ворд без проблем.
4. Какие связи у вас слетают? Нейронов мозга? Структуру таблицы для заполнения менять нельзя, особенно строку заголовков (или придется менять переменные в вордовском шаблоне). Если вам надо применять фильтры или сделать более удобный интерфейс для ввода данных, выносите все на отдельный лист и там творите, что хотите, Ворд разрешает выбрать из какого листа импортировать данные.
5. Вообще непонятно что, куда и зачем вы собрались вставлять. Текстовое содержимое импортируется из ячейки Excel, если в нем есть дефис, то он перенесется. Если вы хотели в само поле слияния добавить текст в Ворде, то сначала Shift+F9 нажимаете и можете писать, что угодно, кроме двойных кавычек (их писать либо двойным ' либо спецсимволом, чтобы автоматом заменить все кавычки на спецсимвол «кавычки», копируете в буфер код спецсимвола с соответствующей вкладки Ворда, далее Ctrl+F, заменить — найти ", заменить на «из буфера обмена» в панеле расширенных настроек).
6. Только если вы — криворукий ламер, который не шарит в теме вообще, но считает своим долгом писать всякую фигню с видом знатока.
Какой диалог? Вы не пропустили мой коммент, что эта статья бессмысленная, потому что изобретает велосипед, который, в придачу, ещё и не ездит.
Для слияния надо было настроить Эксель и Ворд.
Для вашего метода надо настроить Эксель, Ворд и написать программу на Пайтоне.
А bopoh13 просто брызжет слюнями во все стороны.
Я немного знаю питон, т.к. являюсь ведущим разработчиком компании пищущей софт на питоне, а это тот еще изврат. Меня всегда удивляет и удивляла ненужность решений на питоне (яве, бейсике… любой другой язык) там, где это не нужно.
Итак. В Документе расставляются поля, в данном случае я это сделал через 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 без Питона. Как тебе такое Илон Маск?
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
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()
Сохранение в ворде в пдф через макрос делается в одну команду:
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)
Автор, большое спасибо за заметку. Я быстро нашел и сделал то, что мне нужно.
Не обращайте внимание на возмущение матерых офисников и VBA-шников: вы покушаетесь со своим "новомодным питоном" на старое доброе "святое".
Но хоть я сам в свое время по уши закапывался в объектную модель офисных приложений и написал кучу макросов на VBA в Word-е, Excel и Access, скорость создания прототипа на Питоне несравнима с тем же, на VBA. Я уж не говорю про кучу прокликиваний, которые надо сделать для слияния в ворде и экселе. Мне вот лень таблички заполнять, жать Ctrl+1, чтобы сформатировать ячейки в текст и т.д. Мне вот тоже проще кодом считать из json-а все детали под заполнение и потом в консоли нашлепать документов.
А еще тут на днях взялся писать что-то типа тестов (с автоисправлением ряда типовых ошибок) для контента из кучи docx файлов и понял, что надо мигрировать в этом проекте на odt: document.xml внутри docx — это просто какая-то жуткая каша из тегов на любой чих. Прочитать еще можно, все склеив и выкинув теги, а вот собрать обратно в ровно том же виде, ничего не испортив — не так просто. То ли дело понятный и стройный content.xml внутри odt, где предложения (и слова) не разрываются тегами по желанию левой пятки Word-а. — их можно и прочитать, и поправить, собрав обратно в точно такой же валидный документ, только без ошибок.
Здравствуйте! Подскажите, "шаблон.docx " обязательно должен располагаться локально? Нельзя ли разместить его в облаке, скажем в гитхабе?
Можно. Вот идеи, которые мне пришли на этот счет:
Если использовать веб-сервер: расположить файл в корне index.html и скачать файл через GET запрос по ссылке http://mydomain.local/шаблон.docx. Дальше в коде программы можно загрузить его не как файл, а как двоичные данные и работать с шаблоном дальше.
В Файловой шаре (NFS): скормить путь к файлу \\MYHOMEPC\\share\\шаблон.docx и работать с шаблоном дальше. Главное, чтобы у вашего компьютера был доступ к этой шаре.
Любые другие протоколы, позволяющие реализовать обмен файлами.
Автор, спасибо за статью!
действительно, возможно с помощью нативных механизмов реализовать поставленную задачу проще и элегантнее, вместе с тем, для тех у кого нет опыта в VBS и нет ни малейшего желания в это погружаться, но есть опыт в python, есть потребность в том чтобы быстро реализовать подобную задачу (как у меня), отличное руководство к действию
Заполняем документы в Microsoft Word при помощи Python. Часть 1