Автоматизация Excel файлов с помощью openpyxl

Раздел: Работа с данными -> Работа с Excel

Работа с Excel в Python через openpyxl

Библиотека openpyxl предоставляет возможности для чтения, записи и изменения файлов Excel формата .xlsx. Она не требует установки Microsoft Excel и поддерживает многие функции, включая стили, формулы и диаграммы.

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

import openpyxl
# Загрузка существующего файла
wb = openpyxl.load_workbook('example.xlsx')
# Выбор активного листа
ws = wb.active
# Чтение значения ячейки
value = ws['A1'].value
print(value)
# Изменение значения
ws['A1'] = 'Новое значение'
# Сохранение
wb.save('example_modified.xlsx')

код python в excel (код python в excel)

Этот подход подходит для большинства сценариев, когда требуется базовая обработка данных или создание простых отчетов. Проблемы могут возникнуть, если файл поврежден или содержит макросы (xlsm), для которых openpyxl поддерживает только чтение, но не выполнение макросов.

Типичные ошибки:
  • FileNotFoundError: если файл не существует; рекомендуется проверять существование файла с помощью os.path.exists.
  • Ошибка формата: openpyxl поддерживает только .xlsx, .xlsm, .xltx, .xltm; для .xls необходима библиотека xlrd или pyxlsb.

Как прочитать данные из определённого листа Excel?

import openpyxl
wb = openpyxl.load_workbook('data.xlsx')
# Выбор листа по имени
ws = wb['Лист1']
# Чтение всех строк с помощью iter_rows
for row in ws.iter_rows(min_row=1, max_row=ws.max_row, values_only=True):
    print(row)

Excel скрипты python (скрипты python для excel)

Метод iter_rows возвращает генератор кортежей значений. Параметр values_only=True возвращает только значения, а не объекты ячеек. Полезно для больших файлов, так как не загружает все данные в память сразу.

Ошибки: если указан неверный лист, возникнет KeyError. Рекомендуется предварительно проверять наличие листа через ws.title список.

Как создать новый Excel файл и записать данные?

import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
ws.title = 'Данные'
ws['A1'] = 'Имя'
ws['B1'] = 'Возраст'
ws.append(['Анна', 25])
ws.append(['Иван', 30])
wb.save('new_file.xlsx')

Python сохранить в excel (сохранение данных в excel с помощью python)

Метод append добавляет список в следующую пустую строку. Можно также записывать в определённые ячейки через индексацию. После записи обязательно вызывать save.

Ошибки: при сохранении в уже открытый другим приложением файл может возникнуть PermissionError. Закрыть файл или использовать другой путь.

Как внести изменения в существующий файл Excel, сохранив исходное форматирование?

import openpyxl
wb = openpyxl.load_workbook('template.xlsx')
ws = wb.active
ws['C5'] = 'Обновлено'
wb.save('template.xlsx')

Python таблица excel (таблица excel в python)

По умолчанию openpyxl загружает книгу с сохранением большинства элементов, включая стили, объединённые ячейки, ширину столбцов. Если требуется сохранить макросы, необходимо указать keep_vba=True при загрузке.

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

Как изменить шрифт, цвет фона или границы ячейки?

import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
wb = openpyxl.Workbook()
ws = wb.active
cell = ws['A1']
cell.value = 'Привет'
cell.font = Font(name='Arial', size=14, bold=True)
cell.fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')
cell.alignment = Alignment(horizontal='center')
thin_border = Border(
    left=Side(style='thin'),
    right=Side(style='thin'),
    top=Side(style='thin'),
    bottom=Side(style='thin')
)
cell.border = thin_border
wb.save('styled.xlsx')

библиотека openpyxl python (библиотека openpyxl в python)

Стили применяются к объектам ячеек. Можно также определить стили как объекты и повторно использовать их для нескольких ячеек.

