Django创建.odt或.docx文件进行下载

时间:2014-03-12 15:38:14

标签: python django docx odt

我需要根据数据库中的信息生成.odt或.docx文件。假设我有一个模型:

class Contact(models.Model):
    first_name = models.CharField()
    last_name = models.CharField()
    email = models.EmailField()

我希望用户能够生成包含该信息以及其他一些文本的office文档。我查看了使用python-docx的this example,它让我知道如何生成该文档。但我无法弄清楚这个文件的保存位置,甚至是否已创建。在我的模板中,我有一个链接:

<a href="{{ contact.generate_docx }}">generate .docx document</a>

其中generate_docx()运行的代码可以从我上面提供的链接中找到。

如何实现我的系统,以便在点击我的链接时,应该根据数据库中的数据创建或更新文档,然后下载到用户计算机?保存不是强制性的该文件到数据库,但我也有兴趣听听如何做到这一点。

3 个答案:

答案 0 :(得分:3)

您可以在docx文件中使用django模板语言,该文件实际上是xml文件的zip存档,然后通过模板引擎运行相应的xml文件。我在这里得到了这个想法:http://reinout.vanrees.org/weblog/2012/07/04/document-automation.html

说起来容易做起来难。最终,我让它在python3中运行如下:

from zipfile import ZipFile
from io import BytesIO

from django.template import Context, Template

def render_to_docx(docx, context):
    tmp = BytesIO()
    with ZipFile(tmp, 'w') as document_zip, ZipFile(docx) as template_zip:
        template_archive = {name: template_zip.read(name) for name in template_zip.namelist()}
        template_xml = template_archive.pop('word/document.xml')
        for n, f in template_archive.items():
            document_zip.writestr(n, f)
        t = Template(template_xml)
        document_zip.writestr('word/document.xml', t.render(Context(context)))        
    return tmp

在视图中:

response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document')
response['Content-Disposition'] = 'attachment; filename=document.docx'
zipfile = render_to_docx('template.docx'), context_dictionary)
response.write(zipfile.getvalue())
return response

答案 1 :(得分:2)

您可以使用Py2docx(https://github.com/rafaels88/py2docx)构建.docx文件。将代码放在视图上,然后就可以执行此操作:

# Here goes the Py2docx code
# After save the .docx file, do this:

file_docx = open("path/file.docx", 'r')
response = HttpResponse(mimetype='text/html')
response['Content-Disposition'] = 'attachment; filename=file_name.docx'
response['Content-Encoding'] = 'UTF-8'
response['Content-type'] = 'text/html; charset=UTF-8'
response.write(file_docx.read())
file_docx.close()
return response

然后,在HTML上为您的视图创建一个链接。

答案 2 :(得分:0)

如果pdf也是可接受的格式,您可以考虑使用django-wkhtmltopdf。它允许您创建一个普通页面,并使用二进制形式的webkit将其转换为pdf