Для одной и той же горизонтальной страницы таблицы в Word не меняйте ориентацию всей статьи.

В том же документе Word только страница таблицы должна быть в альбомной ориентации. Не меняйте всю статью на альбомную ориентацию. В этой статье сначала создаются все разделы, затем извлекается целевой раздел по индексу, задаются направление, ширина и высота страницы соответственно, сохраняются и перечитываются, а также подтверждается, что ни один из других разделов не был изменен.

Когда только определенные страницы в документе Word должны иметь альбомную ориентацию, наиболее распространенной ошибкой является непосредственное изменение всего документа на альбомную ориентацию или поворот таблицы, а затем ее содержимое обрезается. Эта статья предназначена для разработчиков и групп документов, которым необходимо использовать python-docx для автоматической обработки макета Word. В нем объясняется, как изменить только ориентацию страницы целевого раздела.

Ключом к пониманию является различие между разрывами страниц и разрывами разделов. Разрывы страниц управляют только разрывами строк и не влияют на ориентацию страницы, размер бумаги и поля; эти свойства макета привязаны к «разделам». Прочитав эту статью, вы сможете сначала создать все разделы, затем извлечь целевой раздел по индексу, установить направление, ширину и высоту соответственно и перечитать после сохранения, чтобы убедиться, что другие разделы не были изменены. Подробную информацию об API, связанную с разделом, см. на странице Официальная документация разделов python-docx.

Вывод в одном предложении: Word делает страницы таблиц только горизонтальными. Как это установить?

Создайте отдельный раздел только для контента, который должен быть горизонтальным, поменяйте местами ширину и высоту и задайте направление для этого раздела, а остальные разделы оставьте вертикальными.

твоя ситуацияРекомендуемые практикипричина
Нет разрывов разделов до и после целевой страницы.Сначала используйте add_section() для разделения, затем установите направление.Атрибуты макета хранятся в разделах. Вы не можете изменить только целевую страницу, не разделяя разделы.
Установлен только LANDSCAPE, но ширина и высота не меняются местами.Поменяйте местами page_width и page_height одновременно.Простое изменение ориентации приведет к неправильному размеру бумаги, а содержимое может быть обрезано при экспорте PDF.
Таблица по-прежнему обрезается после установки альбомной ориентации.Проверьте левое и правое поля раздела или уменьшите ширину таблицы.Код не может определить соответствие между формой и бумагой за вас.
В документе имеются постоянные разрывы разделов, а ориентация неправильная.Перейдите к разрыву раздела следующей страницы и вручную подтвердите тип раздела.Непрерывные разрывы разделов без разрывов страниц могут легко вызвать визуальный беспорядок.

Разрывы разделов являются настоящим носителем атрибутов макета

В стандарте OpenXML элемент <w:sectPr> определяет макет страницы. Документ может содержать несколько разделов, каждый из которых имеет свою ширину, высоту, ориентацию и поля. Когда вызывается document.add_section(), python-docx создаст новый <w:sectPr> в конце текущего документа, и контент, добавленный после этого, будет принадлежать этому новому разделу.

Если вы попытаетесь изменить направление, изменив стиль абзаца или свойства таблицы, это обычно не сработает, поскольку у этих объектов нет полей для хранения информации о макете.

Логика работы: сначала разделить на разделы, затем взять разделы и, наконец, установить

  1. Расположите диапазон контента, который должен быть горизонтальным.
  2. Убедитесь, что этот контент выделен в отдельный раздел и при необходимости разделен с помощью add_section().
  3. Сначала создайте все разделы, а затем получите целевой раздел в соответствии с индексом, чтобы не перепутать объект-заглушку, сохраненный перед добавлением раздела, в качестве исходного раздела.
  4. Поменяйте местами page_width и page_height для этого раздела и установите для orientation значение WD_ORIENT.LANDSCAPE.
  5. После сохранения перечитайте файл и проверьте, остались ли неизменными направление, ширина и высота других участков.

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

Пример автономной композиции

Следующий код создает ввод в памяти. Все данные представляют собой синтетические образцы. Текущие записи используются только для иллюстрации логики вызова API и не являются гарантией всех реальных файлов или эффектов продукта. Зависимая библиотека — python-docx. Пожалуйста, запустите его в закрытой среде проекта. Версия должна поддерживать перечисление WD_ORIENT (0.8.11 и выше).

