在主题中详细说明我需要一些关于下载xls文件的方法的解释。 在Odoo8上,通过向导我创建了一个xlwt文件,使用函数wb.save(filename)将其存储到文件系统。 但是,经过大量的谷歌搜索,我不能得到我需要的东西,我真的很难过...... 是否有人帮助我采取正确的方式?
答案 0 :(得分:0)
这是下载xls文件的完美示例。
步骤1:在常规模型(向导)中创建一个方法并返回URL。
@api.multi
def get_file(self):
return {
'type' : 'ir.actions.act_url',
'url': '/web/binary/download_document?model=wizard.product.stock.report&field=datas&id=%s&filename=product_stock.xls'%(self.id),
'target': 'self',
}
(就像您在/web/controllers/main.py中看到的文件一样)
步骤2:创建一个控制器类并捕获该URL并执行下载excel文件的过程。
from openerp import http
from openerp.http import request
from openerp.addons.web.controllers.main import serialize_exception,content_disposition
import base64
class Binary(http.Controller):
@http.route('/web/binary/download_document', type='http', auth="public")
@serialize_exception
def download_document(self,model,field,id,filename=None, **kw):
""" Download link for files stored as binary fields.
:param str model: name of the model to fetch the binary from
:param str field: binary field
:param str id: id of the record from which to fetch the binary
:param str filename: field holding the file's name, if any
:returns: :class:`werkzeug.wrappers.Response`
"""
Model = request.registry[model]
cr, uid, context = request.cr, request.uid, request.context
fields = [field]
res = Model.read(cr, uid, [int(id)], fields, context)[0]
filecontent = base64.b64decode(res.get(field) or '')
if not filecontent:
return request.not_found()
else:
if not filename:
filename = '%s_%s' % (model.replace('.', '_'), id)
return request.make_response(filecontent,
[('Content-Type', 'application/octet-stream'),
('Content-Disposition', content_disposition(filename))])
在上面的方法中,我从url获取了ID,然后应用了一些计算并从请求中返回http响应。无论我从向导传递给控制器方法的值是什么,我都会在控制器方法上获取它们,在控制器方法中,我将执行必要的处理并直接返回文件。
见下文,我已经从url
传递了模型,字段,id和文件名/web/binary/download_document?model=wizard.product.stock.report&field=datas&id=%s&文件名= product_stock.xls
使用上述方法,您可以创建xls,csv,txt任何文件。
谢谢,