我正在尝试在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'
请任何人指导我解决此错误。
答案 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
对于该标识符将是一个更明智的选择。