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

news/2024/7/21 6:06:36 标签: python, pandas, excel

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

代码

python">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'

输出效果

在这里插入图片描述


http://www.niftyadmin.cn/n/5123812.html

相关文章

vm_flutter

附件地址 https://buuoj.cn/match/matches/195/challenges#vm_flutter 可以在buu下载到。 flutter我也不会&#xff0c;只是这个题目加密算法全部在java层&#xff0c;其实就是一个异或和相加。 反编译 package k;import java.util.Stack;/* loaded from: classes.dex */ pu…

[Python进阶] 消息框、弹窗:tkinter库

6.16 消息框、弹窗&#xff1a;tkinter 6.16.1 前言 应用程序中的提示信息处理程序是非常重要的部分&#xff0c;用户要知道他输入的资料到底正不正确&#xff0c;或者是应用程序有一些提示信息要告诉用户&#xff0c;都必须通过提示信息处理程序来显示适当的信息&#xff0c…

Python学习之pandas模块duplicated函数的常见用法

pandas库中的duplicate()函数常用于查找和处理数据中的重复项。 以下是duplicate()函数的常见用法&#xff1a; 查找重复项&#xff1a;使用duplicate()函数可以查找数据中的重复项。例如&#xff0c;df.duplicated()可以返回一个布尔数组&#xff0c;指示每一行是否是重复项。…

shopee哪个站点好做

Shopee是一个跨国电子商务平台&#xff0c;拥有许多不同的站点&#xff0c;分布在亚洲和其他地区。哪个Shopee站点适合做生意要取决于你的产品、目标市场和其他因素。以下是一些考虑因素&#xff1a; 1、目标市场&#xff1a;首先要确定你想要销售的产品的目标市场是哪里。不同…

Baumer工业相机堡盟工业相机如何使用BGAPISDK生成视频(C++)

Baumer工业相机 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还…

人工智能与养老:技术如何助力舒适晚年

人工智能与养老&#xff1a;技术如何助力舒适晚年 随着人口老龄化趋势的加剧&#xff0c;养老问题成为社会关注的焦点。人工智能作为当今科技领域的热门技术&#xff0c;为养老行业提供了新的解决方案。本文将探讨人工智能在养老行业中的应用原理、具体场景和未来发展趋势&…

基于 ARM+FPGA+AD平台的多类型同步信号采集仪开发及试验验证(一)上位机设计

采集仪上位机设计 本章开发了一款基于 C# 的上位机软件&#xff0c;用于对多类型同步信号采集仪的各项功能 进行操作。从采集仪的数据传输需求出发&#xff0c;上位机利用以太网 UDP 协议实现与采集仪 的数据交互&#xff0c;包括向采集仪发送控制信息与配置信息、接收采…

关于腾讯云轻量应用服务器性能测评,看这一篇文章就够了

腾讯云轻量应用服务器性能如何&#xff1f;为什么便宜是不是性能不行&#xff1f;腾讯云百科txybk.com从轻量应用服务器的CPU型号、处理器主频、内存、公网带宽、月流量和系统盘多方面来详细测评轻量性能&#xff0c;轻量应用服务器性价比高&#xff0c;并不是性能不行&#xf…