Python实现Excel库存自动更新:解决单元格遍历与计数问题
问题修正与代码实现
错误原因分析
你遇到的cell is not iterable错误,是因为ws[char + str(row)]获取的是单个单元格对象,而非可迭代的单元格范围,所以不能用for x in crossover_cells来遍历。
功能实现思路
- 解析输入的商品缩写:从
merchpurchased中拆分出商品类型(如h代表连帽衫)、颜色(如r代表红色)、尺码(如l转为大写L) - 遍历目标行范围,匹配对应类型、颜色、尺码的记录
- 找到匹配的尺码单元格后,向右偏移2列定位到「已售数量」列,将该单元格数值+1(处理空值默认设为0)
- 最后保存工作簿,确保修改生效
修正后的完整代码
from openpyxl import load_workbook from openpyxl.utils import get_column_letter # 加载工作簿,data_only=True确保读取单元格的计算后数值 wb = load_workbook('C:/Users/Angela Shen/Downloads/Python gc merch project.xlsx', data_only=True) ws = wb.active def inventory_update(merchpurchased): # 输入验证:确保缩写长度符合要求且包含连帽衫标识 if len(merchpurchased) < 3 or 'h' not in merchpurchased.lower(): print("无效输入,请输入格式正确的商品缩写(如hrl代表连帽衫、红色、L码)") return # 解析缩写:拆分类型、颜色、尺码(统一转大小写匹配Excel内容) merch_type = merchpurchased[0].lower() color = merchpurchased[1].lower() size = merchpurchased[2].upper() # 遍历目标行范围(原代码指定的3-5行) for row in range(3, 6): # 假设Excel列1=商品类型,列2=颜色,列3=尺码 cell_type = ws.cell(row=row, column=1).value cell_color = ws.cell(row=row, column=2).value cell_size = ws.cell(row=row, column=3).value # 匹配对应商品记录 if cell_type == merch_type and cell_color == color and cell_size == size: # 向右移动2格定位到已售数量列(列3+2=列5) sold_col = 3 + 2 sold_cell = ws.cell(row=row, column=sold_col) # 处理空值:若单元格为空,默认从0开始累加 current_sold = sold_cell.value if sold_cell.value is not None else 0 sold_cell.value = current_sold + 1 print(f"已更新:连帽衫-{color}-{size} 已售数量+1") # 找到唯一匹配项后退出循环 break else: print("未找到对应商品的库存记录") # 保存修改到Excel文件 wb.save('C:/Users/Angela Shen/Downloads/Python gc merch project.xlsx') inventory_update('hrl')
关键改动说明
- 移除未使用的
numpy依赖,简化代码结构 - 增加输入验证逻辑,提前拦截无效输入
- 使用
ws.cell(row, column)精准定位单元格,替代字符串拼接方式,更易维护 - 处理单元格空值场景,避免
None + 1的报错 - 新增操作提示,方便确认修改结果
- 补充工作簿保存步骤,确保修改写入文件
内容的提问来源于stack exchange,提问作者Angela Shen
相关产品推荐
相关产品推荐

