0

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

在主程序中,我完成了排序功能。我还能够使用 document.merge() 并将信息插入到一个文档中。但是,要对一个文档中的多个页面执行此操作,我需要使用 MailMerge() 并将字典作为参数传递给它。我尝试使用带有相应行索引的 for 循环作为键的值,但由于该函数需要多个字典,因此它不起作用。然后我想出了使用 for 循环将每个成员及其信息插入到一个合并中,将其写入输出文件,打印该输出文件,并为每个成员执行此操作,直到完成。我试过使用 win32api.ShellExecute(0, "print", document, '/d:"%s"' % win32print.GetDefaultPrinter(), ".", 0) 但得到上述错误。

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。”

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

4

1 回答 1

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

于 2019-05-09T18:34:06.633 回答