Как создать exel документ в Python? Для этих целей есть много библиотек. Рассмотрим самую популярную библиотеку openpyxl. Вы сможете не только сгенерировать exel документ в openpyxl, но и вставить в него график для наглядности. Хорош тот скрипт который содержит мало кода. Подготовил для вас пример. Он содержит массу циклов. Я учёл свой опыт создания эксельных документов на PHP. Скажу что библиотек PHPExel сильно уступает openpyxl. В плане рисования графиков openpyxl лучше. Посмотрите на пример.
#!/usr/local/bin/python3
from openpyxl import Workbook
from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font, Side
from datetime import *
#определяем стили
font = Font(name='Calibri',
size=11,
bold=False,
italic=False,
vertAlign=None,
underline='none',
strike=False,
color='FF000000')
fill = PatternFill(fill_type='solid',
start_color='c1c1c1',
end_color='c2c2c2')
border = Border(left=Side(border_style='thin',
color='FF000000'),
right=Side(border_style='thin',
color='FF000000'),
top=Side(border_style='thin',
color='FF000000'),
bottom=Side(border_style='thin',
color='FF000000'),
diagonal=Side(border_style='thin',
color='FF000000'),
diagonal_direction=0,
outline=Side(border_style='thin',
color='FF000000'),
vertical=Side(border_style='thin',
color='FF000000'),
horizontal=Side(border_style='thin',
color='FF000000')
)
align_center=Alignment(horizontal='center',
vertical='bottom',
text_rotation=0,
wrap_text=False,
shrink_to_fit=False,
indent=0)
align_left=Alignment(horizontal='left',
vertical='bottom',
text_rotation=0,
wrap_text=False,
shrink_to_fit=False,
indent=0)
number_format = 'General'
protection = Protection(locked=True,
hidden=False)
# объект
wb = Workbook()
# активный лист
ws = wb.active
#название страницы
#ws = wb.create_sheet('первая страница', 0)
ws.title = 'первая страница'
#значение ячейки
#ws['A1'] = "Hello!"
#текущее время
today = datetime.today()
today = today.strftime('%d.%m.%Y %S:%M:%H')
#данные для строк
rows = [
['Название', 'Язык', 'Время'],
['Ivan', 'PHP', today],
['Egor', 'Python', today],
['Anton', 'Ruby', today],
['Roman', 'Javascript', today],
]
#циклом записываем данные
for row in rows:
ws.append(row)
#раскрвшивание фона для заголовков
ws['A1'].fill = fill
ws['B1'].fill = fill
ws['C1'].fill = fill
#шрифты
ws['A3'].font = font
#обводка
ws['A3'].border = border
#выравнивание
ws['A3'].alignment = align_center
#вручную устанавливаем высоту первой строки
#rd = ws.row_dimensions[1]
#rd.height = 16
#увеличиваем все строки по высоте
max_row = ws.max_row
i = 1
while i <= max_row:
rd = ws.row_dimensions[i]
rd.height = 16
i += 1
#сетка + выравнивание
for cellObj in ws['A1:C5']:
for cell in cellObj:
#print(cell.coordinate, cell.value)
ws[cell.coordinate].border = border
ws[cell.coordinate].alignment = align_center
#выравнивание столбца
for cellObj in ws['A2:A5']:
for cell in cellObj:
ws[cell.coordinate].alignment = align_left
#перетягивание ячеек
#https://stackoverflow.com/questions/13197574/openpyxl-adjust-column-width-size
dims = {}
for row in ws.rows:
for cell in row:
if cell.value:
dims[cell.column] = max((dims.get(cell.column, 0), len(cell.value)))
for col, value in dims.items():
#value * коэфициент
ws.column_dimensions[col].width = value * 1.5
#сохранение файла в текущую директорию
wb.save("sample.xlsx")
В самом начале скрипта мы подключаем различные модули. Тут ошибок быть не должно. Далее определяем стили оформления. Отдельно определены элементы оформления:
Теперь необходимо создать объект wb и первый лист. В документе может быть множество листов: ws1, ws2, ws3... Активным может быть только один лист.
# объект
wb = Workbook()
# активный лист
ws = wb.active
Для каждой страницы вы сможете создать своё название. wb.create_sheet('первая страница', 0) - этой командой будет создана первая страница с вашим названием.
#название страницы
#ws = wb.create_sheet('первая страница', 0) - создание первой страницы
ws.title = 'первая страница'
Вы можете каждой ячейке присвоить своё значение. Если у вас 2 столбца и одна строка в таблице, то нет смысла лепить цикл. Проще вручную заполнить ячейки данными. Если у вас много данных (строк в таблице), то вам необходим любой цикл. В списке rows у нас будут данные. Я поместил туда и названия столбцов. Вы можете вручную добавлять названия для столбцов. Например ws['A1']='Название'. Можете вставить в начало списка свой список с названиями столбцов. Функция append устанавливает значение для каждой ячейки.
#значение ячейки
#ws['A1'] = "Hello!"
#текущее время
today = datetime.today()
today = today.strftime('%d.%m.%Y %S:%M:%H')
#данные для строк
rows = [
['Название', 'Язык', 'Время'],
['Ivan', 'PHP', today],
['Egor', 'Python', today],
['Anton', 'Ruby', today],
['Roman', 'Javascript', today],
]
#циклом записываем данные
for row in rows:
ws.append(row)
Покажу вам как вручную менять оформление ячеек. Вы должны каждой ячейке менять свойства.
#раскрашивание фона для заголовков
ws['A1'].fill = fill
ws['B1'].fill = fill
ws['C1'].fill = fill
#шрифты
ws['A3'].font = font
#обводка
ws['A3'].border = border
#выравнивание
ws['A3'].alignment = align_center
Теперь покажу вам как увеличить строки по высоте. Я определил номер позиции самой последней строки ws.max_row. Это значение необходимо для остановки цикла while.
#вручную устанавливаем высоту первой строки
#rd = ws.row_dimensions[1]
#rd.height = 16
#увеличиваем все строки по высоте
max_row = ws.max_row
i = 1
while i <= max_row:
rd = ws.row_dimensions[i]
rd.height = 16
i += 1
Добавим выравнивание вместе с обводкой ячеек (сеткой).
#сетка + выравнивание
for cellObj in ws['A1:C5']:
for cell in cellObj:
#print(cell.coordinate, cell.value)
ws[cell.coordinate].border = border
ws[cell.coordinate].alignment = align_center
#выравнивание одного столбца
for cellObj in ws['A2:A5']:
for cell in cellObj:
ws[cell.coordinate].alignment = align_left
Для удобства можно автоматически расширить столбцы. Вам не придется вручную расширять каждый столбец. В одной статье было подробно расписано как при помощи цикла расширять столбцы. Это одно из предоставленных решений.
dims = {}
for row in ws.rows:
for cell in row:
if cell.value:
dims[cell.column] = max((dims.get(cell.column, 0), len(cell.value)))
for col, value in dims.items():
#value * коэфициент
ws.column_dimensions[col].width = value * 1.5
Теперь сохраним файл в текущую директорию. Если вам нужно менять пути, то читейте статью Модуль os Python. Там будет функция os.chdir() для смены директории и функция os.getcwd() определение тукущей директории.
#сохранение файла в текущую директорию
wb.save("sample.xlsx")
Посмотрите на результат.
наш exel документ