Добавление строки в таблицу word python

Обновлено: 07.07.2024

Я хотел бы вставить пару строк в середину таблицы, используя python-docx . Есть ли способ сделать это? Я пытался использовать Подход похож на вставку картинок, но это не сработало.

Если нет, я был бы признателен за любую подсказку, какой модуль лучше подходит для этой задачи. Спасибо.

Вот моя попытка подражать идее для вставки картинки. Это не правильно. Объект «Выполнить» не имеет атрибута «add_row».

Краткий ответ - нет. В API нет метода Table.insert_row() .

Возможный подход - написать так называемую «функцию обхода», которая напрямую манипулирует базовым XML. Вы можете получить любой заданный элемент XML (например, <w:tbl> в этом случае или, возможно, <w:tr> ) из его python-docx proxy объекта. Например:

Что дает вам отправную точку в иерархии XML. Оттуда вы можете создать новый элемент с нуля или скопировав и используя lxml._Element вызовы API, чтобы поместить его в правильную позицию в XML.

Это немного продвинутый подход, но, вероятно, самый простой вариант. Насколько мне известно, нет никаких других пакетов Python, предоставляющих более обширный API. Альтернативой было бы сделать что-то в Windows с их COM API или чем-то еще из VBA, возможно IronPython. Это будет работать только в небольшом масштабе (настольный компьютер, а не сервер) под управлением ОС Windows.

Поиск по python-docx workaround function и python-pptx workaround function найдет вам несколько примеров.

Addnext () в lxml.etree кажется лучшим вариантом использовать и он работает нормально, и единственное, я не могу установить высоту строки, поэтому, пожалуйста, предоставьте некоторые ответы, если вы знаете!

Хотя в соответствии с документацией python-docx не существует непосредственно применимого API для этого, есть простое решение без использования каких-либо других библиотек, таких как lxml, просто используйте базовую структуру данных, предоставляемую python-docx, то есть CT_Tbl, CT_Row и т. Д. Эти классы имеют общие методы, такие как addnext, addprevious, которые могут удобно добавлять элемент как родные элементы сразу после / до текущего элемента. Таким образом, проблема может быть решена, как показано ниже (протестировано на python-docx v0.8.10)

Это должно решить проблему

Вы можете вставить строку в конец таблицы, а затем переместить ее в другую позицию следующим образом:

Документ электронной таблицы Excel называется рабочей книгой. Каждая книга может хранить некоторое количество листов. Лист, просматриваемый пользователем в данный момент, называется активным. Лист состоит из из столбцов (адресуемых с помощью букв, начиная с A) и строк (адресуемых с помощью цифр, начиная с 1).

Модуль OpenPyXL не поставляется вместе с Python, поэтому его предварительно нужно установить:


Чтение файлов Excel


А теперь небольшой скрипт:

Как получить другой лист книги:

Как сделать лист книги активным:

Как задать имя листа:

Объект Cell имеет атрибут value , который содержит значение, хранящееся в ячейке. Объект Cell также имеет атрибуты row , column и coordinate , которые предоставляют информацию о расположении данной ячейки в таблице.

К отдельной ячейке можно также обращаться с помощью метода cell() объекта Worksheet , передавая ему именованные аргументы row и column . Первому столбцу или первой строке соответствует число 1, а не 0:

Размер листа можно получить с помощью атрибутов max_row и max_column объекта Worksheet :

Чтобы преобразовать буквенное обозначение столбца в цифровое, следует вызвать функцию

Чтобы преобразовать цифровое обозначение столбуа в буквенное, следует вызвать функцию

Для вызова этих функций загружать рабочую книгу не обязательно.

Используя срезы объектов Worksheet , можно получить все объекты Cell , принадлежащие определенной строке, столбцу или прямоугольной области.

Выводим значения второй колонки:

Выводим строки с первой по третью:

Для доступа к ячейкам конкретной строки или столбца также можно воспользоваться атрибутами rows и columns объекта Worksheet .

Выводим значения всех ячеек листа:

Выводим значения второй строки (индекс 1):

Выводим значения второй колонки (индекс 1):

Запись файлов Excel

Метод create_sheet() возвращает новый объект Worksheet , который по умолчанию становится последним листом книги. С помощью именованных аргументов title и index можно задать имя и индекс нового листа.

Метод remove() принимает в качестве аргумента не строку с именем листа, а объект Worksheet . Если известно только имя листа, который надо удалить, используйте wb[sheetname] . Еще один способ удалить лист — использовать инструкцию del wb[sheetname] .

Не забудьте вызвать метод save() , чтобы сохранить изменения после добавления или удаления листа рабочей книги.

Запись значений в ячейки напоминает запись значений в ключи словаря:

Заполняем таблицу 3x3:


Можно добавлять строки целиком:

Стилевое оформление

Для настройки шрифтов, используемых в ячейках, необходимо импортировать функцию Font() из модуля openpyxl.styles :

Ниже приведен пример создания новой рабочей книги, в которой для шрифта, используемого в ячейке A1 , устанавливается шрифт Arial , красный цвет, курсивное начертание и размер 24 пункта:

