影刀RPA Excel行列操作:插入、删除、隐藏、调整宽高 影刀RPA Excel行列操作插入、删除、隐藏、调整宽高作者林焱Excel操作不只是读写单元格数据。很多时候你需要操作行列结构——插入一行新数据、删除空行、隐藏辅助列、调整列宽让内容完整显示、冻结首行方便查看。这些操作在手动使用Excel时很简单但在RPA自动化中每一步都有坑。这篇文章把Excel行列操作的常用场景和正确方法讲全。一、插入行和列1.1 插入行【插入Excel行】 文件路径D:\data\product.xlsx Sheet名Sheet1 插入位置第3行 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ce27cb18c8ae439386dfc8b51da26d65.png#pic_center) 插入行数1用Python操作importopenpyxl wbopenpyxl.load_workbook(D:\\data\\product.xlsx)wswb[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_column1):source_cellws.cell(row2,columncol)target_cellws.cell(row3,columncol)ifsource_cell.has_style:target_cell.fontcopy(source_cell.font)target_cell.bordercopy(source_cell.border)target_cell.fillcopy(source_cell.fill)target_cell.number_formatsource_cell.number_format1.2 插入列# 在第B列前插入一列ws.insert_cols(2)# 在第B列前插入2列ws.insert_cols(2,2)1.3 批量插入多行数据在数据末尾批量追加多行importopenpyxl wbopenpyxl.load_workbook(D:\\data\\product.xlsx)wswb[Sheet1]# 找到最后一行last_rowws.max_row# 批量追加new_dataget_variable(new_data_list)forrow_datainnew_data:last_row1forcol_idx,valueinenumerate(row_data,1):ws.cell(rowlast_row,columncol_idx,valuevalue)wb.save(D:\\data\\product.xlsx)用pandas更简洁importpandasaspd# 读取原有数据df_oldpd.read_excel(D:\\data\\product.xlsx)df_newpd.DataFrame(get_variable(new_data_list))# 合并df_allpd.concat([df_old,df_new],ignore_indexTrue)# 写回df_all.to_excel(D:\\data\\product.xlsx,indexFalse)二、删除行和列拼多多店群自动化上架方案2.1 删除行【删除Excel行】 文件路径D:\data\product.xlsx Sheet名Sheet1 起始行第5行 删除行数1用Python# 删除第5行ws.delete_rows(5)# 删除第5-7行3行![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ac67657d67c64af08c222e77094ef21f.png#pic_center)ws.delete_rows(5,3)2.2 删除空行数据中间有大量空行需要清理importopenpyxl wbopenpyxl.load_workbook(D:\\data\\product.xlsx)wswb[Sheet1]# 从下往上遍历删除空行forrowinrange(ws.max_row,1,-1):# 检查整行是否为空is_emptyTrueforcolinrange(1,ws.max_column1):ifws.cell(rowrow,columncol).valueisnotNone:is_emptyFalsebreakifis_empty:ws.delete_rows(row)wb.save(D:\\data\\product.xlsx)坑从上往下删除导致行号错位删除一行后下面的行会上移行号变化。如果从上往下遍历删除会跳过一些行。必须从下往上删。坑删行后合并单元格错乱删除包含合并单元格的行合并范围可能错乱。删行后检查合并单元格的范围是否正确必要时手动调整。2.3 按条件删除行删除满足条件的行比如删除状态为已下架的行importpandasaspd dfpd.read_excel(D:\\data\\product.xlsx)# 删除状态为已下架的行dfdf[df[状态]!已下架]# 写回df.to_excel(D:\\data\\product.xlsx,indexFalse)用pandas按条件删除比openpyxl逐行删快得多适合大数据量。2.4 删除列# 删除第C列ws.delete_cols(3)# 删除第C-D列2列ws.delete_cols(3,2)三、隐藏和显示行列3.1 隐藏行importopenpyxl wbopenpyxl.load_workbook(D:\\data\\product.xlsx)wswb[Sheet1]# 隐藏第3-5行forrowinrange(3,6):ws.row_dimensions[row].hiddenTruewb.save(D:\\data\\product.xlsx)3.2 隐藏列# 隐藏C列和D列ws.column_dimensions[C].hiddenTruews.column_dimensions[D].hiddenTrue3.3 取消隐藏# 取消隐藏第3-5行forrowinrange(3,6):ws.row_dimensions[row].hiddenFalse![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/31b9066e37cd43808acf3fdf89046d8a.png#pic_center)# 取消隐藏C列ws.column_dimensions[C].hiddenFalse坑隐藏行后max_row不包含隐藏行openpyxl的max_row包含隐藏行。但pandas的read_excel默认不读取隐藏行。如果你隐藏了行又用pandas读取数据行数可能不一致。3.4 什么时候需要隐藏行列隐藏辅助计算列让报表更清爽隐藏不需要展示的数据行隐藏中间过程数据四、调整列宽和行高4.1 设置列宽# 设置A列宽度为20ws.column_dimensions[A].width20# 设置B列宽度为30ws.column_dimensions[B].width304.2 设置行高# 设置第1行高度为30ws.row_dimensions[1].height304.3 自适应列宽Excel本身有自适应列宽功能但openpyxl不支持直接调用。需要手动计算importopenpyxlfromopenpyxl.utilsimportget_column_letter wbopenpyxl.load_workbook(D:\\data\\product.xlsx)wswb[Sheet1]# 遍历每列找到最大内容长度设置列宽forcolinrange(1,ws.max_column1):max_length0col_letterget_column_letter(col)forrowinrange(1,ws.max_row1):cellws.cell(rowrow,columncol)ifcell.value:# 中文字符算2个宽度valuestr(cell.value)lengthsum(2iford(c)127else1forcinvalue)max_lengthmax(max_length,length)# 列宽 最大长度 2的余量ws.column_dimensions[col_letter].widthmin(max_length2,50)wb.save(D:\\data\\product.xlsx)坑中文字符宽度计算中文字符在Excel中占的宽度大约是英文字符的2倍。如果用len(str)计算列宽中文内容的列会太窄。用上面的方法中文字符算2个宽度。坑列宽太大有些单元格内容很长比如URL如果按内容设列宽会非常宽。设置一个上限如50超过的截断或换行。4.4 自动换行内容太长不想列太宽可以设置自动换行fromopenpyxl.stylesimportAlignment# 设置A列所有单元格自动换行forrowinrange(1,ws.max_row1):ws.cell(rowrow,column1).alignmentAlignment(wrap_textTrue)# 设置列宽和行高ws.column_dimensions[A].width30五、冻结窗格5.1 冻结首行# 冻结首行第2行开始可以滚动ws.freeze_panesA2[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_panesB25.3 冻结多行多列# 冻结前2行和前3列ws.freeze_panesD35.4 取消冻结ws.freeze_panesNone什么时候用冻结窗格生成报表时冻结表头行方便查看冻结ID列滚动时始终可见六、行列操作实战场景6.1 清理数据表一个完整的数据清理流程importopenpyxlimportpandasaspd# 读取数据dfpd.read_excel(D:\\data\\raw.xlsx)# 1. 删除空行dfdf.dropna(howall)# 2. 删除重复行dfdf.drop_duplicates()# 3. 删除指定列辅助列dfdf.drop(columns[临时标记,计算用])# 4. 重置索引dfdf.reset_index(dropTrue)# 写入新文件df.to_excel(D:\\data\\cleaned.xlsx,indexFalse)# 5. 用openpyxl调整格式wbopenpyxl.load_workbook(D:\\data\\cleaned.xlsx)wswb.active# 自适应列宽forcolinrange(1,ws.max_column1):max_length0col_letterget_column_letter(col)forrowinrange(1,ws.max_row1):cellws.cell(rowrow,columncol)ifcell.value:lengthsum(2iford(c)127else1forcinstr(cell.value))max_lengthmax(max_length,length)ws.column_dimensions[col_letter].widthmin(max_length2,50)# 冻结首行ws.freeze_panesA2# 表头加粗fromopenpyxl.stylesimportFontforcolinrange(1,ws.max_column1):ws.cell(row1,columncol).fontFont(boldTrue)wb.save(D:\\data\\cleaned.xlsx)6.2 在指定位置插入汇总行wbopenpyxl.load_workbook(D:\\data\\sales.xlsx)wswb[Sheet1]# 找到最后一行数据last_rowws.max_row# 插入汇总行summary_rowlast_row1ws.cell(rowsummary_row,column1,value合计)ws.cell(rowsummary_row,column2,valuefSUM(B2:B{last_row}))# 汇总行加粗fromopenpyxl.stylesimportFont,PatternFill bold_fontFont(boldTrue)gray_fillPatternFill(start_colorDDDDDD,end_colorDDDDDD,fill_typesolid)forcolinrange(1,ws.max_column1):cellws.cell(rowsummary_row,columncol)cell.fontbold_font cell.fillgray_fill wb.save(D:\\data\\sales.xlsx)6.3 转置数据行变列、列变行importpandasaspd dfpd.read_excel(D:\\data\\data.xlsx)# 转置df_transposeddf.T df_transposed.to_excel(D:\\data\\transposed.xlsx)七、避坑清单坑1pandas覆盖格式pandas的to_excel会覆盖原有格式。需要保留格式的操作用openpyxl逐行逐列修改不要用pandas覆盖。坑2大量insert_rows导致性能差openpyxl的insert_rows在大数据量时性能很差因为它要移动所有后续行的数据。如果需要插入很多行考虑用pandas处理数据后重新写入。坑3隐藏行影响数据读取pandas的read_excel默认不读隐藏行。如果你隐藏了行又用pandas读取数据行数会少。设置read_excel的参数来包含隐藏行或者用openpyxl读取。坑4delete_rows后图表引用错位如果Excel中有图表引用了被删除的行区域图表数据会错位。删行后检查并更新图表数据源。坑5行高列宽单位混淆openpyxl的列宽单位是字符宽度大约等于一个数字字符的宽度行高单位是磅point。两者不是像素不要混用。