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)

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

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

1271

被折叠的 条评论
为什么被折叠?



