如何使用xlwings对比Excel工作表行并执行新增与strikethrough操作
用xlwings实现Excel工作表数据同步与格式设置
核心思路
先提取两个工作表中AVLevel和Description的组合键,通过对比两组组合键,分别处理两种场景:
- 将Sheet B独有的组合数据插入Sheet A末尾
- 给Sheet A独有的组合数据所在行添加删除线格式
实现代码
import xlwings as xw # 替换为你的Excel文件路径 file_path = "你的文件路径.xlsx" with xw.Book(file_path) as wb: sheet_a = wb.sheets["Sheet A"] sheet_b = wb.sheets["Sheet B"] # 获取Sheet A的数据范围(假设表头在第1行,数据从第2行开始) a_data = sheet_a.used_range.value # 提取Sheet A的(AVLevel+Description)组合键,同时记录对应的Excel行号 a_combinations = {} for row_idx in range(1, len(a_data)): # 跳过表头行(索引0) av_level = a_data[row_idx][0] # 假设AVLevel在第1列(Python索引0) desc = a_data[row_idx][1] # 假设Description在第2列(Python索引1) if av_level and desc: # 跳过空行 combo = f"{av_level}_{desc}" a_combinations[combo] = row_idx + 1 # 转换为Excel实际行号(从1开始) # 获取Sheet B的数据范围,提取组合键集合 b_data = sheet_b.used_range.value b_combinations = set() for row_idx in range(1, len(b_data)): av_level = b_data[row_idx][0] desc = b_data[row_idx][1] if av_level and desc: combo = f"{av_level}_{desc}" b_combinations.add(combo) # 处理场景1:Sheet B有但Sheet A没有的组合,插入Sheet A末尾 last_row_a = sheet_a.used_range.last_cell.row for row_idx in range(1, len(b_data)): av_level = b_data[row_idx][0] desc = b_data[row_idx][1] if av_level and desc: combo = f"{av_level}_{desc}" if combo not in a_combinations: last_row_a += 1 # 复制Sheet B当前行的内容和格式到Sheet A新行 sheet_b.range(row_idx+1, 1).expand("right").copy(sheet_a.range(last_row_a, 1)) # 处理场景2:Sheet A有但Sheet B没有的组合,给该行加删除线 for combo, row_num in a_combinations.items(): if combo not in b_combinations: # 给整行有效数据添加删除线格式,不破坏原有格式 sheet_a.range(row_num, 1).expand("right").api.Font.Strikethrough = True # 保存修改 wb.save()
关键细节说明
- 列索引调整:代码中默认
AVLevel在第1列、Description在第2列,若你的表格列位置不同,需修改对应索引值。 - 格式保留:插入新行时直接复制Sheet B行的内容和格式;设置删除线仅修改字体属性,不影响单元格原有填充、边框等格式。
- 空行过滤:跳过
AVLevel或Description为空的行,避免无效对比。 - 行号转换:注意Python列表索引(从0开始)和Excel行号(从1开始)的对应关系。
内容的提问来源于stack exchange,提问作者OakleyLee
相关产品推荐
相关产品推荐