Именованные стили применяются, когда надо применить стилевое оформление к большому количеству ячеек.

Добавление формул

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

Эта инструкция сохранит =SUM(B1:B8) в качестве значения в ячейке B9 . Тем самым для ячейки B9 задается формула, которая суммирует значения, хранящиеся в ячейках от B1 до B8 .

Формула Excel — это математическое выражение, которое создается для вычисления результата и которое может зависеть от содержимого других ячеек. Формула в ячейке Excel может содержать данные, ссылки на другие ячейки, а также обозначение действий, которые необходимо выполнить.

Использование ссылок на ячейки позволяет пересчитывать результат по формулам, когда происходят изменения содержимого ячеек, включенных в формулы. Формулы Excel начинаются со знака = . Скобки () могут использоваться для определения порядка математических операции.

Примеры формул Excel: =27+36 , =А1+А2-АЗ , =SUM(А1:А5) , =MAX(АЗ:А5) , =(А1+А2)/АЗ .

Хранящуюся в ячейке формулу можно читать, как любое другое значение. Однако, если нужно получить результат расчета по формуле, а не саму формулу, то при вызове функции load_workbook() ей следует передать именованный аргумент data_only со значением True .

Настройка строк и столбцов

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

Настройка высоты строк и ширины столбцов

Объекты Worksheet имеют атрибуты row_dimensions и column_dimensions , которые управляют высотой строк и шириной столбцов.


Атрибуты row_dimension s и column_dimensions представляют собой значения, подобные словарю. Атрибут row_dimensions содержит объекты RowDimensions , а атрибут column_dimensions содержит объекты ColumnDimensions . Доступ к объектам в row_dimensions осуществляется с использованием номера строки, а доступ к объектам в column_dimensions — с использованием буквы столбца.

Для указания высоты строки разрешено использовать целые или вещественные числа в диапазоне от 0 до 409. Для указания ширины столбца можно использовать целые или вещественные числа в диапазоне от 0 до 255. Столбцы с нулевой шириной и строки с нулевой высотой невидимы для пользователя.

Объединение ячеек

Ячейки, занимающие прямоугольную область, могут быть объединены в одну ячейку с помощью метода merge_cells() рабочего листа:


Чтобы отменить слияние ячеек, надо вызвать метод unmerge_cells() :

Закрепление областей

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

У объекта Worksheet имеется атрибут freeze_panes , значением которого может служить объект Cell или строка с координатами ячеек. Все строки и столбцы, расположенные выше и левее, будут заблокированы.

Значение атрибута freeze_panes Заблокированные строки и столбцы
sheet.freeze_panes = 'A2' Строка 1
sheet.freeze_panes = 'B1' Столбец A
sheet.freeze_panes = 'C1' Столбцы A и B
sheet.freeze_panes = 'C2' Строка 1 и столбцы A и B
sheet.freeze_panes = None Закрепленные области отсутствуют

Диаграммы

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

  1. создать объект Reference на основе ячеек в пределах выделенной прямоугольной области;
  2. создать объект Series , передав функции Series() объект Reference ;
  3. создать объект Chart;
  4. дополнительно можно установить значения переменных drawing.top , drawing.left , drawing.width , drawing.height объекта Chart , определяющих положение и размеры диаграммы;
  5. добавить объект Chart в объект Worksheet .
  1. Объект Worksheet , содержащий данные диаграммы.
  2. Два целых числа, представляющих верхнюю левую ячейку выделенной прямоугольной области, в которых содержатся данные диаграммы: первое число задает строку, второе — столбец; первой строке соответствует 1, а не 0.
  3. Два целых числа, представляющих нижнюю правую ячейку выделенной прямоугольной области, в которых содержатся данные диаграммы: первое число задает строку, второе — столбец.


Аналогично можно создавать графики, точечные и круговые диаграммы, вызывая методы:


Хотя в среднем для каждодневных задач автоматизация не требуется, бывают случаи, когда она может быть необходима. Создание множества диаграмм, рисунков, таблиц и отчётов может утомить, если вы работаете вручную. Так быть не должно. Специально к старту нового потока курса Fullstack-разработчик на Python делимся с вами кейсом постройки конвейера на Python, с помощью которого Excel и Word легко интегрировать: нужно создать таблицы в Excel, а затем перенести результаты в Word, чтобы практически мгновенно получить отчёт.

Openpyxl

Встречайте Openpyxl — возможно, одну из самых универсальных связок [биндингов] с Python, которая сделает взаимодействие с Excel очень простым. Вооружившись этой библиотекой, вы сможете читать и записывать все нынешние и устаревшие форматы Excel, то есть xlsx и xls.

Openpyxl позволяет заполнять строки и столбцы, выполнять формулы, создавать 2D и 3D диаграммы, маркировать оси и заголовки, а также предоставляет множество других возможностей, которые могут пригодиться.

И самое важное — этот пакет позволяет вам перебирать бесконечное количество строк и столбцов в Excel, тем самым избавляя вас от всех этих надоедливых вычислений и построения графиков, которые вам приходилось делать раньше.

Python-docx

