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

使用openpyxl调整Excel列宽后分组列触发DimensionHolder.group报错

问题根因

你手动实例化DimensionHolder时没有初始化default_factory属性,该属性是group方法执行时依赖的构造器,默认值应为ColumnDimension类,缺失就会触发NoneType不可调用的报错。原生工作表自带的ws.column_dimensions实例默认会自动初始化这个属性,所以你不自定义列宽直接分组的时候不会出问题。

修复方案

方案1(保留自定义DimensionHolder逻辑)

只需要在实例化DimensionHolder后补充给default_factory赋值即可:

def set_col_width(book, sheet):
    "Simple set columns width and group example"
    dim_holder = DimensionHolder(worksheet=sheet)
    # 补充这一行即可解决报错
    dim_holder.default_factory = ColumnDimension
    for col_name, width in [("A", 15), ("B", 60), ("C", 30)]:
        col_num = column_index_from_string(col_name)
        col_dim = ColumnDimension(sheet, width=width, min=col_num, max=col_num)
        dim_holder[col_name] = col_dim
    # Group columns
    dim_holder.group("B", "C", hidden=True)
    sheet.column_dimensions = dim_holder
    return book, sheet

方案2(更简洁,无需自定义DimensionHolder)

直接复用工作表自带的column_dimensions对象,不需要自己重新实例化,避免属性缺失问题:

def set_col_width(book, sheet):
    "Simple set columns width and group example"
    # 直接在原有列维度对象上设置宽度
    for col_name, width in [("A", 15), ("B", 60), ("C", 30)]:
        sheet.column_dimensions[col_name].width = width
    # 直接调用原有对象的分组方法,不会报错
    sheet.column_dimensions.group("B", "C", hidden=True)
    return book, sheet

两种方案均可正常运行,方案2无额外对象实例化操作,逻辑更精简不易出错。

内容的提问来源于stack exchange,提问作者user3313834

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:36:01