victory的博客

长安一片月,万户捣衣声

0%

在Excel中按条件筛选数据并存入新的表

实现代码:

# 1.获取满足条件的数据
from openpyxl import load_workbook

wb = load_workbook("每月物料表.xlsx")
data = {}  # 储存所有工作表中满足条件的数据,以工作表名称为键
sheet_names = wb.sheetnames
for sheet_name in sheet_names:
    ws = wb[sheet_name]
    qty_list = []
    # 获取G列的数据,并用enumrate给其对应的元素编号
    for row in range(2, ws.max_row + 1):
        qty = ws['G' + str(row)].value
        qty_list.append(qty)
    # print(qty_list)

    qty_idx = list(enumerate(qty_list))  # 用于编号

    # 判断数据是否大于1000,然后返回大于1000的数据所对应的行数
    row_idx = []  # 用于储存数量大于1000所对应的的行号
    for i in range(len(qty_idx)):
        if qty_idx[i][1] > 1000:
            row_idx.append(qty_idx[i][0] + 2)
    # print(row_idx)

    # 获取满足条件的数据
    data_morethan1K = []
    for i in row_idx:
        data_morethan1K.append(ws['A' + str(i) + ":" + 'I' + str(i)])

    # print(data_morethan1K)

    data[sheet_name] = data_morethan1K

# 2.写入获取的数据
from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment

thin = Side(border_style="thin", color="000000")  # 定义边框粗细及颜色

wb = load_workbook("模板.xlsx")
ws = wb.active
for month in data.keys():
    ws_new = wb.copy_worksheet(ws)  # 复制模板中的工作表
    ws_new.title = month
    print(ws_new.title)
    # 将每个月的数据条数逐个取出并写入新的工作表
    for i in range(len(data[month])):  # 按数据行数计数,每行数据对应9列,所以每行需分别写入9个单元格
        ws_new.cell(row=i + 2, column=1).value = data[month][i][0][0].value
        ws_new.cell(row=i + 2, column=2).value = data[month][i][0][1].value
        ws_new.cell(row=i + 2, column=3).value = data[month][i][0][2].value
        ws_new.cell(row=i + 2, column=4).value = data[month][i][0][3].value.date()
        ws_new.cell(row=i + 2, column=5).value = data[month][i][0][4].value
        ws_new.cell(row=i + 2, column=6).value = data[month][i][0][5].value
        ws_new.cell(row=i + 2, column=7).value = data[month][i][0][6].value
        ws_new.cell(row=i + 2, column=8).value = data[month][i][0][7].value
        ws_new.cell(row=i + 2, column=9).value = data[month][i][0][8].value

    # 设置字号,对齐,缩小字体填充,加边框
    # Font(bold=True)可加粗字体

    for row_number in range(2, ws_new.max_row + 1):
        for col_number in range(1, 10):
            c = ws_new.cell(row=row_number, column=col_number)
            c.font = Font(size=10)
            c.border = Border(top=thin, left=thin, right=thin, bottom=thin)
            c.alignment = Alignment(horizontal="left", vertical="center", shrink_to_fit=True)
wb.save("每月(大于1K).xlsx")

模板.xlsx
每月物料表.xlsx

用Python在Excel中查找并替换数据

实现代码:

from openpyxl import load_workbook  # 用于读取Excel中的信息

# 获取Excel表格中的数据
wb = load_workbook('查找替换.xlsx')  # 读取工作簿
ws = wb.active  # 读取活动工作表
data = {}  # 新建字典,用于储存数据

for row in range(2, ws.max_row + 1):
    chazhao = str(ws['A' + str(row)].value)  # 转换成字符串,以免后续比对时出现数据类型冲突
    tihuan = str(ws['B' + str(row)].value)  # 转换成字符串,以免后续比对时出现数据类型冲突
    data[chazhao] = tihuan  # 键值对应存入字典

wb = load_workbook('原表.xlsx')  # 读取目标工作簿
ws = wb.active
ID_list = []  # 新建一个列表,用于储存原表D列的信息
for row in range(2, ws.max_row + 1):
    ID = ws['D' + str(row)].value  # 遍历整个工作表,将D列的数据逐个存入ID变量
    ID_list.append(ID)  # 将读取到的结果存入列表

