使用openpyxl匹配Excel行列头取值并计算指定普查区域属性总和
普查区域Excel数据提取与求和实现
核心思路
- 提前定位所有目标表头的列位置,减少重复遍历开销
- 逐行匹配普查区域标识码,匹配成功后直接读取对应列的数值累加
- 最终返回每个搜索字段的求和结果,也可扩展输出单个区域的对应属性值
完整可运行代码
from openpyxl import load_workbook # 加载Excel文件,请替换为你的实际文件路径 wb = load_workbook("你的普查数据文件路径.xlsx") # 取第一个工作表,你也可以指定工作表名如wb["Sheet1"] ws = wb.active # 获取用户输入的普查区域 inputTracts = input("Enter tract number(s): ") inputTracts = inputTracts.split(', ') # 如果Excel里普查标识码是数字类型,打开下面的注释把输入转成int,避免类型不匹配导致匹配失败 # inputTracts = [int(t) for t in inputTracts] # 指定要查询的表头 searchTerms = ['pop', 'pop60', 'unempl', 'lbrforce', 'hs', 'col', 'pov'] def calc_tract_sum(worksheet): # 第一步:先找每个搜索字段对应的列索引,key是字段名,value是列号(openpyxl行列从1开始计数) header_col = {} # 遍历第一行表头 for col in range(1, worksheet.max_column + 1): cell_val = worksheet.cell(row=1, column=col).value if cell_val in searchTerms: header_col[cell_val] = col # 校验缺失的表头 missing_terms = [t for t in searchTerms if t not in header_col] if missing_terms: raise ValueError(f"找不到以下表头:{missing_terms}") # 初始化结果字典,每个字段初始总和为0 sum_result = {term:0 for term in searchTerms} # 如果需要存储单个区域的属性值,打开下面的注释即可 # single_result = {tract:{term:None for term in searchTerms} for tract in inputTracts} # 第二步:遍历所有数据行(从第二行开始,第一行是表头) for row in range(2, worksheet.max_row + 1): # 第一列是普查区域标识码 tract_id = worksheet.cell(row=row, column=1).value if tract_id in inputTracts: # 遍历所有要搜索的字段,累加数值 for term in searchTerms: col = header_col[term] val = worksheet.cell(row=row, column=col).value # 处理空值,避免加None报错 val = val if val is not None else 0 sum_result[term] += val # 存储单个区域值的逻辑,需要的话打开注释 # single_result[tract_id][term] = val # 如果需要按searchTerms的固定顺序返回列表,可使用下面的代码 # sum_list = [sum_result[term] for term in searchTerms] # return sum_list, single_result return sum_result # 调用函数获取结果 result = calc_tract_sum(ws) # 打印结果 for term, total in result.items(): print(f"{term} 总和:{total}")
注意事项
- 可根据实际需求调整空值的处理逻辑,当前默认空单元格按0计算
- 如果需要导出单个区域的属性值,打开代码中对应注释的部分即可获取对应数据
内容的提问来源于stack exchange,提问作者adonak
相关产品推荐
相关产品推荐

