This question has been flagged
2 Replies
13606 Views

Hi,

I use Odoo 10 and Odoo 10 Enterprise

I have a custom report to generate in excel format.

I have the report in pdf using a wizard.

Now I want it to be in excel.

How can I do that?

I tried report_xlsx, but I can't find documentation for using it with a wizard.

the example in the documentation for partners works ok:

class PartnerXlsx(ReportXlsx):

    def generate_xlsx_report(self, workbook, data, partners):

        _logger.info('generate_xlsx_report ')

        for obj in partners:

            report_name = obj.name

            # One sheet by partner

            sheet = workbook.add_worksheet(report_name[:31])

            bold = workbook.add_format({'bold': True})

            sheet.write(0, 0, obj.name, bold)

PartnerXlsx('report.res.partner.xlsx', 'res.partner')


So how to do it with a wizard?

Thanks!





 


Avatar
Discard
Best Answer

Hi,

You can try like this to print the report from the wizard.

In the wizard,

<button name="print_xls_report" string="Print Report" type="object"  class="oe_highlight"  />

Then in the python "print_xls_report" is defined,

def print_xls_report(self, cr, uid, ids, context=None):
data = self.read(cr, uid, ids)[0]
return {'type': 'ir.actions.report.xml',
'report_name': 'module_name.report_name.xlsx',
'datas': data
}

Then we have to define the report,

class ClassABCD(ReportXlsx):

def generate_xlsx_report(self, workbook, data, lines):
current_date = strftime("%Y-%m-%d", gmtime())
logged_users = self.env['res.users'].search([('id', '=', data['create_uid'][0])])
sheet = workbook.add_worksheet()
        # add the rest of the report code here

ClassABCD('report.module_name.report_name.xlsx', 'corresponding_model_name')

Above added python code is from v9, you can add necessary changes in v10.

Thanks

Avatar
Discard
Author

Thanks a lot Niyas

It was very helpful your answer.

And yes I had to "convert it" to 10 version, and I did it this way:

<button name="print_xls_report" string="Print Report" type="object" class="oe_highlight" />

Then in the python "print_xls_report" is defined,

def print_xls_report(self, data):

data['form'] = self.read(['account_analytic_id', 'fecha_desde'])[0]

return self.env['report'].get_action(self, 'module.report_name.xlsx', data=data)

Then we have to define the report,

class ClassABCD(ReportXlsx):

def generate_xlsx_report(self, workbook, data, lines):

current_date = strftime("%Y-%m-%d", gmtime())

logged_users = self.env['res.users'].search([('id', '=', data['create_uid'][0])])

sheet = workbook.add_worksheet()

# add the rest of the report code here

ClassABCD('report.module_name.report_name.xlsx', 'corresponding_model_name')

I still have the problem that when running the report, outputs this error:

Bad Report ReferenceThis report is not loaded into the database: module_name.report_name.xlsx.

So I assume that a <report> clause is left in the .xml file and I write the following:

<report

id="report_name_xlsx"

model="corresponding_model_name"

name="model_name.report_name.xlsx"

report_name="model_name.report_name.xlsx"

report_type="xlsx"

file="report_nname.xlsx"

attachment_use="False"

/>

But when I do that, outputs the following:

2017-08-03 01:03:16,541 11242 INFO module_name odoo.tools.convert: The XML file does not fit the required schema !

Traceback (most recent call last):

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/tools/convert.py", line 905, in convert_xml_import

relaxng.assert_(doc)

File "src/lxml/lxml.etree.pyx", line 3501, in lxml.etree._Validator.assert_ (src/lxml/lxml.etree.c:194922)

AssertionError: Element odoo has extra content: template, line 3 2017-08-03 01:03:16,578 11242 INFO module_name odoo.tools.convert: /home/eduardo/odoo-git/odoo-10e/local-addons/module_name/views/templates.xml:3:0:ERROR:RELAXNGV:RELAXNG_ERR_EXTRACONTENT: Element odoo has extra content: template 2017-08-03 01:03:16,579 11242 ERROR module_name odoo.modules.registry: Failed to load registry Traceback (most recent call last):

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/modules/registry.py", line 78, in new

