首页 > 编程语言 >python,pandas ,openpyxl提取excel特定数据,合并单元格合并列,设置表格格式,设置字体颜色,

python,pandas ,openpyxl提取excel特定数据,合并单元格合并列,设置表格格式,设置字体颜色,

时间:2023-10-30 17:32:28浏览次数:38  
标签:subset openpyxl df 合并 value cell 设置 numpy columns


python,pandas ,openpyxl提取excel特定数据,合并单元格合并列,设置表格格式,设置字体颜色,

代码

import os

import numpy
import pandas as pd
import openpyxl
from openpyxl.styles import Font
from openpyxl.styles import Border, Side

def read(file):
    # 读取表格A和表格B
    df_a = pd.read_excel(file, skiprows=9)  # 用实际的文件路径替换 '表格A.xlsx'

    df_b = pd.DataFrame()
    columns_to_copy = ['Case NO', 'Serial NO', 'Net Weight', 'Length', 'Width', 'Thickness', 'ThicknessRange',
                       'ArealWeight', 'ArealWeightRange', 'TensileStrength', 'Elongation', 'SurfaceRoughnessSSide',
                       'SurfaceRoughnessMSide', 'SurfaceGlossSSide', 'SurfaceGlossMSide', 'Wettability', 'WrapHeight',
                       'HTAntiOxidization', 'Cr'
                       ]
    df_subset = df_a[columns_to_copy]

    # 将所选列复制到表格B的相应位置,空列用于合并使用
    df_b['Case NO'] = df_subset['Case NO']
    df_b['Serial NO'] = df_subset['Serial NO']
    df_b['Net Weight'] = df_subset['Net Weight']
    df_b['Length'] = df_subset['Length']
    df_b['Areal Weight'] = df_subset['ArealWeight']
    df_b['Tensile Strength'] = df_subset['TensileStrength']
    df_b['Column1'] = [None] * len(df_b)
    

    # 定义每列的区间要求,使用 numpy.inf 表示正无穷大,-numpy.inf 表示负无穷大
    column_ranges = {
        'Areal Weight': (54 - 2.5, 54 + 2.5),  # 0 到正无穷大
        'Tensile Strength': (300, numpy.inf),  # 负无穷大到 200
        'Elongation': (5, numpy.inf),
        'Wettability': '合格',
        'Warp Height': (-numpy.inf, 10),
        'Surface Roughness M': (-numpy.inf, 3.0),
        'Surface Roughness S': (-numpy.inf, 0.4),
    }

    df_b = df_b.iloc[1:-1]
    # 遍历每列并根据不同的条件进行处理
    for column, range_or_string in column_ranges.items():
        if isinstance(range_or_string, tuple):  # 区间检查
            min_value, max_value = range_or_string
            df_b[column] = df_b[column].apply(
                lambda x: x if (x == 0 or (min_value <= float(x) <= max_value)) else str(x) + 'XX')
        elif isinstance(range_or_string, str):  # 字符串设置
            df_b[column] = range_or_string

    # 编写一个函数来尝试将值转换为float
    def try_convert_to_float(value):
        try:
            return float(value)
        except (ValueError, TypeError):
            return value

    # 使用applymap将DataFrame中的值尝试转换为float,保留无法转换的原始值
    df_b = df_b.applymap(try_convert_to_float)

    # 定义一个函数来设置样式,将文本居中对齐和上下居中对齐
    def set_cell_style(value):
        style = 'text-align: center; vertical-align: middle;'
        return style

    # 使用Styler对象来应用样式,同时设置文本的居中对齐和上下居中对齐
    df_b = df_b.style.applymap(lambda x: set_cell_style(x))

    # 保存到新文件
    df_b.to_excel('temp.xlsx', index=False, engine='openpyxl')

    # 合并单元格
    wb = openpyxl.load_workbook('temp.xlsx')
    ws = wb.active
    #第一列连续相同值的合并单元格
    # 获取第一列数据
    type_list = []
    i = 2
    while True:
        r = ws.cell(i, 1).value
        if r:
            type_list.append(r)
        else:
            break
        i += 1

    # 判断合并单元格的始末位置
    s = 0
    e = 0
    flag = type_list[0]
    for i in range(len(type_list)):
        if type_list[i] != flag:
            flag = type_list[i]
            e = i - 1
            if e >= s:
                ws.merge_cells("A" + str(s + 2) + ":A" + str(e + 2))
                s = e + 1
        if i == len(type_list) - 1:
            e = i
            ws.merge_cells("A" + str(s + 2) + ":A" + str(e + 2))

    ### 合并列
    num_rows = ws.max_row

    combine_columns = {
        ('F', 'G'),
        ('H', 'I'),
        ('J', 'K'),
        ('L', 'M'),
        ('N', 'P'),
        ('Q', 'R'),
        ('S', 'T'),
    }

    for i in range(num_rows):
        for columns in combine_columns:
            start, end = columns
            ws.merge_cells(start + str(i + 1) + ":" + end + str(i + 1))

    # 定义不同列的字体配置
    font_columns = [
        (['A', 'B', 'C', 'D'], Font(name='Times New Roman', size=9, bold=True)),
        (['E', 'F', 'H', 'L', 'Q', 'S'], Font(name='Times New Roman', size=12)),
        (['J', 'N'], Font(name='宋体', size=12)),
    ]

    # 设置列的字体样式
    for labels, font in font_columns:
        for label in labels:
            for cell in ws[label]:
                cell.font = font
                # XX结尾的数据改成红色
                if cell.value and str(cell.value).endswith("XX"):
                    cell.value = cell.value[:-2]
                    cell.font = Font(name='Times New Roman', size=12, bold=True, color="FF0000", )
    # 创建一个边框样式
    border_style = Border(
        left=Side(border_style='thin', color='000000'),
        right=Side(border_style='thin', color='000000'),
        top=Side(border_style='thin', color='000000'),
        bottom=Side(border_style='thin', color='000000')
    )

    # 遍历工作表中的所有单元格并应用边框样式
    for row in ws.iter_rows():
        for cell in row:
            cell.border = border_style
    wb.save('output_excel_file.xlsx')

    try:
        os.remove('temp.xlsx')
    except FileNotFoundError:
        pass
    except Exception as e:
        pass
    return 'output_excel_file.xlsx'

