Вставка кода 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), 'файлами.')
Документ содержит все файлы проекта, каждый с заголовком и моноширинным текстом.