Сообщить об ошибке.

Работа с Pandas и поддержка NumPy, модуль openpyxl в Python

Модуль openpyxl умеет работать с популярными библиотеками Pandas и NumPy. В частности он имеет встроенную поддержку типов NumPy, таких как float, integer и boolean. А тип DateTimes поддерживаются с использованием типа Timestamp модуля Pandas.

Содержание:


Перенос фрейма с данными Pandas в файл XLSX.

Функция openpyxl.utils.dataframe.dataframe_to_rows() предоставляет простой способ работы с фреймами данных Pandas:

import pandas as pd

# данные
data = {
    "Product Name": ["Product 1", "Product 2"],
    "Sales Month 1": [10, 20],
    "Sales Month 2": [5, 35],
}

# создадим DataFrame
df = pd.DataFrame(data)

from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows

wb = Workbook()
ws = wb.active


for r in dataframe_to_rows(df, index=False, header=True):
    ws.append(r)

wb.save("pandas_openpyxl.xlsx")

Если требуется добавить индекс DataFrame, то можно изменить index=True, и он добавит индекс каждой строки в электронную таблицу.

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

Чтобы преобразовать фрейм c данными в рабочий лист с выделением заголовка и индекса:

for r in dataframe_to_rows(df, index=True, header=True):
    ws.append(r)

for cell in ws['A'] + ws[1]:
    cell.style = 'Pandas'

wb.save("pandas_openpyxl.xlsx")

В качестве альтернативы, если просто нужно преобразовать данные, то можно использовать режим только для записи:

from openpyxl import Workbook
from openpyxl.cell.cell import WriteOnlyCell
from openpyxl.utils.dataframe import dataframe_to_rows

def format_first_row(row, cell):
    for c in row:
        cell.value = c
        yield cell

wb = Workbook(write_only=True)
ws = wb.create_sheet()

cell = WriteOnlyCell(ws)
cell.style = 'Pandas'

rows = dataframe_to_rows(df)
first_row = format_first_row(next(rows), cell)
ws.append(first_row)

for row in rows:
    row = list(row)
    cell.value = row[0]
    row[0] = cell
    ws.append(row)

wb.save("openpyxl_stream.xlsx")

Этот код будет работать так же хорошо с книгой, открытой в стандартном режиме стандартной .

Преобразование рабочего листа в Dataframe.

Чтобы преобразовать рабочий лист в Dataframe, можно использовать свойство открытого листа Worksheet.values. Это очень просто, если на листе нет заголовков столбцов и нет индексов:

import pandas as pd
from openpyxl import load_workbook
from mapping import REVIEW_ID

workbook = load_workbook(filename="sample.xlsx")
sheet = workbook.active

# получаем все значения ячеек
data = sheet.values

# установим поле "review_id" в качестве 
# индексов для каждой строки
idx = [row[REVIEW_ID] for row in data]

df = pd.DataFrame(data, index=idx)

Использование индексов index=idx и столбцов позволяет легко получать доступ к данным из созданного DataFrame.

Если на рабочем листе есть заголовки или индексы, например, созданные Pandas, то потребуется немного больше работы:

import pandas as pd
from openpyxl import load_workbook
from itertools import islice

workbook = load_workbook(filename="sample.xlsx")
sheet = workbook.active

# получаем все значения ячеек
data = sheet.values

# установим первую строку в качестве 
# имен столбцов для DataFrame
cols = next(data)[1:]
# преобразуем данные в список
data = list(data)
# получаем данные без имен столбцов
data = (islice(r, 1, None) for r in data)

# получаем индексы созданные `Pandas`
idx = [r[0] for r in data]

# и наконец получаем DataFrame
df = pd.DataFrame(data, index=idx, columns=cols)