Как выделить текст строки ячеек в Python Docx? - PullRequest
0 голосов
/ 17 января 2019

Я создаю документ с использованием модуля Python Docx. Я хочу выделить определенную ячейку строки в Python DOCX

вот код

book_title = '\n?????-:\n {}\n\n'.format(book_title)
book_desc = '??????-: {}\n\n???????????:\n{}\n\n????? ??????:\n{}'.format(book.author,book_description,sales_point)


row1.cells[1].text = (book_title + book_desc)

Я просто хочу выделить название книги. Если я применяю стиль, он автоматически применяется ко всему документу.

Ответы [ 4 ]

0 голосов
/ 18 января 2019

Ячейка не имеет стиля символа; стиль символа может быть применен только к тексту, и в частности к run текста. Фактически это является определяющей характеристикой серии, представляющей собой последовательность символов с одинаковым форматированием символов, также известную как шрифт в python-docx.

Чтобы получить название книги с шрифтом, отличным от описания, они должны появляться в отдельных прогонах. Присвоение Cell.text (как у вас есть) приводит к тому, что весь текст будет за один проход.

Это может сработать для вас, но при запуске предполагается, что ячейка пуста:

paragraph = row1.cells[1].paragraphs[0]
title_run = paragraph.add_run(book_title)
description_run = paragraph.add_run(book_desc)
title_run.bold = True

Этот код можно сделать более компактным:

paragraph = row1.cells[1].paragraphs[0]
paragraph.add_run(book_title).bold = True
paragraph.add_run(book_desc)

но, возможно, прежняя версия проясняет, что вы делаете на каждом шаге.

0 голосов
/ 17 января 2019

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

row1_cells[0].paragraphs[0].add_run(book_title + book_desc).bold=True

Это всего лишь пример для первой ячейки таблицы.Пожалуйста, исправьте это в своем коде.

0 голосов
/ 17 января 2019

В python-docx стиль любого символа в шаблонном документе docx может быть переопределен с помощью стиля Rich Text . Вы должны предоставить переменную контекста для конкретного символа / строки, которая требует стилизации в вашем шаблоне, в позиции символа / строки. Эта переменная отображается на объект RichText, который имеет определение стиля (которое вы определяете в своем коде), чтобы стилизовать символ / строку. Чтобы прояснить ситуацию, рассмотрим пример шаблона документа "test.docx", который содержит следующий текст:

Здравствуйте, {{r context_var}}!

{{..}} - это синтаксис тега jinja2, а {{r - это тег RichText, который переопределяет стили символов. context_var - это переменная, которая отображает стиль в строку символов. Мы выполняем стилизацию Rich Text следующим образом:

from docxtpl import DocxTemplate, RichText
doc = DocxTemplate("test.docx")
rt = RichText() #create a RichText object
rt.add('World', bold=True) #pass the text as an argument and the style, bold=True
context = { 'context_var': rt } #add context variable to the context and map it to rt
doc.render(context) #render the context
doc.save("generated_doc.docx") #save as a new document

Давайте посмотрим на содержимое «generate_doc.docx»:

Привет Мир !

Я не уверен, как устроен ваш шаблон, но если вы просто хотите, чтобы book_title был выделен жирным шрифтом, ваш шаблон "test.docx" должен иметь такой текст:

Название: -

{{r book_title_var}}

Код должен быть изменен на:

book_title = "Lord of the Rings" #or wherever you get the book title from
rt.add(book_title, bold=True)
context = { 'book_title_var': rt }

generated_doc.docx:

Заголовок: -

Властелин колец

0 голосов
/ 17 января 2019

Поскольку вы используете модуль docx, вы можете стилизовать текст / абзац, явно указав стиль.

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

>>> from docx import Document
>>> document = Document()
>>> style = document.styles['Normal']
>>> font = style.font
>>> font.bold= True

Это изменит стиль шрифта на жирный для примененного абзаца.

...