openpyxl多Excel文件单元格求和报TypeError解决方法
多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
相关产品推荐
相关产品推荐

