2

默认情况下,我们可以将 Odoo 中的报告导出为 PDF 或 HTML。在一些插件的帮助下,似乎也可以导出到 XLS、ODT 等。但我需要的是 XML 格式。在 Odoo 中是否有可能?

当我检查 Odoo 实现时,我想也许可以使用控制器类型报告和一些用于将控制器导出为 XML 的 python 代码。那么您对此有何见解?

4

3 回答 3

0

我们发现最好为此编写自定义代码,使用 lxml 或用于大输出,xml.sax.saxutils。

同样,根据文件的要求和大小,我们在向导中将其返回或写入磁盘位置并通过电子邮件发送给用户。

于 2015-03-30T23:06:39.667 回答
0

如果你想下载 XML 格式的东西,你应该编写一个控制器,并将它链接到一个按钮。看看我的书面文件下载器:

https://github.com/odoo-chile/l10n_cl_dte/blob/8.0/controllers/downloader.py

您还可以在视图中查看我是如何设置按钮的:

   <button string="Download XML" type="object" name="get_xml_file"
        class="oe_highlight" attrs="{
            'invisible':[('state', 'in', ['draft'])]}"/>

..以及models/invoice.py中定义的方法:

def get_xml_file(self):
    return {
        'type' : 'ir.actions.act_url',
        'url': '/web/binary/download_document?model=account.invoice&field=sii_xml_request&id=%s&filename=demoxml.xml' % (self.id),
        'target': 'self',
    }
于 2016-05-08T15:43:22.520 回答
0

有一个模块可以让您创建 xml 报告:report_xml. 您只需要向您的模块添加一个依赖项并将报告声明为正常报告,如下所示:

<report
    id="example_xml_report"
    name="module_name.template_custom_id"
    string="Example XML Report"
    report_type="qweb-xml"
    menu="False"
    model="account.invoice" />

然后您可以使用 qweb 添加 xml 报告。lxml直接使用库构建它更方便:

<template id="template_custom_id">
    <t t-call="report_xml.utf8_header">
        <FIRSTHEADER>
            <OPERATION t-esc="operation" />
            <OPERATIONTYPE t-esc="operation_type" />
            <VERSION t-raw="0">1.0</VERSION>    <!-- literal value -->

            <ELEMENT t-foreach="docs" t-as="o">
                <COMPANYNAME t-esc="o.company_id.name" />

                <!-- [...] -->

您可以添加一个 python 类来处理报告的一些自定义数据作为其余报告:

class AccountInvoiceXmlReport(models.AbstractModel):
    _name = "report.module_name.template_custom_id"

    @api.multi
    def render_html(self, data=None):
        """ If ``context`` contains a dict called ``docargs``, it will be used as
            the Qweb context. The special key ``docs`` will be added to ``docargs``
            automatically if missing.
        """

        # some operations

        docargs = self.env.context.get("docargs", dict())
        if "docs" not in docargs:
            docargs["docs"] = (account_invoice_obj)

        docargs.update({
            'operation': self.env.context.get('operation', False),
            'operation_type': self.env.context.get('operation_type', False)       # TODO >> verify the invoices have the same type
        })

        result = (
            self.env["report"].render(            # generate xml report
                self._name[len("report."):],
                docargs
            ).strip()
        )
        return result

正如您可以检查README.rst要求:

  • 安装lxml库。
  • 安装存储库reporting-engine

有关创建报告的更多说明,请访问此处

于 2017-12-06T10:40:09.700 回答