In this tutorial we'll be creating a simple XLS report that can be generated from wizard in Sales/ Report menu. XLS reports are made using the help of module Base Report XLSX.
Steps to create XLS report.
XLS report is declared just like normal PDF reports in a XML file.
Code:
Code:
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class SaleXLSWizard(models.TransientModel):
_name = 'sale.xls.wizard'
date_end = fields.Date(string='End Date')
date_start = fields.Date(string='Start Date')
@api.multi
def action_create_report(self):
context = dict(self._context)
if context is None:
context = {}
data = self.read()[0] or {}
datas = {
'ids': self._ids,
'data': data,
'model': 'sale.xls.wizard'
}
return self.env.ref(
'sale_report_xls.sale_xls_report'
).report_action(self, data=datas)
return id of the method is module_name.report_tag_id
Creating view for the wizard
Code:
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="sale_xls_report_form_view" model="ir.ui.view">
<field name="name">Sale XLS Report Wizard Form</field>
<field name="model">sale.xls.wizard</field>
<field name="arch" type="xml">
<form string="Sale XLS Report">
<group>
<group>
<field name="date_start"/>
</group>
<group>
<field name="date_end"/>
</group>
</group>
<footer>
<button name="action_create_report"
string="XLS Report"
type="object"
class="oe_highlight"/>
<button string="Cancel"
class="btn btn-default"
special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="action_sale_xls_report_wizard" model="ir.actions.act_window">
<field name="name">Sales XLS Report</field>
<field name="res_model">sale.xls.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<menuitem id="menu_sale_xls_report_wizard"
name="Sale XLS"
action="action_sale_xls_report_wizard"
parent="sale.menu_sale_report"
sequence="5"/>
</odoo>
# -*- coding: utf-8 -*-
from datetime import datetime, timedelta
from odoo import models
class PartnerXlsx(models.AbstractModel):
_name = 'report.sale_report_xls.sale_xls_report_template'
_inherit = 'report.report_xlsx.abstract'
def generate_xlsx_report(self, workbook, data, model):
domain = []
# Formats
grey_format = workbook.add_format({
'bg_color': '#b2beb5'
})
grey_border_format = workbook.add_format({
'bg_color': '#b2beb5',
'bottom': 1,
})
grey_bold_format = workbook.add_format({
'bg_color': '#b2beb5',
'bold': True,
})
# Worksheet
sheet = workbook.add_worksheet('Payroll Details')
sheet.set_row(0, None, grey_format)
sheet.set_row(1, None, grey_format)
sheet.set_row(2, None, grey_border_format)
sheet.set_column(0, 0, 30)
sheet.set_column(1, 1, 40)
sheet.write(0, 0, 'Sale Order Details', grey_bold_format)
sheet.write(1, 0, 'Company', grey_bold_format)
sheet.write(1, 1, 'Your Company', grey_format)
sheet.write(2, 0, 'Run Date & User :', grey_bold_format)
user_date = str((datetime.today()
+ timedelta(hours=4)).strftime("%d-%b-%Y %H:%M: %S"))\
+ ', ' \
+ str(self.env.user.name)
sheet.write(2, 1, user_date, grey_border_format)
# Sale Order table headers
sheet.write(4, 0, 'Sale Order', grey_bold_format)
sheet.write(4, 1, 'Customer', grey_bold_format)
sheet.write(4, 2, 'Total', grey_bold_format)
if data['data']['date_start']:
domain.append(('date_order', '>=', data['data']['date_start']))
if data['data']['date_end']:
domain.append(('date_order', '<=', data['data']['date_end']))
sale_order_ids = self.env['sale.order'].search(domain, limit=10)
row = 5
# Sale Order Table Content
for sale_id in sale_order_ids:
sheet.write(row, 0, sale_id.name)
sheet.write(row, 1, sale_id.partner_id.name)
sheet.write(row, 2, sale_id.amount_total)
row += 1
The name of the model should be report.model_name.report_name
Check xlsx writer documentation for more features of spreadsheet.
Complete module can be downloaded from GitHub.
Steps to create XLS report.
- Declare report action for XLS report
- Create a method to call the report action
- Create the XLS report template
Step1: Declare report action for XLS report
XLS report is declared just like normal PDF reports in a XML file.
Code:
<report id="sale_xls_report"
model="sale.xls.wizard"
string="Sale Report XLS"
report_type="xlsx"
name="sale_report_xls.sale_xls_report"
file="sale_report_xls_wizard"
attachment_use="false"/>
- id: External id for your report [required/ unique
- model: Model for which the report is for [required]
- report_type: Type of report generated
- name: defined as modue_name.report_template_name [required]
Step2: Create a method to call the report action
First we have to create a simple wizard to call the XLS report.Creating a model for wizard
Code:
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class SaleXLSWizard(models.TransientModel):
_name = 'sale.xls.wizard'
date_end = fields.Date(string='End Date')
date_start = fields.Date(string='Start Date')
@api.multi
def action_create_report(self):
context = dict(self._context)
if context is None:
context = {}
data = self.read()[0] or {}
datas = {
'ids': self._ids,
'data': data,
'model': 'sale.xls.wizard'
}
return self.env.ref(
'sale_report_xls.sale_xls_report'
).report_action(self, data=datas)
return id of the method is module_name.report_tag_id
Creating view for the wizard
Code:
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="sale_xls_report_form_view" model="ir.ui.view">
<field name="name">Sale XLS Report Wizard Form</field>
<field name="model">sale.xls.wizard</field>
<field name="arch" type="xml">
<form string="Sale XLS Report">
<group>
<group>
<field name="date_start"/>
</group>
<group>
<field name="date_end"/>
</group>
</group>
<footer>
<button name="action_create_report"
string="XLS Report"
type="object"
class="oe_highlight"/>
<button string="Cancel"
class="btn btn-default"
special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="action_sale_xls_report_wizard" model="ir.actions.act_window">
<field name="name">Sales XLS Report</field>
<field name="res_model">sale.xls.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<menuitem id="menu_sale_xls_report_wizard"
name="Sale XLS"
action="action_sale_xls_report_wizard"
parent="sale.menu_sale_report"
sequence="5"/>
</odoo>
Step3: Create the XLS report template
Code:# -*- coding: utf-8 -*-
from datetime import datetime, timedelta
from odoo import models
class PartnerXlsx(models.AbstractModel):
_name = 'report.sale_report_xls.sale_xls_report_template'
_inherit = 'report.report_xlsx.abstract'
def generate_xlsx_report(self, workbook, data, model):
domain = []
# Formats
grey_format = workbook.add_format({
'bg_color': '#b2beb5'
})
grey_border_format = workbook.add_format({
'bg_color': '#b2beb5',
'bottom': 1,
})
grey_bold_format = workbook.add_format({
'bg_color': '#b2beb5',
'bold': True,
})
# Worksheet
sheet = workbook.add_worksheet('Payroll Details')
sheet.set_row(0, None, grey_format)
sheet.set_row(1, None, grey_format)
sheet.set_row(2, None, grey_border_format)
sheet.set_column(0, 0, 30)
sheet.set_column(1, 1, 40)
sheet.write(0, 0, 'Sale Order Details', grey_bold_format)
sheet.write(1, 0, 'Company', grey_bold_format)
sheet.write(1, 1, 'Your Company', grey_format)
sheet.write(2, 0, 'Run Date & User :', grey_bold_format)
user_date = str((datetime.today()
+ timedelta(hours=4)).strftime("%d-%b-%Y %H:%M: %S"))\
+ ', ' \
+ str(self.env.user.name)
sheet.write(2, 1, user_date, grey_border_format)
# Sale Order table headers
sheet.write(4, 0, 'Sale Order', grey_bold_format)
sheet.write(4, 1, 'Customer', grey_bold_format)
sheet.write(4, 2, 'Total', grey_bold_format)
if data['data']['date_start']:
domain.append(('date_order', '>=', data['data']['date_start']))
if data['data']['date_end']:
domain.append(('date_order', '<=', data['data']['date_end']))
sale_order_ids = self.env['sale.order'].search(domain, limit=10)
row = 5
# Sale Order Table Content
for sale_id in sale_order_ids:
sheet.write(row, 0, sale_id.name)
sheet.write(row, 1, sale_id.partner_id.name)
sheet.write(row, 2, sale_id.amount_total)
row += 1
The name of the model should be report.model_name.report_name
Check xlsx writer documentation for more features of spreadsheet.
Complete module can be downloaded from GitHub.
No comments:
Post a Comment