我需要根据数据库中的信息生成.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()
运行的代码可以从我上面提供的链接中找到。
如何实现我的系统,以便在点击我的链接时,应该根据数据库中的数据创建或更新文档,然后下载到用户计算机?保存不是强制性的该文件到数据库,但我也有兴趣听听如何做到这一点。
答案 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
。