下载使用python-docx创建的文档

时间:2018-09-05 07:21:24

标签: odoo-10 python-docx

我正在尝试在Odoo中导出单词报告,我正在使用python-docx库,

代码:

document = Document()            

records = result

table = document.add_table(rows=0, cols=4,style='Table Grid')  
for att  in records:
    row_cells = table.add_row().cells
    cnt = 0  
    for attdet  in att:
        #row_cells[0].style('text-align: center;vertical-align: middle;') 
        if (cnt == 0):
            row_cells[0].add_paragraph(attdet.serial_no, 'List Bullet')#[0].text = attdet.serial_nobold
            row_cells[1].add_paragraph(attdet.name, 'List Bullet')#[1].text = attdet.name
        else:
            row_cells[2].add_paragraph(attdet.serial_no, 'List Bullet')#.text = attdet.serial_no
            row_cells[3].add_paragraph(attdet.name, 'List Bullet')#.text = attdet.name
        cnt = cnt+1

document.add_page_break()

pdfhttpheaders = [('Content-Type','application/msword')]
return request.make_response(document, headers=pdfhttpheaders)

除了将文档保存到文件夹中之外,我还需要单击按钮后下载此Word文档,

我遇到错误了,

AttributeError: 'JsonRequest' object has no attribute 'make_response'

请任何人指导我解决此错误。

2 个答案:

答案 0 :(得分:1)

从我的角度来看,您必须更改生产方式,并特别在文档的生产和访问位置获取文档。

更简单的方法是,我认为将使用按钮返回操作url字典,以将请求重定向到具有查询字符串中适当数据的控制器,从而能够生成文档为响应方式,即您的操作方式。像这样:

return {
    'type': 'ir.actions.act_url',
    'url': '/report/docx/content/custom',
    'target': 'self',
}

然后,您可以将生成docx报告的代码放入方法控制器中,如下所示:

from odoo import http, tools, _
from odoo.http import request, Controller

class CustomController(Controller):

    @http.route(['/report/docx/content/custom'], type='http', auth="public")
    def report_docx(self, **kwargs):
        # your code of report generation that use request.make_response

只需使用URL查询字符串(如记录ID)或控制器中可能需要的任何其他数据,将足够的信息传递给控制器​​,但通常记录ID就足够了

答案 1 :(得分:0)

好吧,我怀疑这里还有更多错误,但是您首先需要保存文档,也许要保存到io.BytesIO流中,如下所示:

import io

# ...

docx_stream = io.BytesIO()
document.save(docx_stream)
docx_bytes = docx_stream.getvalue()

docx_bytes值是结果.docx文件的实际内容,这是您在响应中所需要的。 document值只是代表文档的内存对象图,与.docx文件没有直接对应关系(除了它可以使用其.save()方法创建文件之外。

我怀疑回答应该是多方面的,但是也许对Odoo有更多了解的人可以帮助您解决这一问题。

此外,我认为内容类型必须为application/vnd.openxmlformats-officedocument.wordprocessingml.document才能正常工作。您拥有的(“应用程序/ msword”)适用于较旧的.doc格式(Word 2003及更低版本)。

我不确定名称pdfhttpheaders的使用表示什么。这与PDF格式没有任何关系。我希望http_headers对于该标识符将是一个更明智的选择。