from docx import Document
from docx.enum.section import WD_ORIENT, WD_SECTION
from io import BytesIO
doc = Document()
doc.add_paragraph("Portrait intro")
doc.add_section(WD_SECTION.NEW_PAGE)
doc.add_paragraph("Landscape middle")
doc.add_section(WD_SECTION.NEW_PAGE)
doc.add_paragraph("Portrait end")
middle = doc.sections[1]
width, height = middle.page_width, middle.page_height
middle.orientation = WD_ORIENT.LANDSCAPE
middle.page_width, middle.page_height = max(width, height), min(width, height)
out = BytesIO()
doc.save(out)
out.seek(0)
restored = Document(out)
assert len(restored.sections) == 3
assert restored.sections[1].orientation == WD_ORIENT.LANDSCAPE
assert restored.sections[1].page_width > restored.sections[1].page_height
assert restored.sections[0].orientation == WD_ORIENT.PORTRAIT
assert restored.sections[2].orientation == WD_ORIENT.PORTRAIT

Правильный сценарий ввода: документ содержит три раздела: первый раздел представляет собой вертикальный текст, второй раздел размещается с широкими таблицами, а третий раздел возвращается в вертикальное положение. Ожидаемый результат: orientation — это LANDSCAPE во втором разделе, page_width больше, чем page_height, а оставшиеся два раздела остаются PORTRAIT.

Первый ввод границы: документ, содержащий только один раздел. Непосредственная установка горизонтального направления на sections[0] приведет к тому, что весь документ станет горизонтальным. Сначала вам следует вызвать add_section(), чтобы разделить содержимое, а затем работать с вновь созданными разделами.

Ввод второй границы: установлен ЛАНДШАФТ, но исходный размер по вертикали сохраняется. Код должен проверять page_width >= page_height как предикат.

📊 Основное сравнение: разрывы страниц и разделов

СпособМожно ли перенести направление страницы?Типичное использованиеНа что следует обратить внимание
Разрыв страницыне могуУправляйте только оберткой контентаНевозможно использовать для создания альбомной ориентации только одной страницы.
Разрыв раздела следующей страницыспособныйЧастичный ландшафт, переключение полейВам необходимо задать ширину, высоту и направление секции отдельно.
непрерывный разрыв разделаспособныйПереключение макетов на одной страницеЕсли вы не измените страницы, это может привести к визуальной путанице и потребует ручного принятия решения.

🎯 Какой метод подходит вам?

если ты……

– Разрывы разделов до и после целевой страницы отсутствуют: сначала разделите разделы, а затем задайте направление целевого раздела.

  • Документ состоит только из одного раздела и должен быть лишь частично горизонтальным: сначала вызовите add_section(), не изменяйте sections[0] напрямую.
  • Таблица обрезается после альбомной ориентации: проверьте левое и правое поля раздела или уменьшите ширину таблицы.
  • Документ содержит последовательные разрывы разделов. Оцените, следует ли заменить его на разрыв раздела следующей страницы, и подтвердите вручную.
  • Шифрование файлов, повреждение структуры XML или разделы, динамически созданные макросами: сначала исправьте или преобразуйте формат вручную; код в этой статье неприменим.

❓ Часто задаваемые вопросы (FAQ)

1. Почему направление страницы не меняется после настройки свойств абзаца или таблицы?

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

2. Достаточно ли просто выставить ориентацию ЛАНДШАФТ?

недостаточно. Также необходимо поменять местами page_width и page_height, иначе при открытии Word размер бумаги будет отображаться некорректно, а при экспорте PDF содержимое может быть обрезано.

3. Почему нельзя напрямую задать горизонтальное направление для разделов[0]?

Если документ содержит только один раздел, его изменение повлияет на весь документ. Частичную трансверсал необходимо сначала разделить на независимые секции с помощью add_section().

4. Что делать, если верхний и нижний колонтитулы смещены по горизонтали?

Изменения атрибутов раздела не влияют на статус ссылки заголовка. Вам необходимо проверить настройки расстояния между верхним и нижним колонтитулом отдельно. Это самостоятельная проблема.

📝 Резюме

Ключ к тому, чтобы сделать страницу таблицы только горизонтальной, — это поместить целевой контент в отдельный раздел и одновременно поменять ширину, высоту и ориентацию. После сохранения перечитайте и проверьте другие разделы. После проверки кода необходимо подтвердить эффект невооруженным глазом после экспорта в Word или PDF.

Подключите OmniDoc к помощнику искусственного интеллекта: создавайте и изменяйте Word, Excel и PPT одним предложением.

Обновлено 2026-11-15