Всем привет! Работа с Excel файлами — одна из частых задач, встречающихся в повседневной разработке. В этой статье рассмотрим, как с помощью Python можно создавать, заполнять, и стилизовать Excel файлы. Для этого мы будем использовать библиотеки pandas, openpyxl и faker (для тестов).

Для начала установим библиотеки:

pip install pandas xlsxwriter openpyxl faker

Создание Пустого Excel Файла

Начнем с создания пустого Excel файла с заданными колонками. Для этого мы используем pandas и xlsxwriter.

import os
import pandas as pd


def create_empty_excel(columns: list, filename: str, sheet_name: str = 'Sheet1'):
    df = pd.DataFrame(columns=columns)

    if not os.path.exists('excel_files'):
        os.makedirs('excel_files')

    filepath = os.path.join('excel_files', filename)
    excel_writer = pd.ExcelWriter(filepath, engine='xlsxwriter')
    df.to_excel(excel_writer, index=False, sheet_name=sheet_name, freeze_panes=(1, 0))
    excel_writer._save()

    return filepath

Этот код создает пустой Excel файл с указанными колонками и сохраняет его в папку excel_files. Если папка не существовала в корневой дирректории, то она будет создана.

Обратите внимание на то, что я закрепил верхнюю строку. Как по мне - это удобно.

В функции видим запись engine='xlsxwriter', это означает, что используется XlsxWriter в качестве движка для записи данных в файл Excel.

Тестируем

def create_tabel_users():
    filepath = create_empty_excel(columns=['Имя', 'Адрес', 'Email', 'Телефон'],
                                  filename='users.xlsx')


create_tabel_users()
Файл создан. Для просмотра я воспользовался Professional версией Pycharm
Файл создан. Для просмотра я воспользовался Professional версией Pycharm

Парсинг Excel Файла в Список Словарей

После создания Excel файла, возможно, потребуется считать данные из него и преобразовать в удобный для обработки формат — список словарей.

def parse_excel_to_dict_list(filepath: str, sheet_name='Sheet1'):
    # Загружаем Excel файл в DataFrame
    df = pd.read_excel(filepath, sheet_name=sheet_name)

    # Преобразуем DataFrame в список словарей
    dict_list = df.to_dict(orient='records')

    return dict_list

Этот простой метод загружает данные из Excel файла в DataFrame, а затем преобразует их в список словарей.

Сейчас я добавлю некоторые данные в созданную ранее эксель таблицу и воспользуюсь данной функцией.

Так выглядит моя таблица в обычном виде:

Код:

def get_data_to_exel():
    info = parse_excel_to_dict_list('users.xlsx')
    for i in info:
        print(i)


get_data_to_exel()

Смотрим:

Создание Excel Файла из Списка Словарей

Теперь создадим Excel файл из списка словарей и применим стилизацию для улучшения внешнего вида.

def create_excel_from_dict_list(dict_list: list, output_filename: str, sheet_name='Sheet1'):
    # Создаем директорию, если она не существует
    if not os.path.exists('excel_files'):
        os.makedirs('excel_files')

    filepath = os.path.join('excel_files', output_filename)

    # Создаем новую книгу Excel
    wb = Workbook()
    ws = wb.active
    ws.title = sheet_name

    # Записываем данные из списка словарей в Excel
    if dict_list:
        header = list(dict_list[0].keys())
        ws.append(header)  # Записываем заголовки

        for row in dict_list:
            ws.append([row[col] for col in header])

    # Настраиваем стили для красивого вида
    header_style = NamedStyle(name='header')
    header_style.font = Font(bold=True, color='FFFFFF')
    header_style.alignment = Alignment(horizontal='center', vertical='center')
    header_style.fill = PatternFill(start_color='4F81BD', end_color='4F81BD', fill_type='solid')
    border_style = Border(
        left=Side(border_style='thin', color='000000'),
        right=Side(border_style='thin', color='000000'),
        top=Side(border_style='thin', color='000000'),
        bottom=Side(border_style='thin', color='000000')
    )
    header_style.border = border_style

    cell_style = NamedStyle(name='cell')
    cell_style.alignment = Alignment(horizontal='left', vertical='center')
    cell_style.border = border_style

    for cell in ws[1]:  # Применяем стиль к заголовкам
        cell.style = header_style

    for row in ws.iter_rows(min_row=2, max_row=ws.max_row, min_col=1, max_col=ws.max_column):
        for cell in row:
            cell.style = cell_style

    # Автоматическое изменение ширины столбцов
    for col in ws.columns:
        max_length = 0
        column = col[0].column_letter
        for cell in col:
            try:
                if len(str(cell.value)) > max_length:
                    max_length = len(cell.value)
            except:
                pass
        adjusted_width = (max_length + 2)
        ws.column_dimensions[column].width = adjusted_width

    # Сохраняем файл
    wb.save(filepath)
    return filepath

Этот код создает Excel файл из списка словарей и применяет стили для заголовков и ячеек.

Генерация тестовых данных

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

from faker import Faker


def generate_fake_user():
    fake = Faker('ru_RU')

    return {
        'name': fake.name(),
        'address': fake.address(),
        'email': fake.email(),
        'phone_number': fake.phone_number(),
        'birth_date': fake.date_of_birth(),
        'company': fake.company(),
        'job': fake.job()
    }


def get_fake_users(count: int):
    return [generate_fake_user() for _ in range(count)]    

Функция get_fake_users генерируют фейковые данные русских пользователей в том количестве, которое вы передадите, что позволяет протестировать создание и обработку Excel файлов.

Пример использования

Теперь объединим все части кода и создадим полный рабочий пример:

def main():
    # создадим 100 фейковых пользователей
    fake_users = get_fake_users(100)

    # создадим таблицу с пользователями
    create_excel_from_dict_list(fake_users, 'fake_users.xlsx')

    # получим путь к таблице с пользователями
    filepath = os.path.join('excel_files', 'fake_users.xlsx')

    # получим всех пользователей из таблицы
    all_users = parse_excel_to_dict_list(filepath)
    for i in all_users:
        print(i)


main()

Как вы увидели, тут мы создали 100 фейковых пользователей и поместили их в таблицу с именем 'fake_users.xlsx'. Затем мы вывели в консоль все данные о пользователях в виде списка питоновских словарей (через цикл for).

Сама таблицв:

Заключение

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

Комментарии (3)