Автоматизация офисных форматов: Excel в Python

Раздел: 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 отключает запись индекса.

Типичные ошибки: отсутствие движка (engine) при чтении больших файлов; проблемы с кодировкой (укажите engine='openpyxl' или 'xlrd'); несовместимость версий openpyxl. При чтении файлов с формулами используйте 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')

Цель: создание настраиваемых отчетов с условным форматированием, диаграммами, защитой листов.

Проблемы: openpyxl не читает формулы, а только их значения (если файл был сохранен с вычислениями). Для получения вычисленных значений используйте 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'})

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

Ошибки: xlsxwriter не поддерживает чтение; при записи формул необходимо использовать строки в английской локализации.

Как работать со старыми файлами 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')

Цель: поддержка устаревших форматов в корпоративной среде.

Важно: xlrd больше не обновляется, рекомендуется мигрировать на .xlsx. Для чтения .xls также можно использовать openpyxl с ограничениями.

Как управлять приложением 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, недоступным через другие библиотеки.

Проблемы: требует установленного Excel, работает только на Windows; возможны утечки памяти, если не закрыть объекты.

Выбор подходящей библиотеки зависит от конкретной задачи. Для большинства аналитических задач достаточно 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 (с поддержкой макросов).

Работа с данными Excel в Python - comments

En
Python данные в excel (python)