голосование
PHP
Javascript
BASH
HTML
Firebird
Майнинг
Программы
Хостинг
Железо
Ресурсы
GIT
SEO
Oracle
Python
Проголосуйте за категорию!
счётчик
Яндекс.Метрика

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

Как создать 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
просмотры: 2911, уровень: лёгкий уровень, рейтинг: 5, дата: 2017-10-26 22:51:46
проголосовать:

Комментарии:






поиск
сайты друзей
банеры
сервис мониторинга работы сайта, мониторим HTTP, HTTPS, FTP, MYSQL, PostgreSQL, POP3, SMTP, IMAP
http://ping-admin.ru/index_5659.html мониторинг сайтов сервис мониторинга работы сайта, мониторим HTTP, HTTPS, FTP, MYSQL, PostgreSQL, POP3, SMTP, IMAP
http://www.2domains.ru домен RU домен RU всего за 99 рублей
http://trainingweb.ru/redirect/well_web_vps_kvm Аренда VPS KVM в Европе Мы предлагаем в аренду VPS серверы с выделенным IP-адресом, которые полностью эмулируют физический сервер.