Модуль openpyxl
умеет работать с популярными библиотеками Pandas
и NumPy
. В частности он имеет встроенную поддержку типов NumPy
, таких как float
, integer
и boolean
. А тип DateTimes
поддерживаются с использованием типа Timestamp
модуля Pandas
.
Функция 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, можно использовать свойство открытого листа 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)