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.



Thursday, January 24, 2019

Creating Your First App

This developer guide will assist you to get started with Odoo and familiarize basic technical details in Odoo[version-12].


Current Contents:
1. Develop a new module in Odoo
2. Install new app in Odoo
3. PDF report for a model 
4. Creating a wizard 
5. PDF report from Wizard 


Complete module used for this tutorial can be found at Github

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