Вставка кода Python в документы Microsoft Word

Раздел: Офис -> Автоматизация документов

Основные способы вставки кода Python в документ Word

Как автоматически вставить код Python в Word с сохранением форматирования с помощью python-docx?

Наиболее эффективный способ - использование библиотеки python-docx. Она позволяет создавать документы Word программно, управлять стилями, шрифтами и цветами. Для вставки кода нужно создать абзац с моноширинным шрифтом (например, Consolas) и, при необходимости, добавить фон.

Установка: pip install python-docx


from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = Document()

# Создаём абзац для кода
p = doc.add_paragraph()
run = p.add_run('print("Hello, World!")')
run.font.name = 'Consolas'
run.font.size = Pt(10)
# Фон (заливка текста) - светло-серый
run.font.highlight_color = WD_COLOR_INDEX.GRAY_25

doc.save('code_example.docx')
    

как вставить код python в word (вставка кода python в word)

Документ Word с одной строкой кода, отформатированной шрифтом Consolas и серым фоном.

Проблема: Цвет фона применяется только к тексту run, а не ко всему абзацу. Для полной подсветки синтаксиса требуется ручная разметка или использование таблиц.

Ошибка: Если не указать шрифт, Word может использовать шрифт по умолчанию (Calibri), что нарушит моноширинность.

Как вставить многострочный код Python в Word с помощью python-docx и таблицы?

Для многострочного кода удобно поместить каждую строку в ячейку таблицы и залить ячейки фоном. Альтернатива - использовать один абзац с переводами строк, но тогда фон будет только у отдельных фрагментов.


from docx import Document
from docx.oxml.ns import qn

doc = Document()

code_lines = [
    'def hello():',
    '    print("Hello, World!")',
    'hello()'
]

table = doc.add_table(rows=len(code_lines), cols=1)
table.style = 'Table Grid'

for i, line in enumerate(code_lines):
    cell = table.cell(i, 0)
    cell.text = line
    # Заливка ячейки светло-жёлтым
    shading_elm = cell._element.get_or_add_tcPr()
    shading = shading_elm.makeelement(qn('w:shd'), {
        qn('w:fill'): 'FFFFCC',
        qn('w:val'): 'clear'
    })
    shading_elm.append(shading)
    # Устанавливаем моноширинный шрифт
    for paragraph in cell.paragraphs:
        for run in paragraph.runs:
            run.font.name = 'Consolas'
            run.font.size = Pt(9)

doc.save('code_table.docx')
    

Проблема: Таблица может быть неудобна для длинного кода (много строк). Кроме того, автоматическая нумерация строк отсутствует.

Совет: Для подсветки синтаксиса используйте библиотеку pygments и вставляйте HTML-форматированный код через OPC-пакет, но это сложнее.

Как через win32com автоматизировать Word и вставить код Python с сохранением форматирования?

С помощью pywin32 (только Windows) можно управлять Word через COM-объект. Это позволяет использовать встроенные стили Word, например, «Код» или настроить шрифт и заливку.


import win32com.client as win32

word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible = False
doc = word.Documents.Add()
selection = word.Selection

code = '''def example():
    return 42'''

# Вставляем текст
selection.TypeText(code)
# Применяем стиль «Код» (если он есть) или задаём шрифт
selection.Font.Name = 'Consolas'
selection.Font.Size = 10
selection.ParagraphFormat.SpaceBefore = 6
selection.ParagraphFormat.SpaceAfter = 6

doc.SaveAs('code_via_com.docx')
doc.Close()
word.Quit()
    

Проблема: Требуется установленный Microsoft Word. Фоновое форматирование не применяется автоматически.

Ошибка: Если не указать полный путь при сохранении, файл может быть создан в папке по умолчанию.

Как вставить код Python в Word через буфер обмена с сохранением разметки?

Используйте модуль pyperclip для копирования отформатированного кода из редактора IDE, например, из VS Code с подсветкой синтаксиса, а затем вставьте в Word.


import pyperclip
# Предполагается, что код уже скопирован в буфер (Ctrl+C)
# или его можно прочитать из файла и сформатировать
with open('script.py', 'r', encoding='utf-8') as f:
    code = f.read()
# Если нужно добавить HTML-разметку для подсветки - используйте pygments
pyperclip.copy(code)
print('Код скопирован. Вставьте в Word (Ctrl+V).')
    

Проблема: Форматирование (шрифт, фон) не сохраняется при простой вставке - Word вставляет обычный текст.

Решение: В редакторе кода включите копирование с подсветкой (например, в VS Code команда «Copy with Syntax Highlighting») или используйте промежуточный HTML-буфер с помощью pygments и win32clipboard.

Как использовать Markdown для вставки кода Python в Word через pandoc?

