如何使用Python的XlsxWriter在折叠行中插入图片?
带图片的Excel三级分组功能实现方案
可行性结论
完全可以实现带图片的三级分组Excel表格功能,现有代码的核心问题是图片插入的行号逻辑错误,导致图片无法和第三级分组行关联。
现有代码问题点
- 图片插入的行号使用
0 + image_size,导致所有图片都被插入到表格开头,而非对应第三级分组的目标行 - 图片插入时未正确绑定到第三级分组的行配置,导致分组折叠/展开时图片无法同步隐藏/显示
修正后的实现代码
将图片插入逻辑正确嵌入到第三级分组的循环中,确保图片和对应行的分组属性绑定:
# 工作表初始化与表头设置(原有代码保留) sheet = workbook.add_worksheet(sheet_name) sheet.outline_settings(symbols_below=False) sheet.set_column(0, 1, 18) sheet.set_column(2, 2, 36) sheet.set_column(3, 7, 18) sheet.set_row(0, 70) sheet.write(0, 0, _("Header"), table_header_format) sheet.write(0, 1, _("Header 1"), table_header_format) sheet.write(0, 2, _("Header 2"), table_header_format) row = 1 for categ_id, values in categ_id_values.items(): # 第一级分组逻辑 sheet.set_row(row, None, None, {"level": 1, "hidden": False}) sheet.merge_range(row, 0, row, col, categ_id.name, table_group_format_align_left) row += 1 # 第二级分组-描述行 description = values["description"] description_size = len(description.split("\n")) * 15 sheet.set_row(row, description_size, None, {"level": 2, "hidden": True}) sheet.merge_range(row, 0, row, col, description, table_format_align_left_bold) row += 1 # 第二级分组-空行 sheet.set_row(row, None, None, {"level": 2, "hidden": True}) sheet.merge_range(row, 0, row, col, "", table_format_align_left_bold) row += 1 for product_template_data in values["product_templates"]: # 第二级分组-产品模板行 product_template_id = product_template_data.get("product_template_id") product_template_specification, row_size = self.get_product_template_specification(product_template_data["attributes"], product_template_id) sheet.set_row(row, row_size, None, {"level": 2, "hidden": True, "collapsed": True}) sheet.write(row, 0, product_template_id.display_name, table_format_template_align_left) sheet.write(row, 1, "", table_format_align_left) sheet.write(row, 2, product_template_specification, table_format_align_left) col = 3 for pricelist_id in pricelist_ids: sheet.write(row, col, "", table_pricelist_format) col += 1 row += 1 # 第三级分组-产品变体循环 for product_variant_id in product_template_data["product_variant_ids"]: specifications, row_size = self.get_product_product_specification( product_template_data["attributes"], product_variant_id) # 设置当前行为第三级分组 sheet.set_row(row, row_size, None, {"level": 3, "hidden": True, "collapsed": True}) # 写入产品变体内容 sheet.write(row, 0, product_variant_id.name, table_format_model_bold_align_left) sheet.write(row, 1, "", table_format_align_left) sheet.write(row, 2, specifications, table_format_align_left) col = 2 for pricelist_id in pricelist_ids: col += 1 pricelist_line_id = product_variant_id.product_template_pricelist_line_ids.filtered(lambda line_id: line_id.pricelist_id == pricelist_id) sheet.write(row, col, pricelist_line_id.price if pricelist_line_id else 0, table_pricelist_format) # 插入图片到当前行的第二列(列索引1) image = self.download_image() if image: sheet.insert_image(row, 1, "Test.jpeg", { "image_data": image, "x_scale": 0.13, "y_scale": 0.22, "object_position": 1, # 图片随单元格同步移动/调整 }) row += 1
关键修改说明
- 将图片插入的行号改为当前循环的
row,确保图片插入到对应第三级分组的目标行 - 图片插入前已通过
sheet.set_row将当前行标记为第三级分组,分组折叠/展开时图片会同步隐藏/显示 - 保留
object_position:1参数,确保图片随单元格的位置和大小变化同步调整
内容的提问来源于stack exchange,提问作者Koplik
相关产品推荐
相关产品推荐

