基于Python+openpyxl的支出录入算法编写求助
解决方案
核心思路思路
用户输入拆分后会得到[物品1, 价格1, 物品2, 价格2,...]格式的列表,只需成对提取物品和价格,再按行写入Excel的B列(物品)和D列(价格),从第3行开始即可。
完整代码实现
from openpyxl import load_workbook # 示例用户输入 int_spending = "苹果:10:香蕉:8:牛奶:15" # 拆分输入字符串 items_prices = int_spending.split(':') # 校验输入格式是否合法(物品和价格需成对出现) if len(items_prices) % 2 != 0: print("输入格式错误,请按照「物品:价格:物品:价格……」的格式输入") else: # 加载目标Excel工作簿(若文件不存在,可改用Workbook()创建新文件) wb = load_workbook("支出记录.xlsx") ws = wb.active # 获取当前活动工作表 # 循环处理每一组物品和价格,从第3行开始写入 for idx in range(0, len(items_prices), 2): row_num = 3 + (idx // 2) # 计算当前行号:从第3行起步,每一组数据加1行 item = items_prices[idx] price = items_prices[idx + 1] # 写入对应单元格:B列存物品,D列存价格 ws[f"B{row_num}"] = item ws[f"D{row_num}"] = price # 保存修改后的工作簿 wb.save("支出记录.xlsx") print("数据写入完成")
更简便的成对处理写法
可以用zip配合切片直接分组,代码更简洁:
# 替代上述循环部分的写法 for row_num, (item, price) in enumerate(zip(items_prices[::2], items_prices[1::2]), start=3): ws[f"B{row_num}"] = item ws[f"D{row_num}"] = price
items_prices[::2]:提取所有偶数索引的元素(即所有物品)items_prices[1::2]:提取所有奇数索引的元素(即所有价格)enumerate(..., start=3):直接从第3行开始计数行号,无需手动计算
关键细节说明
- 格式校验:先判断拆分后的列表长度是否为偶数,避免用户输入不完整(比如只输了物品没输价格)。
- 单元格定位:用
f"B{row_num}"的字符串格式化方式,比ws.cell(row=row_num, column=2)更直观(B列对应第2列,D列对应第4列)。 - 工作簿操作:如果是新建Excel文件,把
load_workbook换成Workbook()即可,记得最后保存。
内容的提问来源于stack exchange,提问作者Fail Exotic
相关产品推荐
相关产品推荐

