Python实现Excel指定字符串行跨工作簿迁移及报错解决
问题解决:提取Excel匹配行并写入新文件
错误原因分析
你遇到的AttributeError: 'int' object has no attribute 'value'是因为混用了Pandas和OpenPyXL的逻辑:
- 用Pandas的
pd.read_excel()读取文件后得到的是DataFrame对象,它的iterrows()返回的是(行索引, 行数据Series)的元组,不是OpenPyXL的单元格对象 - 循环中第一个
cell是行索引(整数类型),自然没有value属性,导致报错
正确实现方案
方案一:纯Pandas实现(推荐,简洁高效)
Pandas原生支持筛选和Excel写入,完全不需要混用OpenPyXL,代码更易维护:
import pandas as pd # 读取源Excel文件 df = pd.read_excel("file1.xlsx", sheet_name="Sheet1") # 筛选Column B中包含"Wave 01"的行,写入file2.xlsx wave01_data = df[df["Column B"].str.contains("Wave 01", na=False)] wave01_data.to_excel("file2.xlsx", index=False) # 筛选Column B中包含"Wave 03"的行,写入file3.xlsx wave03_data = df[df["Column B"].str.contains("Wave 03", na=False)] wave03_data.to_excel("file3.xlsx", index=False)
关键说明:
str.contains("Wave 01"):匹配单元格中包含目标字符串的行,适配你的示例数据(如"Wave 01 section A");如果需要精确匹配(单元格内容完全等于"Wave 01"),替换为df["Column B"] == "Wave 01"na=False:跳过空值行,避免因空值引发的报错index=False:不将Pandas的行索引写入Excel,保持和源文件一致的格式
方案二:纯OpenPyXL实现(适合保留原Excel格式)
如果源文件有复杂格式(如单元格样式、合并单元格)需要保留,可使用纯OpenPyXL操作:
from openpyxl import load_workbook # 加载源工作簿和工作表 source_wb = load_workbook("file1.xlsx") source_ws = source_wb["Sheet1"] # 处理Wave 01数据写入file2.xlsx target_wb1 = load_workbook("file2.xlsx") target_ws1 = target_wb1.active # 复制源文件的表头行(前2行),如果file2.xlsx已有表头可跳过此段 for row in source_ws.iter_rows(min_row=1, max_row=2): target_ws1.append([cell.value for cell in row]) # 遍历源数据行,筛选匹配行写入 for row in source_ws.iter_rows(min_row=3): # 从第3行开始是实际数据 cell_values = [cell.value for cell in row] # 检查Column B(第2列,索引为1)是否包含目标字符串 if "Wave 01" in str(cell_values[1]): target_ws1.append(cell_values) target_wb1.save("file2.xlsx") # 处理Wave 03数据写入file3.xlsx target_wb2 = load_workbook("file3.xlsx") target_ws2 = target_wb2.active # 复制表头(已有表头可跳过) for row in source_ws.iter_rows(min_row=1, max_row=2): target_ws2.append([cell.value for cell in row]) # 筛选匹配行写入 for row in source_ws.iter_rows(min_row=3): cell_values = [cell.value for cell in row] if "Wave 03" in str(cell_values[1]): target_ws2.append(cell_values) target_wb2.save("file3.xlsx")
关键说明:
- OpenPyXL的
iter_rows()返回的是单元格对象,可通过cell.value获取内容 min_row=3:对应你的示例数据,前2行是表头和分隔线,从第3行开始为实际数据str(cell_values[1]):将单元格内容转为字符串,避免空值导致的报错
内容的提问来源于stack exchange,提问作者Noway_
相关产品推荐
相关产品推荐

