某日,收到客户的一个小需求,要计算一张excel表,如下所示:
要求,计算各项目的平均值,平均值乘以一个区间,用”-”分格,并总汇总其间值,结果如下所示:
我们用openpyxl 计算实现。先简要介绍一下这个库。Openpyxl是一个基于python实现操作excel的库,下面给一个简要示例,更多的API百度一下吧。
from openpyxl import load_workbook
#打开excel
bk2 = load_workbook("02.xlsx")
#获取工作簿
wt2 = bk2.get_sheet_by_name("Sheet1")
#写入值
wt2.cell(1,1).value = "abc"
#获取值
print(wt2.cell(1,2).value)
#另存为
bk2.save("01.xlsx")
这些代码说明几个问题。一是我们可以遍历表格,cell(row, col),row是行,col是列,wt2.cell(1,1)获取行1,列A的单元格;二是可以载入和另存为,基于这个,我们先做一个模板,计算结果后,把值填入模板,再另存为需要的结果。这样的好处不仅不会修改到原始数据,而且格式也符合要求。
先定义一个参数,用字典结构。如下所示。
parmas = {"01": [(5, 6), (15, 20)],
"02": [(8, 11), (16, 24)],
"03": [(13, 15), (1.4, 2.4)],
"04": [(17, 18), (1, 1.4)],
"05": [(20, 20), (1, 1.4)],
"06": [(22, 22), (0.7, 1)]}
解释一下?Python中,字典的键和值用冒号(:)分隔开,是基于于散列实现的(谁关心呢?),示例中值是一个列表list,这个列表表由 二个元组组成,第一个元组是原始数据的行号,第二个元组是用于计算其间值的参数。
有了这些内容,应该就可以解决问题。一些注意事项是。
- 计算后的结果仅需要保留两位小数点。用str的format方法。如下所示。
wt2.cell(rowIndexs[1], colIndex).value = "{0:.2f}".format(111.0213333)
- 读取值是,可能是字符串,数值格式,先用excel格式化一下再载入。