Автоматизация офисных форматов: Excel в Python
Работа с данными Excel в Python
Python предоставляет множество библиотек для взаимодействия с файлами Excel. В зависимости от задачи - будь то чтение таблиц, создание сложных отчётов с форматированием или автоматизация самого приложения Excel - можно выбрать подходящий инструмент. В этой части рассмотрим наиболее эффективное решение и несколько альтернатив с примерами кода и указанием типичных проблем.
Как максимально быстро и удобно читать и записывать табличные данные Excel?
Библиотека pandas в сочетании с openpyxl (для .xlsx) или xlrd (для .xls) позволяет обрабатывать данные без лишних сложностей. Она автоматически распознает типы столбцов, пропуски, индексы. Это основное решение для анализа данных.
import pandas as pd
# Чтение файла
df = pd.read_excel('data.xlsx', sheet_name='Лист1', header=0)
print(df.head())
Python данные в excel (работа с данными excel в python)
Имя Возраст 0 Иван 25 1 Мария 30
Пояснение: pd.read_excel принимает путь, имя листа, строку заголовка. Можно указать диапазон столбцов, пропуск строк, обработку дат. Запись выполняется через df.to_excel().
df.to_excel('output.xlsx', sheet_name='Отчет', index=False)
Аргумент index=False отключает запись индекса.
data_only=True для получения вычисленных значений.
Как создать сложный отчет с форматированием ячеек, объединением и формулами?
Библиотека openpyxl предоставляет полный контроль над структурой файла. Она работает только с .xlsx. Подходит для задач, где требуется точное управление внешним видом.
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill
wb = Workbook()
ws = wb.active
ws.title = 'Отчет'
# Заголовки
ws['A1'] = 'Наименование'
ws['B1'] = 'Сумма'
ws['A1'].font = Font(bold=True)
ws['B1'].alignment = Alignment(horizontal='center')
# Данные
ws.append(['Товар1', 100])
ws.append(['Товар2', 200])
# Формула
ws['B4'] = '=SUM(B2:B3)'
ws['B4'].number_format = '#,##0.00'
wb.save('report.xlsx')
Цель: создание настраиваемых отчетов с условным форматированием, диаграммами, защитой листов.
data_only=True при открытии.
Как записать большой DataFrame с минимальным потреблением памяти?
xlsxwriter оптимизирован для записи больших объемов данных. Он не умеет читать файлы, но отлично подходит для создания xlsx с форматированием.
import pandas as pd
import xlsxwriter
df = pd.DataFrame({'A': range(100000), 'B': range(100000, 200000)})
with pd.ExcelWriter('large.xlsx', engine='xlsxwriter') as writer:
df.to_excel(writer, sheet_name='BigData', index=False)
worksheet = writer.sheets['BigData']
worksheet.set_column('A:A', 20)
worksheet.add_table('A1:B100001', {'name': 'DataTable'})
Используйте для больших файлов, когда важна производительность и мало потребления памяти.
Как работать со старыми файлами Excel 97-2003 (.xls)?
Для чтения .xls применяется xlrd (версия 1.2.0 - последняя, поддерживающая .xls). Для записи используйте xlwt.
import xlrd
workbook = xlrd.open_workbook('old.xls')
sheet = workbook.sheet_by_index(0)
for row in range(sheet.nrows):
print(sheet.row_values(row))
Запись:
import xlwt
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('Лист1')
sheet.write(0, 0, 'Привет')
workbook.save('new.xls')
Цель: поддержка устаревших форматов в корпоративной среде.
Как управлять приложением Excel из Python (запуск макросов, печать)?
Библиотека win32com.client позволяет взаимодействовать с Excel через COM-интерфейс (только Windows).
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = False
wb = excel.Workbooks.Open('C:\\path\\file.xlsx')
ws = wb.Worksheets('Лист1')
ws.Cells(1,1).Value = 'Новое значение'
wb.Save()
excel.Quit()
Применяется для автоматизации процессов, требующих запуска макросов VBA или доступа к функциям Excel, недоступным через другие библиотеки.
Выбор подходящей библиотеки зависит от конкретной задачи. Для большинства аналитических задач достаточно pandas. Для сложного форматирования лучше openpyxl или xlsxwriter. Для устаревших форматов - xlrd/xlwt, а для полного контроля через COM - win32com.
Дополнительные расширенные примеры
Пример 1: Чтение большого файла с пропуском строк и обработкой ошибок
Иногда требуется прочитать только определённые строки из файла, исключая заголовки или пустые участки. Используем pandas с параметрами skiprows и nrows.
import pandas as pd
# Пропускаем первые 5 строк, читаем 1000 строк, начиная с 6-й
df = pd.read_excel('big_file.xlsx', skiprows=5, nrows=1000)
print(df.shape)
print(df.head(2))
(1000, 15) Col1 Col2 0 a b 1 c d
Пояснение: skiprows может быть списком номеров строк для пропуска. nrows ограничивает количество загружаемых строк. Это полезно для предварительного просмотра данных без загрузки всего файла.
Пример 2: Запись DataFrame с условным форматированием через openpyxl
Используем openpyxl для добавления условного форматирования, раскрашивая ячейки по значению.
import pandas as pd
from openpyxl import load_workbook
from openpyxl.formatting.rule import CellIsRule
from openpyxl.styles import PatternFill
# Создаём простой DataFrame и сохраняем
df = pd.DataFrame({'Значение': [10, 25, 5, 30]})
df.to_excel('temp.xlsx', index=False)
# Загружаем и добавляем форматирование
wb = load_workbook('temp.xlsx')
ws = wb.active
fill = PatternFill(start_color='FF0000', end_color='FF0000', fill_type='solid')
rule = CellIsRule(operator='greaterThan', formula=['20'], fill=fill)
ws.conditional_formatting.add('A1:A10', rule)
wb.save('colored_report.xlsx')
Результат: ячейки со значениями больше 20 будут выделены красным. Метод add принимает диапазон и правило. openpyxl поддерживает также DataBarRule, ColorScaleRule и другие.
Пример 3: Создание сводной таблицы с xlsxwriter
xlsxwriter позволяет добавлять сводные таблицы (pivot tables) напрямую.
import pandas as pd
import xlsxwriter
# Исходные данные
df = pd.DataFrame({
'Город': ['Москва', 'СПб', 'Москва', 'СПб'],
'Продажи': [100, 150, 200, 250]
})
with pd.ExcelWriter('pivot.xlsx', engine='xlsxwriter') as writer:
df.to_excel(writer, sheet_name='Data', index=False)
workbook = writer.book
worksheet = writer.sheets['Data']
# Добавляем сводную таблицу
pivot_table = workbook.add_worksheet('Сводная')
pivot_table.add_table('A1:B6', {'data': None}) # не обязательно, но для наглядности
# Формируем сводную через формулу
pivot_table.write('A1', 'Город')
pivot_table.write('B1', 'Сумма продаж')
pivot_table.write('A2', 'Москва')
pivot_table.write('B2', '=SUMIF(Data!A2:A5,A2,Data!B2:B5)')
pivot_table.write('A3', 'СПб')
pivot_table.write('B3', '=SUMIF(Data!A2:A5,A3,Data!B2:B5)')
Результат: в файле будет лист 'Data' с исходными данными и лист 'Сводная' с суммами по городам, вычисленными формулами. xlsxwriter не умеет читать данные, поэтому сводные таблицы создаются через формулы или можно встроить сводную через openpyxl, если требуется чтение.
Пример 4: Запуск макроса VBA через win32com
Если в файле есть макрос, его можно вызвать из Python.
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = False
wb = excel.Workbooks.Open('C:\\test\with_macro.xlsm')
excel.Application.Run('Макрос1')
wb.Save()
excel.Quit()
Результат: макрос выполнится, файл сохранится. Важно: имя макроса должно быть указано без пробелов, а файл должен быть в формате .xlsm (с поддержкой макросов).