使用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
相关产品推荐
相关产品推荐

