Monday, November 11, 2019

How to create XLS report in Odoo 12

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.
  • 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

How to create XLS report in Odoo 12

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 u...