影刀RPA Excel行列操作:插入、删除、隐藏、调整宽高
影刀RPA Excel行列操作:插入、删除、隐藏、调整宽高
作者:林焱
Excel操作不只是读写单元格数据。很多时候你需要操作行列结构——插入一行新数据、删除空行、隐藏辅助列、调整列宽让内容完整显示、冻结首行方便查看。这些操作在手动使用Excel时很简单,但在RPA自动化中,每一步都有坑。
这篇文章把Excel行列操作的常用场景和正确方法讲全。
一、插入行和列
1.1 插入行
【插入Excel行】 文件路径:D:\data\product.xlsx Sheet名:Sheet1 插入位置:第3行  插入行数:1用Python操作:
importopenpyxl wb=openpyxl.load_workbook("D:\\data\\product.xlsx")ws=wb["Sheet1"]# 在第3行前插入一行ws.insert_rows(3)# 在第3行前插入3行ws.insert_rows(3,3)wb.save("D:\\data\\product.xlsx")坑1:插入行后公式引用错位
插入行后,原来引用该区域的公式会自动调整。但有些复杂的公式(特别是跨Sheet引用)可能不会正确调整,需要手动检查。
坑2:插入行后格式不一致
新插入的行没有格式(边框、背景色等),和周围行不统一。插入后需要复制相邻行的格式:
fromcopyimportcopy# 复制第2行的格式到新插入的第3行forcolinrange(1,ws.max_column+1):source_cell=ws.cell(row=2,column=col)target_cell=ws.cell(row=3,column=col)ifsource_cell.has_style:target_cell.font=copy(source_cell.font)target_cell.border=copy(source_cell.border)target_cell.fill=copy(source_cell.fill)target_cell.number_format=source_cell.number_format1.2 插入列
# 在第B列前插入一列ws.insert_cols(2)# 在第B列前插入2列ws.insert_cols(2,2)1.3 批量插入多行数据
在数据末尾批量追加多行:
importopenpyxl wb=openpyxl.load_workbook("D:\\data\\product.xlsx")ws=wb["Sheet1"]# 找到最后一行last_row=ws.max_row# 批量追加new_data=get_variable("new_data_list")forrow_datainnew_data:last_row+=1forcol_idx,valueinenumerate(row_data,1):ws.cell(row=last_row,column=col_idx,value=value)wb.save("D:\\data\\product.xlsx")用pandas更简洁:
importpandasaspd# 读取原有数据df_old=pd.read_excel("D:\\data\\product.xlsx")df_new=pd.DataFrame(get_variable("new_data_list"))# 合并df_all=pd.concat([df_old,df_new],ignore_index=True)# 写回df_all.to_excel("D:\\data\\product.xlsx",index=False)二、删除行和列
拼多多店群自动化上架方案
2.1 删除行
【删除Excel行】 文件路径:D:\data\product.xlsx Sheet名:Sheet1 起始行:第5行 删除行数:1用Python:
# 删除第5行ws.delete_rows(5)# 删除第5-7行(3行)ws.delete_rows(5,3)2.2 删除空行
数据中间有大量空行需要清理:
importopenpyxl wb=openpyxl.load_workbook("D:\\data\\product.xlsx")ws=wb["Sheet1"]# 从下往上遍历,删除空行forrowinrange(ws.max_row,1,-1):# 检查整行是否为空is_empty=Trueforcolinrange(1,ws.max_column+1):ifws.cell(row=row,column=col).valueisnotNone:is_empty=Falsebreakifis_empty:ws.delete_rows(row)wb.save("D:\\data\\product.xlsx")坑:从上往下删除导致行号错位
删除一行后,下面的行会上移,行号变化。如果从上往下遍历删除,会跳过一些行。必须从下往上删。
坑:删行后合并单元格错乱
删除包含合并单元格的行,合并范围可能错乱。删行后检查合并单元格的范围是否正确,必要时手动调整。
2.3 按条件删除行
删除满足条件的行(比如删除状态为"已下架"的行):
importpandasaspd df=pd.read_excel("D:\\data\\product.xlsx")# 删除状态为"已下架"的行df=df[df["状态"]!="已下架"]# 写回df.to_excel("D:\\data\\product.xlsx",index=False)用pandas按条件删除比openpyxl逐行删快得多,适合大数据量。
2.4 删除列
# 删除第C列ws.delete_cols(3)# 删除第C-D列(2列)ws.delete_cols(3,2)三、隐藏和显示行列
3.1 隐藏行
importopenpyxl wb=openpyxl.load_workbook("D:\\data\\product.xlsx")ws=wb["Sheet1"]# 隐藏第3-5行forrowinrange(3,6):ws.row_dimensions[row].hidden=Truewb.save("D:\\data\\product.xlsx")3.2 隐藏列
# 隐藏C列和D列ws.column_dimensions['C'].hidden=Truews.column_dimensions['D'].hidden=True3.3 取消隐藏
# 取消隐藏第3-5行forrowinrange(3,6):ws.row_dimensions[row].hidden=False# 取消隐藏C列ws.column_dimensions['C'].hidden=False坑:隐藏行后max_row不包含隐藏行
openpyxl的max_row包含隐藏行。但pandas的read_excel默认不读取隐藏行。如果你隐藏了行又用pandas读取,数据行数可能不一致。
3.4 什么时候需要隐藏行列
- 隐藏辅助计算列,让报表更清爽
- 隐藏不需要展示的数据行
- 隐藏中间过程数据
四、调整列宽和行高
4.1 设置列宽
# 设置A列宽度为20ws.column_dimensions['A'].width=20# 设置B列宽度为30ws.column_dimensions['B'].width=304.2 设置行高
# 设置第1行高度为30ws.row_dimensions[1].height=304.3 自适应列宽
Excel本身有"自适应列宽"功能,但openpyxl不支持直接调用。需要手动计算:
importopenpyxlfromopenpyxl.utilsimportget_column_letter wb=openpyxl.load_workbook("D:\\data\\product.xlsx")ws=wb["Sheet1"]# 遍历每列,找到最大内容长度,设置列宽forcolinrange(1,ws.max_column+1):max_length=0col_letter=get_column_letter(col)forrowinrange(1,ws.max_row+1):cell=ws.cell(row=row,column=col)ifcell.value:# 中文字符算2个宽度value=str(cell.value)length=sum(2iford(c)>127else1forcinvalue)max_length=max(max_length,length)# 列宽 = 最大长度 + 2的余量ws.column_dimensions[col_letter].width=min(max_length+2,50)wb.save("D:\\data\\product.xlsx")坑:中文字符宽度计算
中文字符在Excel中占的宽度大约是英文字符的2倍。如果用len(str)计算列宽,中文内容的列会太窄。用上面的方法,中文字符算2个宽度。
坑:列宽太大
有些单元格内容很长(比如URL),如果按内容设列宽会非常宽。设置一个上限(如50),超过的截断或换行。
4.4 自动换行
内容太长不想列太宽,可以设置自动换行:
fromopenpyxl.stylesimportAlignment# 设置A列所有单元格自动换行forrowinrange(1,ws.max_row+1):ws.cell(row=row,column=1).alignment=Alignment(wrap_text=True)# 设置列宽和行高ws.column_dimensions['A'].width=30五、冻结窗格
5.1 冻结首行
# 冻结首行(第2行开始可以滚动)ws.freeze_panes="A2"[video(video-5zLktKk2-1783502662097)(type-csdn)(url-https://live.csdn.net/v/embed/524993)(image-https://v-blog.csdnimg.cn/asset/a547123d88ad712dccba346c9217e237/cover/Cover0.jpg)(title-TEMU店群如何管理运营?)]5.2 冻结首行首列
# 冻结首行和首列ws.freeze_panes="B2"5.3 冻结多行多列
# 冻结前2行和前3列ws.freeze_panes="D3"5.4 取消冻结
ws.freeze_panes=None什么时候用冻结窗格:
- 生成报表时冻结表头行,方便查看
- 冻结ID列,滚动时始终可见
六、行列操作实战场景
6.1 清理数据表
一个完整的数据清理流程:
importopenpyxlimportpandasaspd# 读取数据df=pd.read_excel("D:\\data\\raw.xlsx")# 1. 删除空行df=df.dropna(how='all')# 2. 删除重复行df=df.drop_duplicates()# 3. 删除指定列(辅助列)df=df.drop(columns=['临时标记','计算用'])# 4. 重置索引df=df.reset_index(drop=True)# 写入新文件df.to_excel("D:\\data\\cleaned.xlsx",index=False)# 5. 用openpyxl调整格式wb=openpyxl.load_workbook("D:\\data\\cleaned.xlsx")ws=wb.active# 自适应列宽forcolinrange(1,ws.max_column+1):max_length=0col_letter=get_column_letter(col)forrowinrange(1,ws.max_row+1):cell=ws.cell(row=row,column=col)ifcell.value:length=sum(2iford(c)>127else1forcinstr(cell.value))max_length=max(max_length,length)ws.column_dimensions[col_letter].width=min(max_length+2,50)# 冻结首行ws.freeze_panes="A2"# 表头加粗fromopenpyxl.stylesimportFontforcolinrange(1,ws.max_column+1):ws.cell(row=1,column=col).font=Font(bold=True)wb.save("D:\\data\\cleaned.xlsx")6.2 在指定位置插入汇总行
wb=openpyxl.load_workbook("D:\\data\\sales.xlsx")ws=wb["Sheet1"]# 找到最后一行数据last_row=ws.max_row# 插入汇总行summary_row=last_row+1ws.cell(row=summary_row,column=1,value="合计")ws.cell(row=summary_row,column=2,value=f"=SUM(B2:B{last_row})")# 汇总行加粗fromopenpyxl.stylesimportFont,PatternFill bold_font=Font(bold=True)gray_fill=PatternFill(start_color="DDDDDD",end_color="DDDDDD",fill_type="solid")forcolinrange(1,ws.max_column+1):cell=ws.cell(row=summary_row,column=col)cell.font=bold_font cell.fill=gray_fill wb.save("D:\\data\\sales.xlsx")6.3 转置数据(行变列、列变行)
importpandasaspd df=pd.read_excel("D:\\data\\data.xlsx")# 转置df_transposed=df.T df_transposed.to_excel("D:\\data\\transposed.xlsx")七、避坑清单
坑1:pandas覆盖格式
pandas的to_excel会覆盖原有格式。需要保留格式的操作用openpyxl逐行逐列修改,不要用pandas覆盖。
坑2:大量insert_rows导致性能差
openpyxl的insert_rows在大数据量时性能很差(因为它要移动所有后续行的数据)。如果需要插入很多行,考虑用pandas处理数据后重新写入。
坑3:隐藏行影响数据读取
pandas的read_excel默认不读隐藏行。如果你隐藏了行又用pandas读取,数据行数会少。设置read_excel的参数来包含隐藏行,或者用openpyxl读取。
坑4:delete_rows后图表引用错位
如果Excel中有图表引用了被删除的行区域,图表数据会错位。删行后检查并更新图表数据源。
坑5:行高列宽单位混淆
openpyxl的列宽单位是字符宽度(大约等于一个数字字符的宽度),行高单位是磅(point)。两者不是像素,不要混用。
