цикл for для создания нескольких графиков openpyxl - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь создать цикл for для создания нескольких линейных диаграмм в openpyxl, все сразу. Определенные индексы в массиве будут источниками данных, из которых будет извлекаться диаграмма. Возможно ли это в openpyxl?

Мои данные в таблице Excel выглядят так:

1          Time        Battery Voltage
2 2019-06-05 00:00:00      45
3 2019-06-05 00:01:50      49
4 2019-06-05 00:02:30      51
5 2019-06-05 00:04:58      34
...
import os
import openpyxl
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference, Series
from openpyxl.chart.axis import DateAxis
from datetime import date, datetime, timedelta, time

os.chdir('C:\\Users\user\test')
wb = openpyxl.load_workbook('log.xlsx')
sheet = wb['sheet2']
ws2 = wb['sheet2']

graphIntervals = [0,50,51,100,101,150] # filled with tuples of two integers, 
# representing the top-left and bottom right of the rectangular 
# selection of cells containing chart data I'm trying to graph

starts = graphIntervals[::2]
ends = graphIntervals[1::2]

for i in graphIntervals:
    c[i] = LineChart()
    c[i].title = "Chart Title"
    c[i].style = 12
    c[i].y_axis.crossAx = 500
    c[i].x_axis = DateAxis(crossAx=100)
    c[i].x_axis.number_format = 'd-HH-MM-SS'
    c[i].x_axis.majorTimeUnit = "days"

    c[i].y_axis.title = "Battery Voltage"
    c[i].x_axis.title = "Time"

    data = Reference(ws2, min_col=2, min_row=starts, max_col=2, max_row=ends)
    c[i].add_data(data, titles_from_data=True)
    dates = Reference(ws2, min_col=1, min_row=starts, max_row=ends)
    c[i].set_categories(dates)


    s[i] = c[i].series[0]
    s[i].graphicalProperties.line.solidFill = "BE4B48"
    s[i].graphicalProperties.line.width = 25000 # width in EMUs.
    s[i].smooth = True # Make the line smooth
    ws2.add_chart(c[i], "C[i+15]") # +15 for spacing
    wb.save('log.xlsx')

В идеале я бы закончил (хотя многие значения в graphIntervals / 2) графики.

Я знаю, что мне нужно включить zip() в мою переменную data, в противном случае он не сможет перейти к следующему набору значений для создания электронных таблиц. Я думаю, что-то вроде zip(starts, ends), но я не уверен.

Возможно ли что-нибудь из этого через openpyxl? Хотя я не нашел ни одного, у кого-нибудь есть примеры, на которые я мог бы сослаться?

1 Ответ

0 голосов
/ 26 июня 2019

Следовал советам в комментариях.Вот эта функция, вызываемая в цикле for:

for i in range(0, len(graphIntervals), 2):
    min_row = graphIntervals[i] + 1
    max_row = graphIntervals[i+1] + 1

    # skip headers on first row
    if min_row == 1:
        min_row = 2

    dates = chart.Reference(ws2, min_col=1, min_row=min_row, max_row=max_row)
    vBat = chart.Reference(ws2, min_col=2, min_row=min_row, max_col=2, max_row=max_row)
    qBat = chart.Reference(ws2, min_col=3, min_row=min_row, max_col=3, max_row=max_row)
...