Автоматизация Excel файлов с помощью openpyxl
Работа с 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 возвращает только значения, а не объекты ячеек. Полезно для больших файлов, так как не загружает все данные в память сразу.
Как создать новый 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.
Как внести изменения в существующий файл 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)
Стили применяются к объектам ячеек. Можно также определить стили как объекты и повторно использовать их для нескольких ячеек.
Создать или переименовать листы, скопировать данные между ними?
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 потребуется дополнительная библиотека.
Что делать, если файл не удаётся открыть или сохранить?
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() для освобождения ресурсов.
Расширенные примеры работы с 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 запрашивается пароль.