Почему объекты MailMerge не могут быть преобразованы в Unicode? Есть ли надежный способ печати шаблонных документов в Python? - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь прочитать текстовый файл, который отформатирован как электронная таблица, в список, а затем использовать параметры из указанных столбцов в качестве полей слияния и вставить их в документ шаблона слова с помощью Python.Однако я получаю TypeError, говорящую: «Объекты типа« MailMerge »не могут быть преобразованы в Unicode при попытке печати документов с помощью win32api.ShellExecute (). Обычно мы делаем этот процесс вручную: сортируем основной текстовый файл на три других на основеЕсли у участников 15 дней, 25 дней или 30 дней с просрочкой платежа, используйте слияние слов в слове, чтобы выбрать этот текстовый файл в качестве списка получателей. Я написал этот код в примере отдельно от основной программы, чтобыПолучите механику, работающую, прежде чем собрать ее вместе.

В основной программе у меня завершена функция сортировки. Я также смог использовать document.merge () и вставить информацию в один документ. Однако сделать это для несколькихстраниц в одном документе мне нужно использовать MailMerge () и передать его словари в качестве аргументов. Я пытался использовать цикл for с соответствующими индексами строк в качестве значений для ключей, но так как эта функция требует более одного словаря, он не работал.затем придумал использовать цикл для вставки каждого члена иих информация в одно слияние, записать его в выходной файл, распечатать этот выходной файл, и делать это для каждого члена, пока не будет сделано.Я попытался использовать win32api.ShellExecute (0, "print", document, '/ d: "% s" "% win32print.GetDefaultPrinter (),". ", 0), но получил ошибку, указанную выше.Единственный другой метод печати, с которым я столкнулся, - это преобразование его в pdf, но я также не хочу терять текст и форматирование документа.

from __future__ import print_function
from mailmerge import MailMerge
import os
import win32api
import win32print

# Formatting the list so that the indices match the columns in the text 
  doc.

text_file = open('J:\cpletters15.txt')
courtesy_pay_list = text_file.readlines()
text_file.close()
delimeted_text = [line.split('\t') for line in courtest_pay_list]

# Opening the template

template = 'J:\courtesy_pay_15_test.docx'
document = MailMerge(template)

# This should merge and then print each member on their own letter.

for row in delimeted_text[1:]:

    document.merge(
            SHARE_NBR = row[2],
            MEMBER_NBR = row[1], 
            CITY = row[11], 
            ADDRESS1 = row[9], 
            ADDRESS2 = row[10], 
            LAST_NAME = row[8], 
            STATE = row[12], 
            FIRST_NAME = row[7],
            ZIP = row[13],
            LETTER_DATE = row[4],
            BALANCE = row[6]
)
    document.write('J:\output.docx')
    win32api.ShellExecute(
        0, "print", document, '/d:"%s"' % win32print.GetDefaultPrinter(),
        ".", 0) 

Я ожидаю, что этот код должен печатать каждый документ после объединения полей, но вместо этого я получаю ошибку "Объекты типа 'MailMerge' не могут быть преобразованы в Unicode."

(Извините, если это слишком многословно, я никогда не публиковал здесь раньше).

1 Ответ

0 голосов
/ 09 мая 2019

В конечном итоге я обнаружил в исходном коде mailmerge.py , что есть еще одна функция с именем merge_template, которая должна заменить mail_merge, но ее не было в версии, которую я установил с помощью pip.Посоветовавшись с некоторыми программистами Python по Discord, оказалось, что лучше составить список словарей, используя строки

values = delimeted_text[1:]
header = delimeted_text[0]
my_Dict = ([{head:val for head, val in zip(header, val)} for val in values])

, которые затем были приняты merge_template и успешно напечатаны так:

document.merge_templates(big_Dict, 'nextPage_section')
document.write('J:\output.docx')
os.startfile('J:\\output.docx', 'print')

В итоге я просто переписал mailmerge.py с исходным кодом по ссылке, и все получилось.

...