python使用openpyxl包操作xlsx的记录

参考文章:
写入XLSX:python操作xlsx文件
python openpyxl模块,加载文件时,设置data_only=True,返回值为None

操作xlsx

已经有的:
  1. 一个名为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")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值