输出效果

python,pandas ,openpyxl提取excel特定数据,合并单元格合并列,设置表格格式,设置字体颜色,_pandas


标签:subset,openpyxl,df,合并,value,cell,设置,numpy,columns
From: https://blog.51cto.com/u_12390904/8095799

相关文章

  • 一些美术设置
    PN曲面细分原理是通过一个几何上的贝塞尔表面来替换原始的网格数据进而对精细度较低的网格进行平滑处理。视差贴图,凹凸贴图,法线贴图,切线贴图,置换贴图切线和副法线向量用于法线贴图。在unity中只有切线和法线是在顶点信息中有存储的,副法线来源于法线和切线的值。Bitangents副法......
  • 【UR #26】石子合并
    喵喵题,要不是由于一些场外原因只想了半个小时的话应该是可以场切的!首先不难发现,对于最终数组的前后两个数\(x,y\),若\(x>y\),\(y\)和\(x\)一定位于同一个初始数组内,否则一定是\(y\)将\(x\)归并到了最终数组内,不合法。于是我们可以从开头开始找到最终数组的不降子序列。剩......
  • 倾斜摄影三维模型的顶层合并构建重要性分析
    倾斜摄影三维模型的顶层合并构建重要性分析 倾斜摄影超大场景的三维模型的顶层合并对于构建精确、完整且真实的三维模型具有重要的意义和应用价值。本文将从几个方面对其重要性进行浅析。一、模型完整性与连贯性倾斜摄影超大场景的三维模型的顶层合并可以将多个倾斜摄影数据......
  • shell脚本里如何设置Python的环境变量
    在shell脚本中设置Python的环境变量可以通过以下几个步骤来完成。首先,需要确定Python的安装路径。可以通过以下命令来查找Python的安装路径:该命令会返回Python可执行文件的路径,例如:/usr/bin/python。whichpython接下来,将Python的安装路径添加到PATH环境变量中。PA......
  • 微软Xbox主机将推出韧体更新,为PG用户供便捷的电子游戏设置功能
    微软即将发布一次重要的韧体更新,特别面向Xbox主机,其中的主要功能包括控.制器键盘配置、Clipchamp集成以及用户偏好的诊断数据共享。首先,这次更新将引入新的键盘配置功能,允许玩家将XboxElite无线控.制器Series2和Xbox自适应控.制器的按键映射至键盘上。在XboxAccessories应用程序......
  • 命名虚拟机及设置安装路径怎么操作呢?
    设置“处理器数量”和“每个处理器的内核数量”,可以在网络上搜索一下自己的CPU处理器的型号信息,或者在Windows系统中打开任务管理器,然后访问性能选项卡,该选项卡右下侧的逻辑处理器数量就是您的CPU内核数量。设置CPU处理器信息设置内存分配量设置网络类型设置SCSI控制器的类型设置虚......
  • 命名虚拟机及设置安装路径怎么操作
    设置“处理器数量”和“每个处理器的内核数量”,可以在网络上搜索一下自己的CPU处理器的型号信息,或者在Windows系统中打开任务管理器,然后访问性能选项卡,该选项卡右下侧的逻辑处理器数量就是您的CPU内核数量。设置CPU处理器信息设置内存分配量设置网络类型设置SCSI控制器的类型设置虚......
  • IDEA新建类时自动设置类注释信息,署名和日期
    file->setting(文件->设置)编辑器->文件和代码模版->include->fileheader模版内容官方模板这里${USER}会读取计算机的用户名${DATE}是日期${TIME}是时间/***@Author${USER}*@Date${DATE}${TIME}*@Version1.0*/......
  • 21. 合并两个有序链表
    目录题目代码题目将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]代码class......
  • Python 利用pymysql和openpyxl操作MySQL数据库并插入Excel数据
    1.需求分析本文将介绍如何使用Python连接MySQL数据库,并从Excel文件中读取数据,将其插入到MySQL数据库中。2.环境准备在开始本文之前,请确保您已经安装好了以下环境:Python3.xPyMySQL库openpyxl库MySQL数据库3.连接MySQL数据库我们可以使用pymysql库来连接MySQL数据库......