You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:17:45