Затем идёт Python-docx, этот пакет для Word — то же самое, что Openpyxl для Excel. Если вы ещё не изучили его документацию, вам, вероятно, стоит взглянуть на неё. Python-docx — без преувеличения один из самых простых и понятных мне наборов инструментов, с которыми я работал с тех пор, как начал работать с самим Python.

Python-docx позволяет автоматизировать создание документов путём автоматической вставки текста, заполнения таблиц и рендеринга изображений в отчёт без каких-либо накладных расходов. Без лишних слов давайте создадим наш собственный автоматизированный конвейер. Запустите Anaconda (или любую другую IDE по вашему выбору) и установите эти пакеты:

Автоматизация Microsoft Excel

Сначала загрузим уже созданный лист Excel, вот так:


Теперь переберём все строки в нашей таблице, чтобы вычислить и вставить значения мощности, умножив ток на напряжение:

Как только это будет сделано, мы используем рассчитанные значения мощности, чтобы сгенерировать линейную диаграмму, которая будет вставлена ​​в указанную ячейку, код показан ниже:

Автоматически созданная таблица Excel

Автоматически созданная таблица Excel

Извлечение диаграммы

Теперь, когда мы сгенерировали нашу диаграмму, нам нужно извлечь её как изображение, чтобы мы могли использовать её в нашем отчёте Word. Сначала укажем точное местоположение файла Excel, а также место, где должно быть сохранено изображение диаграммы:

Затем откройте электронную таблицу, используя следующий метод:

Позднее вы сможете перебирать все объекты диаграммы в электронной таблице (если их несколько) и сохранять их в указанном месте:

Автоматизация Microsoft Word

Теперь, когда у нас есть сгенерированное изображение диаграммы, мы должны создать шаблон документа, который в принципе является обычным документом Microsoft Word (.docx), сформированным именно так, как мы хотим: отчёт содержит шрифты, размеры шрифтов, структуру и форматирование страниц.

Теперь всё, что нам нужно сделать, — создать плейсхолдеры для сгенерированного нами контента, то есть табличные значения и изображения, и объявить их с именами переменных, как показано ниже.

Шаблон документа Microsoft Word

Шаблон документа Microsoft Word

Любой сгенерированный контент, включая текст и изображения, может быть объявлен в двойных фигурных скобках >. В случае таблиц вам нужно создать таблицу со строкой шаблона со всеми включёнными столбцами, затем нужно добавить одну строку вверху и одну строку ниже со следующей нотацией:

На рисунке выше — имена переменных:

table_contents для словаря Python, в котором будут храниться наши табличные данные;

Index для ключей словаря (первый столбец);

Power, Current и Voltage для значений словаря (второй, третий и четвёртый столбцы).

Затем импортируем наш шаблонный документ в Python и создаём словарь, в котором будут храниться значения нашей таблицы:

Далее импортируем ранее созданное в Excel изображение диаграммы и создадим другой словарь для создания экземпляров всех объявленных в документе шаблона переменных-заполнителей:

И, наконец, визуализируем отчёт с нашей таблицей значений и изображением диаграммы:

Результаты

И вот — автоматически сгенерированный отчёт Microsoft Word с числами и созданной в Microsoft Excel диаграммой. Мы получили полностью автоматизированный конвейер, его можно использовать, чтобы создать столько таблиц, диаграмм и документов, сколько вам потребуется.

Автоматически сгенерированный отчёт

Автоматически сгенерированный отчёт

Исходный код

Вот мой репозиторий на GitHub с шаблоном документа и исходным кодом для этого туториала. А вот ссылка на курс Fullstack-разработчик на Python, который сделает из вас настоящего универсального солдата от кодинга.


Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

В предыдущем посте было рассмотрено как заполнить запрос в word с помощью python. В этот раз будет продемонстрировано как заполнить сразу несколько word документов данными из таблицы excel.

Перед тем как работать с программой, нам необходимо подготовить файл excel, где будут содержаться исходные данные. Создадим файл excel с такими данными или используем готовый:

image

Теперь обратимся к программе.

Так как мы должны считать excel файл, необходимо импортировать соответствующий модуль:


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


Мы создали пустой список, куда в дальнейшем добавляем значения из таблицы. Добавление происходит только, если в ячейке есть какие-то записи (не пустота).

После проделанных манипуляций, внесем собранные данные в шаблон word:


В итоге у нас будет готовый файл word с данными из таблицы. Только вот он один, да и называется шаблон-final. Как потом отличить документы друг от друга?

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


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

При исполнении программы может возникнуть ошибка:

image

Эта ошибка связана с тем, что в наименовании компании содержатся кавычки. Если из таблицы excel удалить кавычки, то файл word успешно сохранится с именем Компания-1.docx.

Осталось «размножить» документ, введя остальные данные из таблицы.

Здесь тоже все просто. Создаем цикл по нашим собранным данным:


В конце цикла «перепрыгиваем» на название столбца с именем компании, чтобы файл word сохранился с правильным наименованием.

Программа готова! Осталось только создать таблицу excel с компаниями, которые находятся на обслуживании.

Шаблон документа word – здесь.

---Update--- 08.11.2019

Читайте также: