2025, Oct 22 09:31

Как в openpyxl убрать наложение заголовка на диаграмму Excel

Решение проблемы в openpyxl, когда заголовок диаграммы Excel перекрывает столбцы: отключаем overlay у заголовка и других элементов. Пример кода и пояснения.

При создании диаграмм Excel через openpyxl часто возникает неожиданность: заголовок диаграммы оказывается прямо поверх столбцов. Изменение размеров диаграммы или попытки подвинуть заголовок с помощью настроек макета обычно не помогают. Причина в том, как Excel обращается с наложением (overlay) элементов диаграммы.

Воспроизведение проблемы

Ниже приведённый фрагмент создаёт столбчатую диаграмму и размещает её на листе. Он форматирует заголовок, включает подписи данных, задаёт цвета и пытается сдвинуть заголовок через ManualLayout. Несмотря на это, заголовок продолжает перекрывать построенные данные.

# ws_metrics — активный рабочий лист
# Создаём диаграмму
bar_plot = BarChart()
# Ряды и категории
series_ref = Reference(ws_metrics, min_col=3, min_row=3, max_row=14)
cat_ref = Reference(ws_metrics, min_col=1, min_row=3, max_row=14)
bar_plot.title = "Custom Title"
bar_plot.title.text.rich.paragraphs[0].pPr = ParagraphProperties(defRPr=CharacterProperties(sz=1250))
manual_pos = ManualLayout(xMode="edge", yMode="edge", x=0.0, y=-0.05)
bar_plot.title.layout = Layout(manualLayout=manual_pos)
bar_plot.add_data(series_ref, titles_from_data=False)
bar_plot.set_categories(cat_ref)
bar_plot.dataLabels = DataLabelList()
bar_plot.dataLabels.showVal = True
bar_plot.dataLabels.showSerName = False
bar_plot.dataLabels.showCatName = False
bar_plot.dataLabels.showLegendKey = False
bar_plot.legend = None
bar_plot.x_axis.delete = False
bar_plot.y_axis.delete = False
first_series = bar_plot.series[0]
first_series.graphicalProperties.solidFill = "379e3e"
ws_metrics.add_chart(bar_plot, "F3")

Что происходит на самом деле

Стандартные настройки Excel со временем менялись. Для компонентов диаграммы — таких как заголовок, подписи осей и легенда — атрибут overlay определяет, будет ли элемент «плавать» поверх области построения. В ранних версиях Excel по умолчанию это было False. В текущих версиях по умолчанию — True. При включённом наложении заголовок может заходить на область диаграммы вне зависимости от её размеров или ручных смещений в макете.

Решение

Явно отключите наложение. Установите соответствующие флаги overlay в False, чтобы Excel резервировал место для этих элементов вместо размещения их поверх данных. У подписей осей также есть атрибут delete; он должен быть False, если вы хотите, чтобы они отображались.

# ws_metrics — активный рабочий лист
# Создаём диаграмму
bar_plot = BarChart()
# Ряды и категории
series_ref = Reference(ws_metrics, min_col=3, min_row=3, max_row=14)
cat_ref = Reference(ws_metrics, min_col=1, min_row=3, max_row=14)
bar_plot.title = "Custom Title"
bar_plot.title.text.rich.paragraphs[0].pPr = ParagraphProperties(defRPr=CharacterProperties(sz=1250))
manual_pos = ManualLayout(xMode="edge", yMode="edge", x=0.0, y=-0.05)
bar_plot.title.layout = Layout(manualLayout=manual_pos)
bar_plot.add_data(series_ref, titles_from_data=False)
bar_plot.set_categories(cat_ref)
bar_plot.dataLabels = DataLabelList()
bar_plot.dataLabels.showVal = True
bar_plot.dataLabels.showSerName = False
bar_plot.dataLabels.showCatName = False
bar_plot.dataLabels.showLegendKey = False
# Отключаем наложение для более чистого макета
bar_plot.title.overlay = False
# Если эти свойства доступны в вашем окружении, можно задать и их:
# bar_plot.x_axis.title.overlay = False
# bar_plot.y_axis.title.overlay = False
# Если используете легенду:
# bar_plot.legend.overlay = False
bar_plot.legend = None
bar_plot.x_axis.delete = False
bar_plot.y_axis.delete = False
first_series = bar_plot.series[0]
first_series.graphicalProperties.solidFill = "379e3e"
ws_metrics.add_chart(bar_plot, "F3")

Достаточно задать bar_plot.title.overlay = False, чтобы заголовок перестал заходить на столбцы. В некоторых окружениях попытка обратиться к x_axis.title.overlay может вызвать ошибку атрибута; в таком случае сосредотачьтесь на наложении заголовка диаграммы. Если вы включаете подписи осей или легенду, их наложение также можно отключить.

Почему это важно

Если оставить поведение наложения по умолчанию, отрисовка диаграммы будет зависеть от версии Excel, в которой открыт файл. В одном окружении заголовки или легенда могут оказаться поверх данных, а в другом — нет. Явные настройки наложения обеспечивают единообразный и читаемый результат.

Выводы

Если заголовок диаграммы «заезжает» на столбцы или линии, не начинайте с подгонки размеров или ручного позиционирования. Сначала отключите наложение для заголовка — так Excel выделит место вне области построения. Держите x_axis.delete и y_axis.delete в значении False, когда оси должны быть видимыми, и отключайте наложение у прочих используемых элементов. Эта небольшая, но явная настройка делает макет предсказуемым, а данные — читаемыми.

Статья основана на вопросе на StackOverflow от Sagar Kulkarni и ответе Axel Richter.