【问题标题】:How to: create .doc files using templates with django/python如何:使用带有 django/python 的模板创建 .doc 文件
【发布时间】:2010-08-19 12:28:06
【问题描述】:

我正在编写一个 django 应用程序,但有些事情我不知道该怎么做。假设您有一个包含用户的数据库和几个您可能想要发送给这些用户的 .doc 文件(邮寄信件,而不是电子方式)。我想知道是否有一种方法可以使用我的用户数据库从模板中自动创建这些字母来填充一些标记? (即姓名、地址等)

我听说过“pod”python 库,但我从未使用过它。文档似乎说要使用 openoffice 模板,但我的是 MS Word 格式。由于它们经常由只使用 MS Office 的人更新,我被困住了。

任何帮助将不胜感激。

J.

【问题讨论】:

  • 理论上是可能的,尽管我从未见过这样做。要使其工作,您将需要一个 Python 库(最好)或访问一个外部 API,该 API 公开了操作 Word 模板的方法。您很可能会调用 API 之前使用 Django 的模板工具来填写 Word 模板。

标签: python django templates ms-word


【解决方案1】:

有许多不同的方法可以做到这一点,具体取决于上下文。以下是一些想法,按难度降序排列。

  • Microsoft Word 包括一个用于此的工具,称为邮件合并。通过安装pywin32,您可以使用 COM 挂钩从 Python 控制 Word。这与通过打开 Microsoft Word 调用 Mail Merge 完全相同。这必须在安装了 Office 的 Windows 计算机上完成,可能不是您的服务器。请参阅http://bytes.com/topic/python/answers/165364-ms-word-mail-merge-automation,或谷歌“python 邮件合并”。

  • OpenOffice 使用 Python 作为宏语言(我相信)并使用 Python-UNO 公开 API。您可以让 OpenOffice 将文件转换成它的格式,然后使用pod 进行邮件合并。

  • 您可以告诉您的用户以更好的格式为您提供数据,例如 OpenOffice 模板。

  • 您可以 Django 导出用户的数据,将其提供给编写模板的人员,并告诉他们自己进行邮件合并。

无论你选择什么,这都不容易。

【讨论】:

  • 因为它将是邮政信函,而我在模板中唯一需要替换的就是姓名和地址,我想我会要求提供 .pdf 格式的模板,然后覆盖那些pdf 的名称和地址在正确的位置。你认为这会更容易实现吗?我也从未使用过 ReportLab。
  • @jlibioul:不,那会更难; PDF修改非常困难。我仍然认为导出用户数据并将其提供给编写模板的人是最简单的,然后他们可以执行邮件合并或他们想做的任何事情。
【解决方案2】:

使用 mailmerge 很简单,您可以从 word doc 修改模板。

http://pbpython.com/python-word-template.html

您也可以将邮件合并与视图合并。这是一个示例,其中 my_template1 是我的 word 文档模板,其中有名为 name 和 title 的字段。

def TestDocument2(request):
    template = os.path.join(os.path.dirname(__file__), 
    'templates/my_template1.docx')  

    document = MailMerge(template)
    document.merge(name='testcoy',
               title = 'My title',
               )
    f = io.BytesIO()
    document.write(f)
    length = f.tell()
    f.seek(0)
    response = HttpResponse(
        f.getvalue(),
        content_type='application/vnd.openxmlformats-
        officedocument.wordprocessingml.document'
         )
    response['Content-Disposition'] = 'attachment; filename=example.docx'
    response['Content-Length'] = length
    return response

【讨论】:

    猜你喜欢
    • 2022-09-29
    • 1970-01-01
    • 2018-06-19
    • 2014-05-22
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2012-02-01
    相关资源
    最近更新 更多