2025, Dec 17 18:02

Как сделать двухстрочный заголовок диаграммы Excel в openpyxl с разным форматированием строк

Разбираем, как сделать двухстрочный заголовок диаграммы Excel в openpyxl: разное оформление строк через rich‑text и txPr, XML и пример кода на Python.

Создание диаграмм Excel с помощью openpyxl обычно кажется простым, пока не требуется тонко управлять заголовком. Частая задача — двухстрочный заголовок, где каждая строка оформлена по‑разному: например, первая — с контекстом (помещение, тип пробы), а вторая — с критериями приемки и другим стилем. Обычный перевод строки действительно делит текст на строки, но не позволяет задавать оформление для каждой строки через CharacterProperties. Ниже — аккуратное решение.

Минимальный пример, который только разбивает строки

Простой подход создает несколько строк, но не дает контроля над форматированием каждой из них:

from openpyxl.chart import BarChart
plot_obj = BarChart()
line_one = "Room: XXX, Sample Type: XXX, Grid: XXX"
line_two = "Acceptance Criteria: XXX"
plot_obj.title = line_one + "\n" + line_two

Почему этого недостаточно

Перевод строки в заголовке действительно делает подпись многострочной, но не открывает настройки для отдельной строки. Чтобы оформить строки по‑разному — изменить жирность, подчеркивание, цвет — заголовок нужно передать как rich‑текст. В openpyxl это можно сделать, переиспользуя XML через Advanced Chart Formatting и передавая его в заголовок диаграммы как дерево rich‑текста.

Практическое решение с rich‑text XML

Надежный способ — задать заголовок в виде rich‑текста DrawingML внутри блока txPr и присвоить его заголовку диаграммы как rich‑объект. Можно собрать тестовую диаграмму в Excel, настроить там формат заголовка, посмотреть XML диаграммы и использовать нужные фрагменты. Пример ниже показывает, как применить две строки с разным оформлением. Символ перевода строки можно поставить либо в начале следующего рана, либо в конце предыдущего — на ваше усмотрение.

from openpyxl.chart import BarChart, Reference
from openpyxl.chart.text import RichText
from openpyxl import Workbook
from openpyxl.xml.functions import fromstring
# Создаем книгу и рабочий лист
book = Workbook()
sheet = book.active
# Заполняем данные
dataset = [
    ('val', 'Batch 1', 'Batch 2'),
    ('val_1', 10, 30),
    ('val_2', 40, 60),
    ('val_3', 50, 70),
    ('val_4', 20, 10),
    ('val_5', 10, 40),
    ('val_6', 50, 30),
]
for rec in dataset:
    sheet.append(rec)
# XML rich‑текста для двухстрочного заголовка с разным форматированием
rich_text_xml = """

  
    
  
  
  
      
            
                
                    
                        
                        
                    
                
                
                
                
            
      
        
            
                
                    
                
            
            Chart Title1
        
        
            
                
                    
                
            
            \nChart Title2
         
  

"""
# Создаем диаграмму
graph = BarChart()
graph.type = "bar"
# Заголовок обязателен, но отображаемый текст будет взят из rich‑XML
graph.title = "Foo"
# Вставляем rich‑текст в заголовок диаграммы
graph.title.text.rich = RichText.from_tree(fromstring(rich_text_xml))
# Подключаем данные и категории
value_ref = Reference(sheet, min_col=2, min_row=1, max_row=7, max_col=3)
name_ref = Reference(sheet, min_col=1, min_row=2, max_row=7)
graph.add_data(value_ref, titles_from_data=True)
graph.set_categories(name_ref)
# Размер и размещение
graph.height = 15
graph.width = 25
sheet.add_chart(graph, 'A10')
# Сохранение
book.save('chart_result.xlsx')

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

В отчетах и дашбордах часто нужно по‑разному расставлять акценты в заголовках: контекст и критерии приемки должны визуально различаться. Когда простого перевода строки мало, rich‑текст дает точный контроль цвета, насыщенности и подчеркивания для каждой строки. Использование расширенного форматирования диаграмм позволяет полностью автоматизировать построение и не терять в качестве подачи.

Итоги

Если нужен многострочный заголовок с индивидуальным оформлением строк в openpyxl, разделяйте их переводом строки в текстовых ранах и передавайте определение rich‑текста на базе txPr. Присваивайте его заголовку через API rich‑текста, сохраняя номинальную строку заголовка. Разрыв можно поставить в конце одного рана или в начале следующего, чтобы контролировать перенос. Если удобнее настраивать стили визуально, подготовьте заголовок на тестовой диаграмме и переиспользуйте получившийся XML. Такой подход дает нужную гибкость для аккуратных, программно создаваемых диаграмм Excel.