Я использую openpyxl для построения графика, но у меня возникли проблемы с настройкой линий сетки.
Пример (упрощенный) кода
# Import
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
from openpyxl.chart.axis import ChartLines, TextAxis
from openpyxl.chart.shapes import GraphicalProperties
from openpyxl.drawing.colors import ColorChoice
# Create a line chart
chart = LineChart()
# Reference data from the worksheet I'm working with
num_rows = ws_data.max_row
num_cols = ws_data.max_column
data_ref = Reference(ws_data, min_col=2, min_row=1, max_col=num_cols, max_row=num_rows)
chart.add_data(data_ref, titles_from_data=True)
# Configure the x_axis
chart.x_axis = TextAxis(tickMarkSkip=4)
chart.x_axis.majorTickMark = "cross"
chart.x_axis.delete = False
# Configure the vertical gridlines
chart.x_axis.majorGridlines = ChartLines()
chart.x_axis.majorGridlines.graphicalProperties = GraphicalProperties(noFill=False, solidFill=ColorChoice(prstClr='yellow'))
# Add the chart to the 'Charts' worksheet
ws_chart.add_chart(chart, "A1")
Результатом этого фрагмента кода является то, что вертикальные линии сетки видны через каждые 4 деления, как я и предполагал. Однако цвет неправильный. Я также пробую еще несколько вещей, но, похоже, я не могу ничего сделать, чтобы манипулировать графическими свойствами объектов ChartLines().
Чтобы настроить линии сетки и правильно установить их свойства в openpyxl, вам необходимо убедиться, что вы используете соответствующие свойства и методы. Работа с классом GraphicalProperties может быть немного сложной, особенно при настройке цветов.
Вот исправленная версия вашего кода, обеспечивающая правильную настройку линий сетки и желаемый цвет:
# Import necessary modules
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
from openpyxl.chart.axis import ChartLines, TextAxis
from openpyxl.drawing.line import LineProperties
from openpyxl.drawing.colors import ColorChoice
from openpyxl.chart.shapes import GraphicalProperties
# Create a workbook and add a worksheet
wb = Workbook()
ws_data = wb.active
ws_data.title = "Data"
# Add some example data
data = [
["Month", "Value"],
[1, 10],
[2, 40],
[3, 30],
[4, 50],
[5, 20],
[6, 60],
[7, 70]
]
for row in data:
ws_data.append(row)
# Create a 'Charts' worksheet
ws_chart = wb.create_sheet(title = "Charts")
# Create a line chart
chart = LineChart()
# Reference data from the worksheet
num_rows = ws_data.max_row
num_cols = ws_data.max_column
data_ref = Reference(ws_data, min_col=2, min_row=2, max_col=num_cols, max_row=num_rows)
chart.add_data(data_ref, titles_from_data=True)
# Configure the x_axis
chart.x_axis = TextAxis(tickMarkSkip=1)
chart.x_axis.majorTickMark = "cross"
chart.x_axis.delete = False
# Configure the vertical gridlines
chart.x_axis.majorGridlines = ChartLines()
chart.x_axis.majorGridlines.spPr = GraphicalProperties(ln=LineProperties(solidFill=ColorChoice(prstClr='yellow')))
# Add the chart to the 'Charts' worksheet
ws_chart.add_chart(chart, "A1")
# Save the workbook
wb.save("chart_with_gridlines.xlsx")
В этом пересмотренном коде ключевой частью является правильная настройка LineProperties:
chart.x_axis.majorGridlines.spPr = GraphicalProperties(ln=LineProperties(solidFill=ColorChoice(prstClr='yellow')))
Это гарантирует, что линии сетки правильно настроены и имеют желаемый цвет. Убедитесь, что ваша версия openpyxl поддерживает эти функции, поскольку некоторые функции могут различаться в разных версиях. Если у вас возникнут какие-либо проблемы, убедитесь, что у вас установлена последняя версия openpyxl:
pip install openpyxl --upgrade
Эй, я действительно нашел ответ! Правильная строка должна выглядеть так:chart.x_axis.majorGridlines.spPr = GraphicalProperties(ln=LineProperties(solidFill=ColorChoice(prstClr='yellow'))). Я не знаю, что делает GraphicalProperties(noFill=False, SolidFill=ColorChoice(prstClr='yellow')). Но я рад, что нашел ваш ответ!
Если вы можете отредактировать свой ответ, я могу пометить его как принятый.
Рад слышать! Строка GraphicalProperties(noFill=False, SolidFill=ColorChoice(prstClr='yellow')) неверна, поскольку GraphicalProperties напрямую не принимает noFill или SolidFill в качестве параметров. Вместо этого следует использовать GraphicalProperties для переноса LineProperties. Я обновил ответ
Спасибо за помощь. Но я получил ошибку в строкеchart.x_axis.majorGridlines.spPr: TypeError: <class 'openpyxl.chart.axis.ChartLines'>.spPr должен быть <class 'openpyxl.chart.shapes.GraphicalProperties'>, но значение < класс 'openpyxl.drawing.line.LineProperties'>. Вот почему я установил эту строку так, как в своем коде. Код выполняется, но эффект не применяется.