Создание линейного графика с помощью openpyxl - «Ссылка недействительна» - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь создать линейный график с openpyxl. Две оси должны быть time и battery voltage. Создание диаграммы с openpyxl устанавливает одну ось как напряжение батареи, а другую как номер строки. Ручной выбор двух столбцов делает диаграмму правильно. При открытии листа, на котором создаются диаграммы, выдается ошибка: «Ссылка недействительна. Ссылки на заголовки, значения или размеры должны представлять собой одну ячейку, строку, столбец».

Я не понимаю, как линейный график может использовать только один столбец или строку. Что я тут не так делаю?

import os
import openpyxl
import re
from datetime import date, datetime, timedelta, time

os.chdir('C:\\Users\user\folder')
wb = openpyxl.load_workbook('file.xlsx')
wb.create_sheet('sheet2') # sheet where charts go
ws1 = wb['sheet1']
ws2 = wb['sheet2']

for cell in ws1['B:B']:
    ws2.cell(row = cell.row, column = 1, value = cell.value)
for cell in ws1['D:D']:
    ws2.cell(row = cell.row, column = 2, value = cell.value)

print('Creating charts...')
sheet = wb['sheet2'] # focus on sheet2 to pull data from/write chart to
refObj = openpyxl.chart.Reference(sheet, min_col=1, min_row=1, max_col=2, max_row=sheet.max_row)
seriesObj = openpyxl.chart.Series(refObj, title='Battery Voltage')
chartObj = openpyxl.chart.LineChart()
chartObj.title = 'Title'
chartObj.append(seriesObj)
sheet.add_chart(chartObj, 'C5')
wb.save('file.xlsx')

Вот что создает openpyxl: Here's what openpyxl creates

И выбор столбцов A и B и создание линейной диаграммы в Excel делает диаграмму, которую я пытаюсь получить: enter image description here

Мои аргументы для объекта LineChart неверны?

EDIT:

refObj = openpyxl.chart.Reference(sheet, min_col=2, min_row=2, max_col=2, max_row=sheet.max_row)

Правильно создает график, но устанавливает номер строки в качестве оси x. Я все еще пытаюсь определить время по оси X.

1 Ответ

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

Чтение документации более точно решило мою проблему. Вот код, необходимый для построения линейной диаграммы с правильно отформатированной осью даты (для моего приложения):

c1 = LineChart()
c1.title = "Title"
c1.y_axis.crossAx = 500
c1.x_axis = DateAxis(crossAx=100)
c1.x_axis.number_format = 'd-HH-MM-SS'
c1.x_axis.majorTimeUnit = "days"

c1.y_axis.title = "Voltage"
c1.x_axis.title = "Time"

data = Reference(ws2, min_col=2, min_row=1, max_col=2, max_row=sheet.max_row)
c1.add_data(data, titles_from_data=True)
dates = Reference(ws2, min_col=1, min_row=2, max_row=sheet.max_row)
c1.set_categories(dates)
...