gpt4 book ai didi

python - 如何使用 python-docx 从模板流式传输文件

转载 作者:行者123 更新时间:2023-12-04 13:59:28 33 4
gpt4 key购买 nike

好的,现在我的 django 应用程序中有一个函数可以创建一个 word 文档,如下所示:

def form_view(request):

if request.method == 'POST':
#do a bunch of things
context = {
'model_1' : model_1,
}
in_template = "Forms/mytemplate.docx"

doc = DocxTemplate(in_template)
doc.render(context)
out_filename = "outfile.docx"
http_word_response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document')
http_word_response['Content-Disposition'] = 'attachment; filename=%s' % out_filename
doc.save(http_word_response)
return http_word_response

else:
return render( request, 'mysite/form.html', context)

所以现在,该文件作为 http_word_response 提供。变量,效果很好

我想更改此设置,以便实际创建文件并将其保存到 S3 中,但我不想先将文件保存在本地,而仅使用 python-docx 包的流函数: https://python-docx.readthedocs.io/en/latest/user/documents.html#opening-a-file-like-document

这是它提供的示例:
with open('foobar.docx', 'rb') as f:
source_stream = StringIO(f.read())
document = Document(source_stream)
source_stream.close()
...
target_stream = StringIO()
document.save(target_stream)

我不确定如何将该样本转换为读取我的模板文件并输出一个文件/对象,然后我可以将其发送到 S3 并进行处理。

我最好的猜测是这样开始的:
        with open(in_template, 'rb') as f:
source_stream = StringIO(f.read())
doc = DocxTemplate(source_stream)
source_stream.close()

target_stream = StringIO()
document.save(target_stream)

但后来我对我的 doc.render(context) 的位置感到困惑部分内容以及如何更改 target_stream 的名称到我想要的文件名。

任何有关入门的帮助表示赞赏。

最佳答案

迟到了,我想你已经找到了答案,但无论如何......source_streamtarget_stream是 StringIO 对象,使用内存文本缓冲区的文本流。将它们视为内存中的文件,没有关于它们的路径的任何信息。
你的猜测是好的,doc.render(context)在创建 DocxTemplate 之后进入空行并关闭 source_stream (因为你不再需要它了)。
发布 target_stream到 s3,您可以使用 smart open图书馆,有这样的东西:

from smart_open import open

with open('s3://bucket/key.txt', 'wb', transport_params=transport_params) as fout:
fout.write(target_stream)
有关参数的信息,请参阅智能打开文档。

关于python - 如何使用 python-docx 从模板流式传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53513068/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com