参考文章:
写入XLSX:python操作xlsx文件,
python openpyxl模块,加载文件时,设置data_only=True,返回值为None
操作xlsx
已经有的:
- 一个名为prime_pics的json文档,其中的一个对象如下:
2.对象中,3(6720)
就是模型名,它的原始数据在mytestG7中, mytestG7是一个xlsx文档,里面有一行标题(20个指标),115行数据(从2至116行)。表单3(6720)
的局部如下:
代码部分:
要做的,就是根据prime_pics.json
,来将pics
(p_order
是它排过序之后的)中指出的数,对应到mytestG7.xlsx
对应的行,抽取出来,生成新的表。
def make_xlsx():
# 获取自己的模型名和优势图片编号
base_path = "C:/Users/Dell/Documents/PythonFiles/forTESTonly/2sel/base/"
with open(base_path + "prime_pics.json", "r", encoding="utf8") as f:
data = json.loads(f.read())
# 打开自己的mytestG7依次操作
file_name = "D:/matlab_work/fusion_metrix_results/mytestG7.xlsx"
wb = openpyxl.load_workbook(file_name) # 打开文件,read_only设置为True,则无法按列访问单元格。
# 根据自己的较好的模型的模型名,进行操作
for model, m_p in data.items():
name,rows = model[:-5],m_p["p_order"]
sheet = wb[name] # 选中sheet
# 创建新表
new_wb = openpyxl.Workbook()
# new_sheet = new_wb.active
new_sheet = new_wb.create_sheet(title=name)
# 取源数据
rows = list(map(lambda x:x+1,rows)) # 因为图片行数是从第2行开始的,而图片名是从1开始的。
rows.insert(0,1) # 这是列名,第一行
for r in rows:
r_data = []
for cell in sheet[r]:
r_data.append(cell.value)
new_sheet.append(r_data)
# 最后一行求平均值
avg_formula = [f"=AVERAGE({chr(ord('A') + off)}2:{chr(ord('A') + off)}{len(rows)})" for off in range(ord('T')-ord('A')+1)]
new_sheet.append(avg_formula)
# 到此为止,已经将指定的行抽离了出来,并且求了平均数。
# 但是,对于我的数据处理需求,还不够,因为其他的对照实验也要抽取对应行,于是调用下面这个函数:write_others_xlsx,
# 再把参照模型的数据都进行一下写入,下面这两个函数,随后定义。
write_others_xlsx(new_wb,rows)
# 再在该函数定义一个页面,用于比较。调用函数write_cmp_sheet()
# 由于第一页是`Sheet`,而且一直没用,于是改个名字就好。
new_wb["Sheet"].title = 'cmp'
# 再将比较数据放在首页
sheet_names = ['DDcGAN','DIDFuse','dualbranch_add','dualbranch_channel','dualbranch_l1','FGAN','nest_attention_avg','nest_attention_max','nest_attention_nuclear','PerGAN','rfn_nest_source',name]
write_cmp_sheet(new_wb,sheet_names,len(rows) + 1)
xlsx_path = base_path + "/new_xlsx/" + name + ".xlsx"
new_wb.save(xlsx_path) # 写入,保存为模型名
wb.close()
调用函数是:
make_xlsx()
print("OK")
当然,如果要完整地运行此程序,需要先定义两个函数。
首先,定义函数write_others_xlsx()
,将其他的对照实验抽取对应行。对照实验的数据,放在7nn.xlsx中,其中,表单的格式与mytestG7中的3(6720)
表单完全一致。
def write_others_xlsx(new_wb,rows):
# 打开比较的模型数据
file_name = "D:/matlab_work/fusion_metrix_results/7nn.xlsx"
wb = openpyxl.load_workbook(file_name) # 打开文件
# 迭代每个sheet,进行取特定行的操作,写入新表
for sheet in wb:
new_sheet = new_wb.create_sheet(title=sheet.title) # 新表中创建同名sheet
# 取源数据
# rows.insert(0, 1) # 这是列名的第一行
for r in rows:
r_data = []
for cell in sheet[r]: # sheet是原表
r_data.append(cell.value)
new_sheet.append(r_data) # 新sheet添加原表数据
# 最后一行求平均值
avg_formula = [f"=AVERAGE({chr(ord('A') + off)}2:{chr(ord('A') + off)}{len(rows)})" for off in
range(ord('T') - ord('A') + 1)]
new_sheet.append(avg_formula)
定义write_cmp_sheet()
函数,用于比较各个模型抽取部分的平均值的优劣:
def write_cmp_sheet(new_wb,sheet_names,avg_row_num):
cmp_sheet = new_wb["cmp"]
for index,name in enumerate(sheet_names):
if not index: # 添加表名,这个应该是叫Sheet的空表单
m = ["model"]
for cell in new_wb[name][1]:
m.append(cell.value)
cmp_sheet.append(m)
avg_from = [name]
avg_from.extend([f"='{name}'!{chr(ord('A') + off)}{avg_row_num}" for off in
range(ord('T') - ord('A') + 1)])
cmp_sheet.append(avg_from) # 新sheet添加原表数据
总的模型效果是,将prime_pics.json
中指出的一些图片数据行,从3(6720)
表单和其他对比模型表单中挑出来,并将这些挑出来的数据求平均,然后将它们的结果放在一起比较。
结果会在一张表中。其中,第一张表单是cmp,第二张是3(6720)
,后面的是比较模型的表单。
每一张表单,都有相同的结构,第一行是列名,中间若干行是抽取的数据,最后一行是平均值。这一行平均值被引入到cmp
表单中:
番外
将指定的指标标红了
如上的数据中,将prime_pics.json
中metrics的值对应的指标标红了。这些指标的位置(所在列)由m_no
指出:
使用的代码是:
# 给优势单元格设置底色
def bg_xlsx():
base_path = "C:/Users/Dell/Documents/PythonFiles/forTESTonly/2sel/base/"
with open(base_path + "prime_pics.json", "r", encoding="utf8") as f:
data = json.loads(f.read())
# 根据自己的较好的模型的模型名,进行操作
for model, m_p in data.items():
name,col_m_no = model[:-5],m_p["m_no"]
xlsx_path = base_path + "/new_xlsx/" + name + ".xlsx"
wb = openpyxl.load_workbook(xlsx_path)
# 导入填充实例
from openpyxl.styles import PatternFill
style = PatternFill("solid", fgColor="FF0000")
# fgColor设置的是背景色,bg不知道为什么都是一团黑
sheet = wb["cmp"]
for c in col_m_no:
AT = chr(ord("A")+c)
sheet[f"{AT}1"].fill = style #填充单元格
wb.save(xlsx_path) # 要保存的这一步
调用:
bg_xlsx()
print("OK")