如何用Openpyxl将表格姓名分类到另一表格不同列并解决空行问题
解决Openpyxl姓名分类时的空行问题
问题根源
你当前的代码三次遍历原表格,每次用ws.append()往对应列追加数据,但append()会从工作表当前最后一行开始写入,导致男性列写完后,女性列从男性列的最后一行开始填充,中间自然出现大量空行。
优化方案一:先分类收集数据,再统一写入
先将三类姓名分别存入三个列表,根据最长列表的长度给较短列表补空字符串,最后逐行把三个列表的对应元素组成整行写入,从根源避免空行。
示例代码:
load_sheet = IMPORTED_TABLE["List1"] men_names = [] women_names = [] unknown_names = [] # 一次遍历完成分类收集 for row in load_sheet.values: for value in row: first_name = value.split(" ")[0] if first_name in NAME_LIST.men: men_names.append(value) elif first_name in NAME_LIST.women: women_names.append(value) else: unknown_names.append(value) # 确定最长列表长度,补全短列表 max_length = max(len(men_names), len(women_names), len(unknown_names)) men_names += [""] * (max_length - len(men_names)) women_names += [""] * (max_length - len(women_names)) unknown_names += [""] * (max_length - len(unknown_names)) # 逐行写入工作表 for m, w, u in zip(men_names, women_names, unknown_names): ws.append([m, w, u])
优化方案二:直接定位单元格写入
一次遍历原表格,同时维护三个计数器记录每类姓名的当前行号,直接写入对应列的指定单元格,完全避开空行问题。
示例代码:
load_sheet = IMPORTED_TABLE["List1"] men_row = 1 women_row = 1 unknown_row = 1 for row in load_sheet.values: for value in row: first_name = value.split(" ")[0] if first_name in NAME_LIST.men: ws.cell(row=men_row, column=1, value=value) men_row += 1 elif first_name in NAME_LIST.women: ws.cell(row=women_row, column=2, value=value) women_row += 1 else: ws.cell(row=unknown_row, column=3, value=value) unknown_row += 1
关于删除已存在的空单元格
Openpyxl没有直接删除空单元格的函数,但可以通过遍历删除空行(从后往前删避免索引错乱),不过这种方法不如从源头避免空行高效:
# 删除工作表中的空行 for row in range(ws.max_row, 0, -1): if all(cell.value is None for cell in ws[row]): ws.delete_rows(row)
内容的提问来源于stack exchange,提问作者user24153075
相关产品推荐
相关产品推荐