odoo.modules.load_modules(registry._db, force_demo, status, update_module)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/modules/loading.py", line 335, in load_modules

force, status, report, loaded_modules, update_module)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/modules/loading.py", line 237, in load_marked_modules

loaded, processed = load_module_graph(cr, graph, progressdict, report=report, skip_modules=loaded_modules, perform_checks=perform_checks)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/modules/loading.py", line 156, in load_module_graph

_load_data(cr, module_name, idref, mode, kind='data')

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/modules/loading.py", line 95, in _load_data

tools.convert_file(cr, module_name, filename, idref, mode, noupdate, kind, report)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/tools/convert.py", line 848, in convert_file

convert_xml_import(cr, module, fp, idref, mode, noupdate, report)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/tools/convert.py", line 905, in convert_xml_import

relaxng.assert_(doc)

File "src/lxml/lxml.etree.pyx", line 3501, in lxml.etree._Validator.assert_ (src/lxml/lxml.etree.c:194922)

AssertionError: Element odoo has extra content: template, line 3 2017-08-03 01:03:16,875 11242 INFO module_name werkzeug: 127.0.0.1 - - [03/Aug/2017 01:03:16] "POST /longpolling/poll HTTP/1.1" 500 - 2017-08-03 01:03:17,000 11242 INFO module_name odoo.modules.loading: loading 1 modules...

2017-08-03 01:03:17,018 11242 ERROR module_name werkzeug: Error on request:

Traceback (most recent call last):

File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 193, in run_wsgi

execute(self.server.app)

File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 181, in execute

application_iter = app(environ, start_response)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/service/server.py", line 246, in app

return self.app(e, s)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/service/wsgi_server.py", line 184, in application

return application_unproxied(environ, start_response)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/service/wsgi_server.py", line 170, in application_unproxied

result = handler(environ, start_response)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/http.py", line 1306, in __call__

return self.dispatch(environ, start_response)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/http.py", line 1280, in __call__

return self.app(environ, start_wrapped)

File "/usr/local/lib/python2.7/dist-packages/werkzeug/wsgi.py", line 599, in __call__

return self.app(environ, start_response)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/http.py", line 1454, in dispatch

odoo.registry(db).check_signaling()

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/__init__.py", line 52, in registry

return modules.registry.Registry(database_name)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/modules/registry.py", line 55, in __new__

return cls.new(db_name)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/modules/registry.py", line 78, in new

odoo.modules.load_modules(registry._db, force_demo, status, update_module)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/modules/loading.py", line 335, in load_modules

force, status, report, loaded_modules, update_module)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/modules/loading.py", line 237, in load_marked_modules

loaded, processed = load_module_graph(cr, graph, progressdict, report=report, skip_modules=loaded_modules, perform_checks=perform_checks)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/modules/loading.py", line 156, in load_module_graph

_load_data(cr, module_name, idref, mode, kind='data')

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/modules/loading.py", line 95, in _load_data

tools.convert_file(cr, module_name, filename, idref, mode, noupdate, kind, report)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/tools/convert.py", line 848, in convert_file

convert_xml_import(cr, module, fp, idref, mode, noupdate, report)

File "/home/eduardo/odoo-git/odoo-10e/src/odoo/odoo/tools/convert.py", line 905, in convert_xml_import

relaxng.assert_(doc)

File "src/lxml/lxml.etree.pyx", line 3501, in lxml.etree._Validator.assert_ (src/lxml/lxml.etree.c:194922)

AssertionError: Element odoo has extra content: template, line 3

So I created the report in the UI

Settings -> Technical -> Reports

fields:

name: report_name

model: corresponding_model

report type: xlsx

template name: model_name.report_name.xlsx

printer report name: report_name.xlsx

And it worked just fine :-)

But the question still persists:

How I can do the <report> clause for the report in the xml file, as simulating what I did in the UI ??

Best Answer

try
for index, line in enumerate(obj.timesheet_ids): sheet.write(index,2, line.date) ...

or

for index, obj in enumerate(partners): sheet = workbook.add_worksheet("timesheet"+str(index))

Avatar
Discard