如何用Openpyxl的iter_rows为指定列批量赋值并匹配列行数?
解决Openpyxl赋值列与指定列行数匹配的问题
让我帮你排查代码里的问题,同时实现你需要的功能——给第7列(G列)赋值,且行数和第6列(F列)的有效行数保持一致:
原代码的核心问题
- 单元格对象误用为行号:你在循环里写了
ws.cell(row=cell, column=7),这里的cell是openpyxl的单元格对象,不是行号数值,直接这么用会触发类型错误。其实你已经在遍历G列的单元格了,直接给cell.value = 'BMA'就行。 - 未匹配第6列的有效行数:原代码用
ws.max_row取的是整个工作表的最大行,但如果第6列最后几行是空的,这会导致G列多赋值,不符合你的需求。我们需要单独找到第6列最后一个有数据的行号。 - 潜在风险:用openpyxl保存CSV:Openpyxl专门处理Excel的
.xlsx/.xlsm格式,直接保存为.csv可能出现格式错乱、编码异常等问题,更推荐先存为xlsx,再按需转CSV。
修正后的代码(保存为xlsx,推荐)
import openpyxl # 加载目标工作簿和工作表 wb = openpyxl.load_workbook(filename=r'C:\Users\.spyder-py3\data\BMA.xlsx') ws = wb.worksheets[0] # 找到第6列(F列)的最后一个有效行号 last_valid_row = ws.max_row # 从下往上遍历,确保找到的是F列真正有数据的最后一行 for row in range(ws.max_row, 0, -1): if ws.cell(row=row, column=6).value is not None: last_valid_row = row break # 给第7列(G列)对应行赋值 for row_num in range(ws.min_row, last_valid_row + 1): ws.cell(row=row_num, column=7).value = 'BMA' # 保存修改后的Excel文件 wb.save(r'C:\Users\.spyder-py3\data\BMA_updated.xlsx') wb.close()
如果需要保存为CSV格式
如果确实需要输出CSV,可以借助pandas快速转换(需要先安装依赖:pip install pandas openpyxl):
import pandas as pd # 读取修改后的xlsx文件 df = pd.read_excel(r'C:\Users\.spyder-py3\data\BMA_updated.xlsx') # 保存为CSV,避免中文乱码用utf-8-sig编码 df.to_csv(r'C:\Users\.spyder-py3\data\BMA_updated.csv', index=False, encoding='utf-8-sig')
内容的提问来源于stack exchange,提问作者Yousuf
相关产品推荐
相关产品推荐