code = []
for i in ID_list:
    if i is None:  # 如果是None,则放入None占位,以保持列表的值的顺序与原表一致
        code.append(None)
    else:
        code.append(i.split(":")[-1])  # 不是None,则按":"符号分割,并放分割后的最后一个值进入新列表code

for i in range(len(code)):
    if code[i] in data:
        ws.cell(row=i + 2, column=4).value = ID_list[i].split(":")[0] + ":" + data[code[i]]
wb.save('原表-替换.xlsx')

查找替换.xlsx
原表.xlsx

批量压缩图片

实现代码:

# 将图片按修改时间排序(这样才能与图片的描述一致),将路径存入列表,以便后面逐个插入图片时调用
import os
from PIL import Image
from docx import Document

path = "6s_pictures"
list_p = [path + "\\" + i for i in os.listdir(path)]  # 获取图片的文件名,并拼接完整路径
list_p.sort(key=lambda path: os.path.getmtime(path))  # 将列表中的文件按其修改时间排序,os.path.getmtime() 函数是获取文件最后修改时间
print(list_p)

# 按比例缩小图片尺寸
for infile in list_p:
    im = Image.open(infile)
    (x, y) = im.size  # 读取图片尺寸(像素)
    x_s = 165  # 定义缩小后的标准宽度
    y_s = int(y * x_s / x)  # 基于标准宽度计算缩小后的高度
    out = im.resize((x_s, y_s), Image.ANTIALIAS)  # 改变尺寸,保持图片高品质
    out.save(r"6s_pictures_new\{}".format(infile.split("\\")[-1]))

path = "6s_pictures_new"
list_p = [path + "\\" + i for i in os.listdir(path)]  # 获取图片的文件名,并拼接完整路径
list_p.sort(key=lambda path: os.path.getmtime(path))  # 将列表中的文件按其修改时间排序,os.path.getmtime() 函数是获取文件最后修改时间

doc = Document("6S稽查问题模板.docx")
table = doc.tables[0]  # 已确定是第一个表格,其索引是0

# 增加需要的行,以便足够填入数据
for i in range(len(list_p) - 1):
    table.add_row()

# 写入数据及图片
for row in range(1, len(list_p) + 1):
    # 插入图片
    run = table.cell(row, 2).paragraphs[0].add_run()  # 新增一个文字块
    picture = run.add_picture(list_p[row - 1])  # 插入图片

doc.save("6S稽查问题.docx")

6s_pictures
6S稽查问题模板.docx

使用matplotlib绘制双柱状图

实现代码:

import matplotlib.pyplot as plt


# 定义函数来显示柱状上的数值
def autolabel(rects):
    for rect in rects:
        height = rect.get_height()
        plt.text(rect.get_x() + rect.get_width() / 2. - 0.2, 1.03 * height, '%s' % float(height))


if __name__ == '__main__':
    l1 = [75, 57, 59, 60, 60]
    l2 = [68.39, 58, 54, 58, 55]

    # l1 = [68.50, 53.13, 53.04, 52.64, 56.32]
    # l2 = [66.31, 53.57, 50.54, 55.54, 47.72]
    name = ['CNN-LSTM', 'CNN3Conv', 'CNN5Conv', 'LeNet', 'EEGNet']
    total_width, n = 0.8, 2
    width = total_width / n
    x = [0, 1, 2, 3, 4]
    plt.rc('font', family='SimHei', size=12)  # 设置中文显示,否则出现乱码!
    a = plt.bar(x, l1, width=width, label='Valence', fc='y')
    for i in range(len(x)):
        x[i] = x[i] + width
    b = plt.bar(x, l2, width=width, label='Arousal', tick_label=name, fc='r')
    autolabel(a)
    autolabel(b)
    plt.xlabel('Models')
    plt.ylabel('Accuracy')
    plt.title('Valence Accuracy and Arousal Accuracy')
    plt.legend()
    plt.show()
    plt.savefig('accuracy.png')