Ошибки: если указать неверный код цвета или стиль границы, openpyxl выбросит исключение. Коды цветов должны быть шестнадцатеричными (без #).

Создать или переименовать листы, скопировать данные между ними?

import openpyxl
wb = openpyxl.Workbook()
ws1 = wb.active
ws1.title = 'Первый'
ws2 = wb.create_sheet('Второй')
ws2['A1'] = 'Лист 2'
ws3 = wb.create_sheet('Третий', 0)
# Копирование листа
wb.copy_worksheet(ws1)
wb.save('multi_sheet.xlsx')

Python excel openpyxl (работа с excel в python через openpyxl)

Метод copy_worksheet копирует стили и данные. Порядок листов можно менять с помощью move_sheet.

Ошибки: при копировании листа с объединёнными ячейками могут возникнуть проблемы; рекомендуется проверять.

Как вставить формулу SUM или VLOOKUP в ячейку?

import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
ws['A1'] = 10
ws['A2'] = 20
ws['A3'] = '=SUM(A1:A2)'
ws['B1'] = 5
ws['B2'] = '=VLOOKUP(A1, A1:B1, 2, False)'
wb.save('formulas.xlsx')

Формулы записываются как строки, начиная с '='. При открытии в Excel они будут вычислены. openpyxl не вычисляет формулы, а только сохраняет их. Для вычисления формул на Python потребуется дополнительная библиотека.

Ошибки: если формула содержит неправильный синтаксис, Excel отобразит #NAME? или #REF!. При сохранении openpyxl не проверяет корректность формулы.

Что делать, если файл не удаётся открыть или сохранить?

import openpyxl
import os

fpath = 'maybe_exists.xlsx'
try:
    wb = openpyxl.load_workbook(fpath)
except FileNotFoundError:
    print('Файл не найден. Будет создан новый.')
    wb = openpyxl.Workbook()
except openpyxl.utils.exceptions.InvalidFileException:
    print('Файл имеет неподдерживаемый формат.')
    wb = None

if wb:
    ws = wb.active
    ws['A1'] = 'Данные'
    try:
        wb.save(fpath)
    except PermissionError:
        print('Нет доступа для записи. Возможно файл открыт другой программой.')
        wb.save('backup.xlsx')

Обёртка try-except позволяет предотвратить аварийное завершение программы. Можно также использовать контекстный менеджер для автоматического закрытия? openpyxl не поддерживает контекстный менеджер напрямую, но можно вызывать close() для освобождения ресурсов.

Рекомендуется всегда закрывать книгу (wb.close()) при завершении работы, особенно при работе с большими файлами, чтобы избежать утечки памяти.

Расширенные примеры работы с openpyxl

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

Чтение больших файлов с read_only=True

Пример
import openpyxl
wb = openpyxl.load_workbook('big_data.xlsx', read_only=True)
ws = wb.active
for row in ws.iter_rows(values_only=True):
    if row[0] is None:
        break
    print(row)
wb.close()

Режим read_only загружает только структуру книги и читает строки по мере итерации. Это значительно экономит память при обработке файлов с миллионами строк. Однако в этом режиме запрещена запись и изменение.

(вывод каждой строки в виде кортежа значений)

Запись большого файла с write_only=True

Пример
import openpyxl
wb = openpyxl.Workbook(write_only=True)
ws = wb.create_sheet('Лист1')
ws.append(['Заголовок1', 'Заголовок2'])
for i in range(100000):
    ws.append([i, i+1])
wb.save('big_output.xlsx')

write_only=True ориентирован на высокопроизводительную запись: данные сразу пишутся на диск, минуя хранение в памяти. Нельзя использовать операции, требующие обхода всех ячеек (например, удаление строк или объединение ячеек).

Создаётся файл 'big_output.xlsx' с 100002 строками (включая заголовок).

Создание диаграммы

Пример
import openpyxl
from openpyxl.chart import BarChart, Reference
wb = openpyxl.Workbook()
ws = wb.active
data = [('Продукт', 'Продажи'),
        ('А', 30),
        ('Б', 45),
        ('В', 25)]
for row in data:
    ws.append(row)
chart = BarChart()
chart.type = 'col'
chart.title = 'Продажи по продуктам'
chart.y_axis.title = 'Количество'
ref = Reference(ws, min_col=2, min_row=1, max_row=4)
cats = Reference(ws, min_col=1, min_row=2, max_row=4)
chart.add_data(ref, titles_from_data=True)
chart.set_categories(cats)
ws.add_chart(chart, 'E1')
wb.save('chart_example.xlsx')

openpyxl поддерживает гистограммы, линейные, круговые и другие типы диаграмм. Диаграмму можно настроить, изменив цвета, легенду, стили осей.

Файл 'chart_example.xlsx' содержит лист с данными и столбчатую диаграмму.

Условное форматирование

Пример
import openpyxl
from openpyxl.formatting.rule import CellIsRule
from openpyxl.styles import PatternFill
wb = openpyxl.Workbook()
ws = wb.active
for i in range(1, 11):
    ws.cell(row=i, column=1, value=i)
green_fill = PatternFill(start_color='00FF00', end_color='00FF00', fill_type='solid')
ws.conditional_formatting.add('A1:A10',
                               CellIsRule(operator='greaterThan', formula=['5'],
                                          fill=green_fill))
wb.save('conditional.xlsx')

Условное форматирование автоматически изменяет внешний вид ячеек на основе их значений. Доступны также ColorScale, DataBar и IconSet.

Ячейки A1:A10: значения больше 5 залиты зелёным.

Работа с объединёнными ячейками

Пример
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
ws.merge_cells('A1:B2')
ws['A1'] = 'Объединённая ячейка'
ws['A1'].alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center')
wb.save('merged.xlsx')

Объединённые ячейки часто используются для заголовков. При объединении все ячейки, кроме верхней левой, очищаются. Значение хранится в верхней левой ячейке.

Файл 'merged.xlsx' с объединением A1:B2 и центрированным текстом.

Защита листа паролем

Пример
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
ws.protection.sheet = True
ws.protection.password = 'secret'
wb.save('protected.xlsx')

Установка защиты листа паролем предотвращает изменение содержимого без ввода пароля. openpyxl может только устанавливать защиту, но не открывать защищённые файлы.

Файл 'protected.xlsx' - при открытии в Excel запрашивается пароль.

Работа с Excel в Python через openpyxl - comments

En
Python excel openpyxl (python)