training-web.ruГлавнаяКатегорииО насКарта сайтаПоискТёмная тема

Категории

Как создать exel документ модуль openpyxl Python

Создано: 26 октября 2017Автор: Егор Астапов8776 просмотровСложность: легкий

Как создать 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")

В самом начале скрипта мы подключаем различные модули. Тут ошибок быть не должно. Далее определяем стили оформления. Отдельно определены элементы оформления:

  1. PatternFill - цвет фона ячейки
  2. Border - обводка
  3. Alignment - выравнивание
  4. Protection - защита
  5. Font - шрифт

Теперь необходимо создать объект 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 документ

создание эксельного документа Python

Комментарии

реклама