为什么MailMerge对象无法转换为Unicode?有没有一种可靠的方法可以在Python中打印模板化文档?

时间:2019-05-09 13:49:51

标签: python winapi mailmerge docx-mailmerge

我正在尝试将一个文本格式类似于电子表格的文本格式读入列表,然后将所述列中的参数用作合并字段,并使用Python将其插入模板字文档中。但是,我收到一个TypeError说,“尝试使用win32api.ShellExecute()打印文档时,'MailMerge'类型的对象无法转换为Unicode。我们通常手动执行此过程:将主文本文件分为其他三个如果成员的到期日是15天,25天或30天,请使用邮件合并以单词形式选择此文本文件作为收件人列表。除主程序外,我在示例中还编写了以下代码:在组装之前先让机械师工作。

在主程序中,我完成了排序功能。我还能够使用document.merge()并将信息插入一个文档中。但是,要在一个文档中的多个页面上执行此操作,我需要使用MailMerge()并将其词典作为参数传递。我尝试将for循环与相应的行索引一起用作键的值,但是由于该功能需要多个字典,因此无法正常工作。然后,我想到了使用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。”

(对不起,如果我太罗word了,我以前从未在这里发布过。)

1 个答案:

答案 0 :(得分:0)

我最终在mailmerge.py的源代码中发现了另一个名为merge_template的函数,该函数应该替换mail_merge,但是在我使用pip安装的版本中不存在此函数。在Discord上咨询了一些python编码器之后,事实证明,使用这些行来列出字典会更好,

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,然后一切都解决了。

相关问题