Напишите код в Markdown-файле с блоками ```python, затем с помощью pandoc конвертируйте в DOCX. Подсветка синтаксиса поддерживается через фильтр pandoc-code-highlight или через встроенные возможности.


# example.md
```python
print("Hello")
```
# Команда:
pandoc example.md -o example.docx --highlight-style pygments
    

Проблема: Необходима установка pandoc и настройка стилей подсветки. Не все темы корректно переносятся в Word.

Совет: Используйте стиль tango или breezedark для максимальной совместимости.

Расширенные примеры вставки кода Python в Word

Пример 1. Вставка многострочного кода с нумерацией строк и подсветкой через python-docx и pygments

Используем pygments для генерации HTML-разметки с подсветкой, затем конвертируем её в элементы Word через python-docx. Это даёт полноценную подсветку синтаксиса прямо в документе.

Пример

from docx import Document
from docx.shared import Pt, Inches
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter
import re

def add_code_block(doc, code, language='python'):
    lexer = PythonLexer()
    formatter = HtmlFormatter(nowrap=True, style='colorful')
    highlighted = highlight(code, lexer, formatter)
    # Преобразуем HTML в run'ы с соответствующим форматированием
    # Это упрощённый парсинг - для продакшена лучше использовать lxml
    p = doc.add_paragraph()
    parts = re.split(r'()', highlighted)
    for part in parts:
        if part.startswith(']+>', '', part)
            run = p.add_run(text)
            run.font.color.rgb = RGBColor.from_string(color)
            run.font.name = 'Consolas'
            run.font.size = Pt(9)
        else:
            # Обычный текст (может быть пробелами или переводом строки)
            if part:
                run = p.add_run(part)
                run.font.name = 'Consolas'
                run.font.size = Pt(9)
    return p

doc = Document()
code_example = '''def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

print(factorial(5))'''
add_code_block(doc, code_example)
doc.save('highlighted_code.docx')
print('Документ с подсветкой синтаксиса создан.')
Документ содержит код с цветами ключевых слов, строк, чисел, как в IDE.

Пример 2. Вставка кода как изображения (для абсолютной точности отображения)

Иногда проще вставить скриншот кода, особенно если используются редкие шрифты. Python может сгенерировать изображение кода с помощью Pillow и вставить его в Word.

Пример

from docx import Document
from docx.shared import Inches
from PIL import Image, ImageDraw, ImageFont
import io

def code_to_image(code, font_path='C:/Windows/Fonts/Consolas.ttf', font_size=14):
    font = ImageFont.truetype(font_path, font_size)
    lines = code.split('\n')
    # Определяем размер изображения
    line_heights = [font.getbbox(line)[3] - font.getbbox(line)[1] for line in lines]
    max_height = max(line_heights)
    line_spacing = 4
    total_height = len(lines) * (max_height + line_spacing) + 20
    # Определяем максимальную ширину строки
    widths = [font.getbbox(line)[2] - font.getbbox(line)[0] for line in lines]
    max_width = max(widths) + 20
    img = Image.new('RGB', (max_width, total_height), 'white')
    draw = ImageDraw.Draw(img)
    y = 10
    for line in lines:
        draw.text((10, y), line, font=font, fill='black')
        y += max_height + line_spacing
    return img

doc = Document()
code = 'for i in range(10):\n    print(i)'
img = code_to_image(code)
# Сохраняем в байтовый поток
stream = io.BytesIO()
img.save(stream, format='PNG')
# Вставляем изображение в документ
doc.add_picture(stream, width=Inches(4))
doc.save('code_as_image.docx')
print('Готово.')
Документ содержит изображение кода, которое нельзя редактировать, но внешний вид гарантирован.

Пример 3. Вставка кода с использованием стилей Word (через python-docx)

Создайте собственный стиль «Код Python» в документе, задайте шрифт, размер, фон абзаца и применяйте его к абзацам с кодом.

Пример

from docx import Document
from docx.shared import Pt, RGBColor, Inches
from docx.enum.style import WD_STYLE_TYPE

doc = Document()
# Создаём стиль
style = doc.styles.add_style('PythonCode', WD_STYLE_TYPE.PARAGRAPH)
font = style.font
font.name = 'Consolas'
font.size = Pt(10)
font.color.rgb = RGBColor(0, 0, 0)
# Фон абзаца (заливка всего абзаца) - через XML
pf = style.paragraph_format
pf.space_before = Pt(6)
pf.space_after = Pt(6)
# Добавляем shading через элемент w:shd (не все версии python-docx поддерживают напрямую)

# Вставляем код с этим стилем
p = doc.add_paragraph('import sys\nprint(sys.version)', style='PythonCode')
doc.save('styled_code.docx')
Стиль применяется к абзацу, но фон может не отобразиться, если не прописать shading в XML.

Пример 4. Массовая вставка нескольких файлов кода Python в один документ Word

Обходите папку с .py файлами и вставляйте каждый файл как отдельный блок с заголовком-именем файла.

Пример

import os
from docx import Document

doc = Document()
source_dir = 'C:/myproject'
for filename in sorted(os.listdir(source_dir)):
    if filename.endswith('.py'):
        # Заголовок
        doc.add_heading(filename, level=2)
        with open(os.path.join(source_dir, filename), 'r', encoding='utf-8') as f:
            code = f.read()
        # Вставка кода (предыдущие методы)
        p = doc.add_paragraph()
        run = p.add_run(code)
        run.font.name = 'Consolas'
        run.font.size = Pt(10)
        doc.add_paragraph()  # разделитель
doc.save('all_codes.docx')
print('Создан документ с', len(source_dir), 'файлами.')
Документ содержит все файлы проекта, каждый с заголовком и моноширинным текстом.

Вставка кода Python в Word - comments

En
как вставить код python в word (python)