前言
刚刚开始学习python,之前一点编程基础都没有哈哈,正好最近星露谷玩的比较疯,目标是做出一个星露谷全作物包括酿酒等日均收益的可视化计算器,现在一步一步来就是了,以此做个记录,激励自己学习
目标
2021.1.13
运用python计算出春季作物的日均收益表,并且画图放在excel表里
excel表格
目前根据wiki做了春天的excel表格,目标是让L行生成每个作物的日均收益,因为作物存在单次收获和可持续收获两种状态,所以要用不一样的公式
单次收获的公式为:(普通品质售价-种子价格)/长成需要时间
可持续收获的公式为:([(28-目前天数)-长成需要的时间]/持续收获需要的时间的取整+1)*普通品质售价-种子价格
代码
#加载相关模块
import os
import xlwings as xw
import numpy as nm
import pandas as pd
import matplotlib.pyplot as plt
app = xw.App(visible=False, add_book=False)
file_path = 'd:\\python_study\\xinglugu.xlsx' #定义文件路径
workbook = app.books.open(file_path)
wsh1 = workbook.sheets['chun'] #定义需要用的工作表
day = int(input('请输入目前的天数')) #用input交互获得目前的天数,用于后面公式的计算
#公式需要循环获得每个单元格的值,定义各个变量,注意此处用f-string方式格式化变量,否则会报错
i = 2
while wsh1.range(f"B{i}").value is not None: #此处意指判定B列值为空时停止循环,注意判定为空值用None
Bi = wsh1.range(f"B{i}").value #定义变量
Ci = wsh1.range(f"C{i}").value
Fi = wsh1.range(f"F{i}").value
Gi = wsh1.range(f"G{i}").value
Hi = wsh1.range(f"H{i}").value
if day + int(Fi) > 28: #用if语句判定如果目前天数加上作物生长需要天数大于28,则收益为0
wsh1.range(f"L{i}").value = "0"
else:
if Hi == None: #用if语句判定是否为可持续收获作物
a = (Ci-Bi)/Fi
else:
a = (int(((28-day)-Fi)/Gi+1) *Ci -Bi)/(28-day)
wsh1.range(f"L{i}").value = a
i +=1
workbook.save()
df = pd.read_excel(file_path,sheet_name='chun') #用pandas读取'chun'工作表的数据
figure = plt.figure() #画图
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = df['作物名称'] #以'作物名称'列为x轴
y = df['日均收益'] #以'日均收益'列为x轴
plt.bar(x,y,color = 'black')
#判定当工作表里有图片时删除该图片,否则会导致每次运行程序重新计算添加图片都会多一张,太乱
while wsh1.pictures:
wsh1.pictures[0].delete() #翻阅xlwings 手册翻到的代码,这块我搜了半天都没找到怎么执行
wsh1.pictures.add(figure,left = 500,top = 200)
workbook.save()
workbook.close()
app.quit()
总结
看半天书不如要自己上手写,才能踩无数的坑发现问题在哪里,这次主要踩的坑是
1.变量名要用f-string格式化,写成wsh1.range(f"L{i}").value而不是wsh1.range(L[i]).value,当时看书想当然就这么写上去了
2.删除excel内的图片要用wsh1.pictures[0].delete(),这个真的找了大半天哈哈