Export do excelu z pythonu

... Petr Blahoš, 3. 5. 2017 Python

Přiznejme si to, ve firmách se používají výhradně MS Windows, a na kancelářskou práci se používá výhrandě MS Office. Pokud vytváříme nějaký nástroj pro firmu, narazíme dřív nebo později na potřebu exportovat do Excelu. Podíváme se na způsoby, jak na to.

Clipboard/schránka

Jeden úkol, který někdy řešíme, je vložení tabulky do už existujícího excelového souboru. V takovém případě je nejjednodušší data nějak dostat do schránky, a pomocí Ctrl-V je pak vložit do otevřeného Excelového souboru. Má to jedinou nějaké podmínky:

  • Sloupce musí být odděleny tabelátorem.
  • Ve vlastním zájmu nepoužívejte datum a čas.
  • Velmi dobře kontrolujte, zda export funguje ve všech používaných kombinací jazyka Windows a jazyka Office.

Schránka je ovšem dost závislá na platformě.

wxPython

Pokud už ve svém projektu používáte wxPython použijte jeho TheClipboard:

text = u"""
Hlavička 1\tHlavička 2\tHlavička 3
Hodnota 1\tHodnota 2\tHodnota 3
"""
if wx.TheClipboard.Open():
    wx.TheClipboard.SetData(wx.TextDataObject(text))
    wx.TheClipboard.Close()

pyperclip

Pokud wxPython ve svém projektu nepoužíváte, použijte raději mnohem menší pyperclip (pip install pyperclip). V něm pak:

import pyperclip

text = u"""
Hlavička 1\tHlavička 2\tHlavička 3
Hodnota 1\tHodnota 2\tHodnota 3
"""

pyperclip.copy(text)

Něco většího

Pro generování celého souboru, který pak Excel otevře, máme několik možností. Budeme se zde zabývat dvěma z nich.

pyexcel

pyexcel je zajímavá knihovna, která pracuje s různými tabulkovými formáty (csv, xlsx, xls, ods, text), a soustředí se pouze na data. Neumí formátování, ale strašně jednoduše se používá, nejen pro zápis, ale i pro čtení různých tabulkových formátů. Podporuje formáty pomocí pluginů, a záleží na tom, které nainstalujete.

pip install pyexcel
# nainstaluje také pyexcel-io s podporou csv

Ukázka:

import pyexcel

data = [["h1", "h2", "h3"], [1, 2, 3], [10, 20, 30]]
pyexcel.save_as(array=data, dest_file_name="data.csv")

Na ukládání jako xlsx musíme nainstalovat pip install pyexcel-xlsx. Pak bude fungovat:

pyexcel.save_as(array=data, dest_file_name="data.xlsx")

Ano, je to takhle jednoduché. Pamatujte, že v pyexcel jde jen o data. Do výsledného souboru (ať už xlsx, csv, ods) uloží přesně ta data, která jsou ve zdrojových datech. Zároveň bych rád zmínil, že obrovskou výhodou pyexcel je čtení. Jednotným rozhraním získáte přístup k datům z Excelu, LibreOffice a csv souborů.

openpyxl

Tato knihovna je specifická pro xlsx formát Excely. Umí i formátování a grafy. Umí i číst, ale nás teď zajímá zápis. Malá ukázka:

import datetime
import openpyxl

wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Worksheet title"

# Přidání celé řádky najednou
ws.append(["String", u"Unicode", 100, 100.0, 100.3, datetime.datetime.now()])

ws["B4"] = 100

for i in range(0, 10):
    for j in range(5, 7):
        # Indexy ve funkci cell nepochopitelně začínají od 1
        ws.cell(column=i + 1, row=j + 1, value=i*j)

wb.save("tinyxl.xlsx")

Tohle ovšem byla jen data. Chcete formátovat?

# coding=utf-8
import openpyxl
from openpyxl.styles import PatternFill, Color, Font

wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Title"

fill_styles = [
    PatternFill("solid", fgColor=Color("008FFF8F")),
    PatternFill("solid", fgColor=Color("008F8FFF")),
]
header_font = Font(size=22)

for i in range(0, 10):
    for j in range(0, 6):
        ws.cell(column=i + 1, row=j + 1, value="%s/%s" % (i, j))
        # sudé / liché pozadí
        ws.cell(column=i + 1, row=j + 1).fill = fill_styles[j % 2]
        if not j:
            # velikost fontu pro první řádek
            ws.cell(column=i + 1, row=j + 1).font = header_font

wb.save("styledxl.xlsx")

Závěr

Rád bych zmínil, že uvedené postupy nejsou závislé na MS Windows. Knihovny openpyxl a pyexcel fungují na všech platformách, generování textových dat a předávání přes schránku také. Nic tedy nebrání použít tyto postupy např. ve webovém serveru.