Openpyxl插入新列速度过慢的优化方案求助
高效在Openpyxl表格首列插入空白列的方案
Openpyxl原生的ws.insert_cols(1)会逐个处理单元格的移动、样式复制等冗余操作,在列数较多时效率极低。可以直接操作Openpyxl的底层数据结构实现快速插入,以下是具体方案:
核心思路
直接修改工作表的私有属性_cells(存储所有单元格的键值对),将所有单元格的列号+1;同步处理列宽、合并单元格等关联属性,跳过原生方法的逐单元格操作逻辑。
实现代码
def fast_insert_first_col(ws): # 1. 迁移所有单元格到右侧一列 new_cells = {} for (row, col), cell in ws._cells.items(): # 更新单元格的列索引和存储键 cell.col_idx = col + 1 new_cells[(row, col + 1)] = cell ws._cells = new_cells # 2. 同步迁移列宽设置 new_col_dims = {} # 遍历原有列维度,将列号+1映射 for col_key, dim in ws.column_dimensions.items(): if col_key.isdigit(): new_col_key = str(int(col_key) + 1) else: # 处理字母列号(如"A"->"B") new_col_key = chr(ord(col_key) + 1) new_col_dims[new_col_key] = dim # 给新的首列设置默认列宽(可根据需求调整) new_col_dims["1"] = ws.column_dimensions["1"] ws.column_dimensions = new_col_dims # 3. 处理合并单元格:将合并区域的列范围整体右移 merged_ranges = [] for mr in ws.merged_cells.ranges: merged_ranges.append( (mr.min_row, mr.min_col + 1, mr.max_row, mr.max_col + 1) ) # 清空原有合并区域,添加更新后的 ws.merged_cells.ranges.clear() for start_row, start_col, end_row, end_col in merged_ranges: ws.merge_cells(start_row=start_row, start_column=start_col, end_row=end_row, end_column=end_col) # 清除工作表缓存,确保所有修改生效 ws._clear_cache()
使用方式
传入目标工作表对象即可:
from openpyxl import load_workbook wb = load_workbook("your_file.xlsx") ws = wb.active fast_insert_first_col(ws) wb.save("updated_file.xlsx")
注意事项
- 该方法依赖Openpyxl的私有内部属性(
_cells、_clear_cache),当前3.x版本稳定可用,后续版本更新可能需要适配; - 若工作表包含图表、批注等复杂对象,需额外补充对应迁移逻辑(多数数据表格场景无需);
- 实测97列100行的表格操作耗时可控制在1秒内,与Excel原生操作速度接近。
内容的提问来源于stack exchange,提问作者DrbPy
相关产品推荐
相关产品推荐

