使用xlwings实现Python向Excel多单元格输出不同值的问题
xlwings按条件写入Excel不同单元格问题解决
问题描述
我想通过Python的xlwings库,让if语句的输出根据partnum_list中x值的变化,写入Excel的多个单元格并对应不同值。但当前脚本会把相同内容批量写入指定的单元格区域,无法实现按x值对应不同单元格的需求。
问题分析
当前代码的核心问题在于:
- 写入Excel时直接给整个单元格区域赋值(如
out_sheet.range('D3:D155').value = partnum_list[x]),导致所有单元格被设为同一个值 - 循环内部重复定义
replenishment函数,属于冗余操作
修改后的代码
#this is where the f***in' magic happens! import xlwings as xw # 定义输出函数,移到循环外部避免重复定义 def replenishment(part_num, r_tot, ppb, r_rep, curr_dist, panel_rep): print("") print("*********************************************") print(f'P#: {part_num}') print(f"Replenishment will occur at (panels): {round((r_tot/ppb)-(r_rep/ppb))}") print(f"Replenishment will occur at (parts remaining): {r_rep}") print("") print(f"Current distance to replemishment (panels): {round(curr_dist/ppb)}") print(f"Current distance to replemishment (parts remaining): {curr_dist}") print("") print(f"Current time until replemishment (min): {round((curr_dist / ppb) * panel_rep)}") print("*********************************************") # 打开工作簿 wb = xw.Book('ROT Replenishment Schedule - no replenishments.xlsx') wb_output = xw.Book('PytoExcelTestShit.xlsx') out_sheet = wb_output.sheets[0] rep_sheet = wb.sheets[1] # 输入当前面板数 p_num_in = input("What panel are you at? ") p_num = float(p_num_in) # 读取数据列表 reel_tot_list = rep_sheet.range('A2:A155').value partnum_list = rep_sheet.range('E2:E155').value ppb_list = rep_sheet.range('G2:G155').value # 时间(分钟)到补货点 t_rep = 15 # 补货触发时的面板数 panel_rep = t_rep / 3 # 循环遍历数据(列表索引从0开始,对应Excel行2-155) for x in range(len(reel_tot_list)): # 获取当前行的参数 r_tot = reel_tot_list[x] ppb = ppb_list[x] part_num = partnum_list[x] # 计算补货时的 reel 数量 r_rep = abs(((r_tot / ppb) - panel_rep) * ppb - r_tot) # 计算到补货点的剩余量 curr_dist = (r_tot - (ppb * p_num)) - r_rep # 判断是否触发补货提醒 time_until_rep = round((curr_dist / ppb) * panel_rep) if 0 <= time_until_rep <= 6: # 写入对应行的单个单元格,x是列表索引,对应Excel行x+2(因为原数据从A2开始) out_sheet.range(f'D{x+2}').value = part_num out_sheet.range(f'E{x+2}').value = 'REPLENISH NOW' # 调用输出函数 replenishment(part_num, r_tot, ppb, r_rep, curr_dist, panel_rep)
关键修改点
- 将
replenishment函数移至循环外部,避免每次循环重复定义函数 - 改用
for循环遍历数据列表,更直观且避免索引越界问题 - 写入Excel时改为操作单个单元格(通过
f'D{x+2}'动态计算单元格位置),确保每个满足条件的part_num写入对应行 - 优化变量传递,将
partnum_list[x]作为参数传入函数,避免依赖外部变量
内容的提问来源于stack exchange,提问作者Levi W.
相关产品推荐
相关产品推荐

