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

openpyxl多Excel文件单元格求和报TypeError解决方法

多Excel同位置单元格求和报错问题

需求说明

  • 需要对多个格式完全一致、仅单元格具体数值存在差异的Excel文件,做对应位置单元格的数值求和计算
  • Excel结构示例:
    Excel表结构示例

初始实现代码

from openpyxl import load_workbook
from openpyxl import Workbook
import os
import shutil   

abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
os.chdir(dname)

file_path= os.getcwd()
file_format = ".xlsx"
file_list = [f"{file}" for file in os.listdir(file_path) if file_format in file]

shutil.copy(file_list[0], 'result_sehyun.xlsx')

# col_range = ['B','C','D','E','F','G','H']
# row_range = ['4','5','6','7','8','9','10','11','12','13','14','15','16']
wb_to = load_workbook('result_sehyun.xlsx')
sheet_list_to = wb_to.sheetnames
for file in file_list[1:]: 
    wb_from = load_workbook(file)
    sheet_list_from = wb_from.sheetnames 
    for sheet_from in sheet_list_from:
        for sheet_to in sheet_list_to: 
            ws_to = wb_to[sheet_to] 
            ws_from = wb_from[sheet_from] 
            for row in range(4,17):
                for col in range(2,9): 
                    ws_to.cell(row, col).value = ws_to.cell(row, col).value + ws_from.cell(row, col).value
            # for col in col_range:
            #     for row in row_range:
            #         ws_to[col+row] = ws_to[col+row].value + ws_from[col+row].value

触发报错

运行代码后抛出如下类型错误:

Traceback (most recent call last):
File "c:\Sehyun\Sehyun.py", line 33, in 
ws_to.cell(row, col).value = ws_to.cell(row, col).value + ws_from.cell(row, col).value
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

问题原因与修复方案

原因确认

你对报错的猜测完全正确:

  • 报错核心原因是遍历计算时读到了空单元格,openpyxl中空单元格的返回值为None,整数类型无法和None直接做加法运算,因此触发类型错误。
  • 原代码还存在一个逻辑隐患:工作表遍历用了双层嵌套循环,会把来源文件的每个工作表和目标文件的每个工作表交叉匹配计算,一旦两个文件的工作表顺序不一致,就会出现跨表错加的问题。
  • 原代码最后没有调用保存方法,所有内存中的修改不会写入到结果文件。

修复后代码

修复点如下:

  • 单元格取值时增加空值判断,空值统一按0参与计算
  • 调整工作表遍历逻辑,按工作表名一一对应计算,避免跨表错配
  • 增加文件过滤规则,排除生成的结果文件本身,避免重复累加
  • 加载工作簿时增加data_only=True参数,读取公式计算后的实际值
  • 增加结果保存逻辑,确保修改写入磁盘
from openpyxl import load_workbook
import os
import shutil   

abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
os.chdir(dname)

file_path = os.getcwd()
file_format = ".xlsx"
# 过滤文件时排除生成的结果文件,避免重复计算
file_list = [f for f in os.listdir(file_path) if f.endswith(file_format) and f != 'result_sehyun.xlsx']

# 复制第一个文件作为求和结果的模板
shutil.copy(file_list[0], 'result_sehyun.xlsx')

wb_to = load_workbook('result_sehyun.xlsx')
sheet_list_to = wb_to.sheetnames

for file in file_list[1:]: 
    # data_only=True 读取单元格实际计算值,而非公式字符串
    wb_from = load_workbook(file, data_only=True)
    # 按工作表名一一对应匹配,避免交叉遍历错配
    for sheet_name in sheet_list_to:
        ws_to = wb_to[sheet_name] 
        ws_from = wb_from[sheet_name] 
        # 遍历需要求和的B-H列、4-16行
        for row in range(4,17):
            for col in range(2,9):
                # 空值统一按0处理
                val_to = ws_to.cell(row, col).value or 0
                val_from = ws_from.cell(row, col).value or 0
                # 校验值为数字类型时再累加,避免文本单元格触发报错
                if isinstance(val_to, (int, float)) and isinstance(val_from, (int, float)):
                    ws_to.cell(row, col).value = val_to + val_from

# 保存计算结果
wb_to.save('result_sehyun.xlsx')

提示:如果你的单元格存在文本格式的数字,可以在取值后先做类型转换再累加,避免类型错误。

内容的提问来源于stack exchange,提问作者Daniel.DH.Choi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:09:23