You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python的XlsxWriter在折叠行中插入图片?

带图片的Excel三级分组功能实现方案

可行性结论

完全可以实现带图片的三级分组Excel表格功能,现有代码的核心问题是图片插入的行号逻辑错误,导致图片无法和第三级分组行关联。

现有代码问题点

  1. 图片插入的行号使用0 + image_size,导致所有图片都被插入到表格开头,而非对应第三级分组的目标行
  2. 图片插入时未正确绑定到第三级分组的行配置,导致分组折叠/展开时图片无法同步隐藏/显示

修正后的实现代码

将图片插入逻辑正确嵌入到第三级分组的循环中,确保图片和对应行的分组属性绑定:

# 工作表初始化与表头设置(原有代码保留)
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:14:56