Как преобразовать данные Excel в списки, словари и объекты в Python
В серверной разработке на Python, аналитике данных и задачах автоматизации офисной работы чтение файлов Excel и преобразование их в удобные для программ обработки структуры данных является одной из самых распространённых задач.
Многие разработчики начинают работать с данными таблиц через числовые индексы, например row[2] или col[5]. Хотя такой подход позволяет быстро приступить к разработке, он приводит к серьёзной проблеме жёсткой привязки к строкам и столбцам. Код становится сложнее для чтения и поддержки, а любое изменение структуры таблицы — например, перестановка, добавление или удаление столбцов — может нарушить работу значительной части приложения.
В этой статье мы воспользуемся библиотекой Free Spire.XLS for Python, чтобы показать трёхэтапную эволюцию моделирования данных Excel:
Необработанные двумерные списки
Списки словарей
Списки пользовательских бизнес-объектов
Каждый подход подходит для определённых сценариев и уровней сложности. Отказавшись от жёстко заданных индексов, вы сможете сделать код обработки Excel более читаемым, поддерживаемым и масштабируемым.
Предварительные требования
Во всех примерах статьи используется пакет spire.xls, который позволяет читать, записывать, форматировать и пакетно обрабатывать файлы Excel без установки Microsoft Excel.
Установите библиотеку командой:
pip install spire.xls.free
Подход 1. Хранение данных Excel в виде двумерного списка
Как это работает
Это самый простой способ чтения данных Excel. Мы последовательно перебираем используемый диапазон листа по строкам и ячейкам, сохраняя все данные в двумерный список, который полностью повторяет структуру исходной таблицы.
Полный пример
from spire.xls import Workbook
# Загружаем книгу и рабочий лист
workbook = Workbook()
workbook.LoadFromFile("SalesReport.xlsx")
sheet = workbook.Worksheets[0]
# Получаем используемый диапазон
cell_range = sheet.AllocatedRange
# Сохраняем все данные в двумерный список
excel_data = []
for row_idx in range(cell_range.RowCount):
single_row = []
for col_idx in range(cell_range.ColumnCount):
# В Spire.XLS используются индексы, начинающиеся с 1
single_row.append(
cell_range[row_idx + 1, col_idx + 1].Value
)
excel_data.append(single_row)
# Освобождаем ресурсы
workbook.Dispose()
Преимущества и недостатки
Преимущества
Максимально простая реализация
Полностью сохраняет исходную структуру строк и столбцов
Не требует дополнительного преобразования данных
Недостатки
Доступ к данным осуществляется только через числовые индексы:
excel_data[row][col]
Такой код не несёт смысловой нагрузки. Если структура таблицы изменится, все ссылки на индексы придётся обновлять вручную, что усложняет поддержку и повышает риск ошибок.
Подходит для
Быстрых прототипов
Одноразовых скриптов
Матричных вычислений
Временного анализа данных
Для производственных приложений такая структура обычно не является оптимальным решением.
Подход 2. Преобразование строк в словари
Как это работает
Чтобы избавиться от жёстко заданных индексов столбцов, можно использовать первую строку как заголовки столбцов и преобразовать каждую последующую строку в словарь.
Вместо доступа к данным по позиции мы получаем доступ по имени поля. Это устраняет зависимость от порядка столбцов и значительно улучшает читаемость кода.
Полный пример
from spire.xls import Workbook
workbook = Workbook()
workbook.LoadFromFile("SalesReport.xlsx")
sheet = workbook.Worksheets[0]
cell_range = sheet.AllocatedRange
# Извлекаем заголовки из первой строки
rows = list(cell_range.Rows)
headers = [
cell_range[1, col_idx + 1].Value
for col_idx in range(cell_range.ColumnCount)
]
# Формируем список словарей
data_list = []
for row in rows[1:]: # Пропускаем строку заголовков
row_dict = {}
for idx, cell in enumerate(row.Cells):
row_dict[headers[idx]] = cell.Value
data_list.append(row_dict)
workbook.Dispose()
Преимущества и недостатки
Преимущества
Теперь данные можно получать по понятным именам полей:
data_list[0]["Sales"]
Преимущества такого подхода:
Более высокая читаемость кода
Независимость от порядка столбцов
Простая сериализация в JSON
Удобная интеграция с API и конвейерами обработки данных
Хорошая совместимость с Pandas
Недостатки
Структуры на основе словарей по-прежнему являются слабо типизированными. Перед использованием данных может потребоваться дополнительная проверка и преобразование типов.
Подходит для
Импорта и экспорта данных
Очистки и подготовки данных
Генерации полезной нагрузки для API
Бизнес-отчётности
Универсальной обработки Excel
Для большинства приложений это оптимальный баланс между простотой и удобством сопровождения.
Подход 3. Сопоставление строк с пользовательскими бизнес-объектами
Как это работает
При работе с фиксированными схемами данных и более сложной бизнес-логикой словари могут оказаться недостаточно удобными. Они не обеспечивают типобезопасность, поддержку IntelliSense и не предоставляют естественного места для размещения бизнес-правил.
Более надёжный подход заключается в создании класса бизнес-сущности и преобразовании каждой строки Excel в экземпляр этого класса.
В результате получается строго типизированная модель, поддерживающая валидацию, бизнес-методы и более удобные инструменты разработки.
Полный пример
# Определение бизнес-сущности
class Employee:
def __init__(self, name: str, age: int | None, department: str):
self.name = name
self.age = age
self.department = department
def is_adult(self) -> bool:
"""Возвращает True, если сотрудник является совершеннолетним."""
return self.age >= 18 if self.age else False
from spire.xls import Workbook
workbook = Workbook()
workbook.LoadFromFile("EmployeeData.xlsx")
sheet = workbook.Worksheets[0]
cell_range = sheet.AllocatedRange
employee_list = []
# Пропускаем строку заголовков
for row in list(cell_range.Rows)[1:]:
name = row.Cells[0].Value
age = (
int(row.Cells[1].Value)
if row.Cells[1].Value
else None
)
department = row.Cells[2].Value
employee = Employee(
name,
age,
department
)
employee_list.append(employee)
workbook.Dispose()
Преимущества и сценарии использования
Преимущества
Строгая типизация благодаря явному преобразованию типов
Более качественная проверка данных
Автодополнение и подсказки IDE
Инкапсуляция бизнес-логики
Улучшенная поддерживаемость кода
Более чистый объектно-ориентированный дизайн
Например:
employee.is_adult()
Бизнес-правила могут быть реализованы непосредственно внутри сущности, а не распределены по всему приложению.
Подходит для
Корпоративных приложений
Стабильных и хорошо определённых схем данных
Систем со сложными бизнес-правилами
Долгосрочных проектов, требующих удобной поддержки
Как выбрать подходящую структуру
Оптимальный выбор зависит от сложности приложения и способа использования данных.
Заключение
Переход от:
Числовых индексов в двумерных списках
Семантического доступа через словари
Строго типизированных бизнес-объектов
отражает более широкий переход от ориентированного на данные программирования к моделированию, ориентированному на бизнес-логику.
Простые скрипты не требуют сложных абстракций. Для большинства реальных задач обработки Excel список словарей обеспечивает отличный баланс между гибкостью и удобством сопровождения. Если же приложение содержит сложные бизнес-правила и использует стабильные схемы данных, пользовательские объекты-сущности становятся наиболее надёжным долгосрочным решением.
Правильный выбор структуры данных позволяет значительно снизить сложность кода, повысить его читаемость, уменьшить количество ошибок и упростить сопровождение процессов обработки Excel по мере роста проекта.
