如何用Python xlwings在Excel循环中逐行插入数据而非覆盖
解决Excel循环写入时覆盖数据的问题
你的核心问题是每次循环都固定写入A1单元格,导致数据被覆盖。要实现逐行插入新数据,只需跟踪写入的行号,动态调整写入位置即可,以下是两种适配你现有代码的解决方案:
方案一:初始化行号逐行写入(适合空表或从头开始写)
loadfile1 = pd.read_excel(File1) loadfile2 = pd.read_excel(File2) l = loadfile1.values.tolist() m = loadfile2.values.tolist() A = wx.Book(CompFile) sheet = A.sheets['Source'] # 提前获取工作表,避免循环内重复调用 current_row = 1 # 起始行号,从第1行开始 for row in l: if row in m: print('passed') # 动态生成当前行的单元格范围,覆盖row对应长度的列 sheet.range(f'A{current_row}:{chr(64 + len(row))}{current_row}').value = row current_row += 1 # 行号自增,下次写入下一行
方案二:基于已有数据的最后一行写入(适合表中已有数据的场景)
如果你的Source工作表已经有数据,需要接着已有内容往下写,可以先获取已使用的最后一行行号:
loadfile1 = pd.read_excel(File1) loadfile2 = pd.read_excel(File2) l = loadfile1.values.tolist() m = loadfile2.values.tolist() A = wx.Book(CompFile) sheet = A.sheets['Source'] # 获取已使用区域的最后一行,若无数据则从第1行开始 last_row = sheet.used_range.rows.count if sheet.used_range.rows.count > 0 else 1 for row in l: if row in m: print('passed') sheet.range(f'A{last_row}:{chr(64 + len(row))}{last_row}').value = row last_row += 1
更简洁的Pandas批量写入方案
如果不需要逐行打印状态,用Pandas批量处理效率更高,直接筛选匹配行后一次性写入:
loadfile1 = pd.read_excel(File1) loadfile2 = pd.read_excel(File2) # 筛选出loadfile1中存在于loadfile2的行 matched_rows = loadfile1[loadfile1.apply(lambda x: x.tolist() in loadfile2.values.tolist(), axis=1)] # 追加写入到Excel的Source工作表 with pd.ExcelWriter(CompFile, mode='a', if_sheet_exists='overlay') as writer: startrow = writer.sheets['Source'].max_row # 获取已有数据的最后一行 matched_rows.to_excel(writer, sheet_name='Source', startrow=startrow, index=False, header=False)
内容的提问来源于stack exchange,提问作者Smith
相关产品推荐
相关产品推荐

