【odoo15】在odoo中创建Excel报表中用到的一些零碎知识,承接上篇博客。

这篇博客详细介绍了在Odoo15中创建Excel报表的一些技巧,包括如何设置字体加粗、通过循环打印多个表的字段、调整列宽、设置表头、添加背景样式、插入图片以及合并单元格等操作,帮助提高报表制作效率。

sheet.write(0, 0, obj.name, bold) 坐标显示(0,0)

改成(1,1)坐标,再次运行:

from odoo import api, fields, models, _


class report_card_Excel(models.AbstractModel):
    _name = 'report.mysale.report_mysale_demo_xlsx'
    _inherit = 'report.report_xlsx.abstract'

    def generate_xlsx_report(self, workbook, data, partners):
        for obj in partners:
            report_name = obj.name
            sheet = workbook.add_worksheet(report_name[:31])
            bold = workbook.add_format({"bold": True})
            sheet.write(1, 1, obj.name, bold)

 sheet.write(1, 1, obj.name, bold)中的bold属性为【字体加粗】,去掉后效果如下:

用循环来打印多个表的字段至一张Excel:多选然后打印:

 代码:

from odoo import api, fields, models, _


class report_card_Excel(models.AbstractModel):
    _name = 'report.mysale.report_mysale_demo_xlsx'
    _inherit = 'report.report_xlsx.abstract'

    def generate_xlsx_report(self, workbook, data, partners):
            sheet = workbook.add_worksheet("测试打印多个字段")
            bold = workbook.add_format({"bold": True})
            row = 3
            col = 3
            for obj in partners:
                row += 1
                sheet.write(row, col, obj.name, bold)

给每一行字段添加一个标识:

 代码:row行   col列

# -*- coding: utf-8 -*-
import base64
import io

from odoo import api, fields, models, _


class report_card_Excel(models.AbstractModel):
    _name = 'report.mysale.report_mysale_demo_xlsx'
    _inherit = 'report.report_xlsx.abstract'

    def generate_xlsx_report(self, workbook, data, partners):
            sheet = workbook.add_worksheet("测试打印多个字段")
            bold = workbook.add_format({"bold": True})
            row = 3
            col = 3
            for obj in partners:
                row += 1
                sheet.write(row, col, '姓名', bold)
                sheet.write(row, col+1, obj.name)

                row += 1
                sheet.write(row, col, '年龄', bold)
                sheet.write(row, col + 1, obj.age)

                row += 1
                sheet.write(row, col, '序列号', bold)
                sheet.write(row, col + 1, obj.serial_number)

 sheet.set_column('D:E', 20)       ---->       sheet.set_column(' Eexcel表格行列 ', 宽度值)

 效果如下:

 改一下 : sheet.set_column('D:D', 12) :效果如下:

设置一个表头:row += 1      sheet.merge_range(row, col, row, col+1, 'ID Card', bold)

代码如下:

from odoo import api, fields, models, _


class report_card_Excel(models.AbstractModel):
    _name = 'report.mysale.report_mysale_demo_xlsx'
    _inherit = 'report.report_xlsx.abstract'

    def generate_xlsx_report(self, workbook, data, partners):
            sheet = workbook.add_worksheet("测试打印多个字段")
            bold = workbook.add_format({"bold": True})
            row = 3
            col = 3
            sheet.set_column('D:D', 12)
            for obj in partners:
                row += 1
                sheet.merge_range(row, col, row, col+1, 'ID Card', bold)
                row += 1
                sheet.write(row, col, '姓名', bold)
                sheet.write(row, col+1, obj.name)

                row += 1
                sheet.write(row, col, '年龄', bold)
                sheet.write(row, col + 1, obj.age)

                row += 1
                sheet.write(row, col, '序列号', bold)
                sheet.write(row, col + 1, obj.serial_number)

给表头增加一个黄色的背景样式,以及字体居中:

format_1 = workbook.add_format({'bold': True, 'align': 'center', 'bg_color': 'yellow'})

放到 sheet.merge_range(row, col, row, col + 1, 'ID Card', format_1)里边:

效果如下:

在底部放入row+=2 每个用户卡片之间空两格,可增加辨识度。

 完整代码粘贴一下:

from odoo import api, fields, models, _


class report_card_Excel(models.AbstractModel):
    _name = 'report.mysale.report_mysale_demo_xlsx'
    _inherit = 'report.report_xlsx.abstract'

    def generate_xlsx_report(self, workbook, data, partners):
        sheet = workbook.add_worksheet("测试打印多个字段")
        bold = workbook.add_format({"bold": True})
        format_1 = workbook.add_format({'bold': True, 'align': 'center', 'bg_color': 'yellow'})
        row = 3
        col = 3
        sheet.set_column('D:D', 12)
        for obj in partners:
            row += 1
            sheet.merge_range(row, col, row, col + 1, 'ID Card', format_1)
            row += 1
            sheet.write(row, col, '姓名', bold)
            sheet.write(row, col + 1, obj.name)

            row += 1
            sheet.write(row, col, '年龄', bold)
            sheet.write(row, col + 1, obj.age)

            row += 1
            sheet.write(row, col, '序列号', bold)
            sheet.write(row, col + 1, obj.serial_number)
            
            row += 2

Excel中插入图片:

首先要导入这两个包:(io与base64的解码)

import base64
import io

代码:(如果image这个字段里边有图片就解码,然后把图片加载进去)

我的image字段:image = fields.Binary(string="上传图片")

  if obj.image:
                image = io.BytesIO(base64.b64decode(obj.image))
                sheet.insert_image(row, col, "image.png", {'image_data': image, 'x_scale': 0.1, 'y_scale': 0.1})
                row += 6

row+=6  给图片空出六行的间距,image的xy的大小缩放为0.1

完整代码:

import base64
import io

from odoo import api, fields, models, _


class report_card_Excel(models.AbstractModel):
    _name = 'report.mysale.report_mysale_demo_xlsx'
    _inherit = 'report.report_xlsx.abstract'

    def generate_xlsx_report(self, workbook, data, partners):
        sheet = workbook.add_worksheet("测试打印多个字段")
        bold = workbook.add_format({"bold": True})
        format_1 = workbook.add_format({'bold': True, 'align': 'center', 'bg_color': 'yellow'})
        row = 3
        col = 3
        sheet.set_column('D:D', 12)
        for obj in partners:
            row += 1
            sheet.merge_range(row, col, row, col + 1, 'ID Card', format_1)
            row += 1

            if obj.image:
                image = io.BytesIO(base64.b64decode(obj.image))
                sheet.insert_image(row, col, "image.png", {'image_data': image, 'x_scale': 0.1, 'y_scale': 0.1})
                row += 6

            sheet.write(row, col, '姓名', bold)
            sheet.write(row, col + 1, obj.name)

            row += 1
            sheet.write(row, col, '年龄', bold)
            sheet.write(row, col + 1, obj.age)

            row += 1
            sheet.write(row, col, '序列号', bold)
            sheet.write(row, col + 1, obj.serial_number)

            row += 2

合并两行两列单元格并涂成黄色样式:sheet.merge_range(row, col, row+1, col + 1, '', format_1)

 自己试一下即可,这么合并没问题:

目前为止也就看了这么多的知识点了,以后有的话接着再整理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值