Python读取csv文件并写入excel文件,加生成折线图

发布时间 2023-09-07 16:14:35作者: 羽小兮
import csv
import decimal
import os
import openpyxl

# 获取模板 excel 的操作对象
from openpyxl.chart import Series, LineChart, BarChart, ScatterChart, Reference
from openpyxl.utils import get_column_letter

wb = openpyxl.load_workbook("C:\\Users\\CMS01\\Desktop\\SCHH621TEG_LDO(PLDO、NLDO、CPLDO)测试需求_20230814.xlsx")
names = wb.sheetnames
sheet6 = wb['Sheet6']
'''
for row in sheet6['A0:DP820']:
    for cell in row:
        cell.value = ''
'''

path = "D:\\laboratory\\LDO电流带载"
path_list = os.listdir(path)
path_list.sort()
for filename in path_list:

    file = open(os.path.join(path, filename))  # 打开csv文件
    reader = csv.reader(file)  # 读取csv文件
    data = list(reader)  # 将csv数据转化为列表

    length_h = len(data)  # 得到数据行数
    length_l = len(data[0])  # 得到每行长度
    x = 3
    y = path_list.index(filename) * 4 + 1
    sheet6.cell(x, y).value = filename
    sheet6.merge_cells(start_row=x, start_column=y, end_row=x, end_column=y + 1)

    for i in range(45, length_h):  # 从第48行开始读取
        x += 1
        if x < 6:
            sheet6.cell(x, y).value = data[i][5]
            sheet6.cell(x, y + 1).value = data[i][6]
        if x >= 6:
            sheet6.cell(x, y).value = float(data[i][5])
            sheet6.cell(x, y + 1).value = float(data[i][6])
            if isinstance(data[i][5], str) and 'e' in data[i][5].lower():
                sheet6.cell(x, y).value = decimal.Decimal(data[i][5])

    print(filename + "...over")

max_columns = 0
# 调整所有列的宽度
for column in sheet6.columns:
    sheet6.column_dimensions[column[0].column_letter].width = 18
    max_columns += 1
print("调整所有列的宽度" + "...over")

for column in range(1, max_columns+1, 4):
    # 画图
    chart = LineChart()  # 折线图
    # x 坐标的数据,通常用一列数据作为,这里选择第一列
    x_data = Reference(sheet6, min_col=column, min_row=6, max_col=column, max_row=sheet6.max_row)
    data = Reference(sheet6, min_col=column + 1, min_row=6, max_col=column + 1, max_row=sheet6.max_row)
    if sheet6.cell(6, column).value < 1:
        x_data = Reference(sheet6, min_col=column, min_row=7, max_col=column, max_row=sheet6.max_row)
        data = Reference(sheet6, min_col=column + 1, min_row=7, max_col=column + 1, max_row=sheet6.max_row)
    chart.add_data(data, from_rows=False, titles_from_data=False)
    # from_rows:如果是True表示将一行的数据作为一个条线,如果是False表示按列画
    # titles_from_data:如果是True,表示每一组(根据from_rows确定是每一行还是每一列)数据的第一个作为title
    # --------------------------------------------------------------------------------
    chart.set_categories(x_data)  # 设置横坐标
    chart.y_axis.title = 'Volts'  # 设置y轴的名字
    chart.x_axis.title = 'Amps'  # 设置x轴的名字
    chart.title = sheet6.cell(3, column).value
    column_letter = get_column_letter(column)  # 将列号转换为字母表示的列名
    chart_position = f"{column_letter}758"  # 设置图表的插入位置,例如A1、B1、C1、...
    sheet6.add_chart(chart, chart_position)  # 将图标加到sheet中,可以指定图左上角的位置
    print("折线图——"+sheet6.cell(3, column).value + "...over")
wb.save("C:\\Users\\CMS01\\Desktop\\SCHH621TEG_LDO(PLDO、NLDO、CPLDO)测试需求_20230814.xlsx")
print("all over")