1)定义一个虚拟表,显示需要选择的属性:
class cloud_partner_account_balance(models.TransientModel):
_name = 'cloud.partner.account.balance'
partner_id = fields.Many2many('res.partner', 'report_partner', 'report', 'partner', string=u'客户全称',
domain="[('customer','=',True)]")
export_time = fields.Datetime(u"导出时间", default=lambda self: fields.datetime.now())
2)定义视图:
<record id="cloud_partner_account_balance_form" model="ir.ui.view">
<field name="name">客户账户余额报表</field>
<field name="model">cloud.partner.account.balance</field>
<field name="arch" type="xml">
<form string="客户账户余额报表">
<footer>
<button string="下载" name="action_down_excel" type="object" class="oe_highlight"/>
or
<button string="取消" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="cloud_partner_account_balance_action" model="ir.actions.act_window">
<field name="name">客户账户余额报表</field>
<field name="res_model">cloud.partner.account.balance</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<menuitem action="cloud_partner_account_balance_action"
id="cloud_partner_account_balance_menu"
parent="account.menu_finance_reports" sequence="2"/>
3)定义下载处理方法:
@api.multi
def action_down_excel(self):
url = '/cloud/cloud_partner_account_balance_down_excel'
return {
'type': 'ir.actions.act_url',
'url': url,
'target': 'new',
'tfs_close': True
}
4)定义下载的表格数据处理方法及生成excel:
@http.route(['/cloud/cloud_partner_account_balance_down_excel'], type='http', auth="public", website=True)
def cloud_partner_account_balance_down_excel(self, **post):
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet(u'客户账户余额报表')
#定义每一列的宽度
worksheet.col(0).width = 256 * 32
worksheet.col(1).width = 256 * 13
worksheet.col(2).width = 256 * 8
worksheet.col(3).width = 256 * 15
worksheet.col(4).width = 256 * 12
worksheet.col(5).width = 256 * 14
worksheet.col(6).width = 256 * 22
row = 0
worksheet.write(row, 0, u'客户全称')
worksheet.write(row, 1, u'客户代码')
worksheet.write(row, 2, u'客户简称')
worksheet.write(row, 3, u'会员类别')
worksheet.write(row, 4, u'会员缴款类别')
worksheet.write(row, 5, u'客户账户余额')
worksheet.write(row, 6, u'导出时间')
partners = request.env['res.partner'].search([('customer', '=', True)])
for partner in partners:
row += 1
worksheet.write(row, 0, partner.name)
worksheet.write(row, 1, partner.ref)
worksheet.write(row, 2, partner.real_name)
worksheet.write(row, 3, partner.member_categ_id.name)
worksheet.write(row, 4, partner.member_pay_type_id.name)
worksheet.write(row, 5, partner.usable_money)
worksheet.write(row, 6, datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
fp = StringIO()
workbook.save(fp)
fp.seek(0)
data = fp.read()
fp.close()
return request.make_response(data, [('Content-Type', 'application/octet-stream'),
('Content-Disposition', content_disposition(u'客户账户余额报表.xls'))])
5)设置合并单元格和水平居中:
创建style对象
style = xlwt.XFStyle()
创建alignment对象
alignment = xlwt.Alignment()
指定水平居中
alignment.horz = xlwt.Alignment.HORZ_CENTER
指定对齐格式
style.alignment = alignment
指定合并单元格(row1,row2,col1,col2,label=' ',style=style),下面是说在第一行,合并第0列到第13列单元格,里面的内容是'采购入库明细',样式style为我们创建的style
worksheet.write_merge(0, 0, 0, 13, u'采购入库明细', style=style)