解决Odoo中多部门选择时XLSX报表数据覆盖问题
解决Odoo XLSX报表数据覆盖问题
我一眼就揪出问题所在了!咱们来拆解下:
你现在的行号处理逻辑有bug——遍历每个部门的休假记录时,用enumerate(res[i]['display'])生成的row变量,每个部门都会从0开始计数,然后写入row+2的位置。这就导致第二个部门的记录直接从第2行(也就是第一个部门的起始行)开始写,把第一个部门的记录彻底覆盖了,这就是为啥你只看到8条(第一个部门的数量)而不是预期13条的原因。另外你末尾写的row + 1和i+1完全无效,因为没有赋值操作,不过这不是核心问题。
修复方案
你需要维护一个全局的行计数器,让所有部门的记录依次往下衔接,而不是每个部门都从头开始:
# 初始化起始行,对应你原来的row+2(索引2对应第3行) current_row = 2 for dept_data in res: print(dept_data) print(len(dept_data['display'])) for j in dept_data['display']: print(j) print("jenan") col = 0 sheet.write(current_row, col, j.department_id.name, format2) sheet.write(current_row, col + 1, j.employee_id.name, format2) sheet.write(current_row, col + 2, j.date_from, format) sheet.write(current_row, col + 3, j.date_to, format) sheet.write(current_row, col + 4, j.holiday_status_id.name, format2) # 写完一条记录后,行号自增,确保下一条写到下一行 current_row += 1
为什么这样能解决问题?
- 用
current_row统一追踪当前写入的行号,初始值设为你原来的起始行索引2 - 每写完一条休假记录就把行号加1,让后续记录自动衔接在上一条的下方
- 去掉了每个部门内部的
enumerate生成row的逻辑,彻底避免了部门间行号重复覆盖的问题
修改后,第一个部门的8条记录会写到第3到第10行,第二个部门的5条会接着写到第11到第15行,不会再出现覆盖,你就能拿到预期的13条记录啦!
内容的提问来源于stack exchange,提问作者jenan




