wake-up-neo.net

Stile in Openpyxl einstellen

Ich brauche Ratschläge zum Einstellen von Stilen in Openpyxl.

Ich sehe, dass das NumberFormat einer Zelle gesetzt werden kann, aber ich muss auch die Schriftfarben und -attribute einstellen (fett usw.). Es gibt eine style.py-Klasse, aber es scheint, dass ich das style-Attribut einer Zelle nicht festlegen kann, und ich möchte nicht wirklich mit dem Quellcode von openpyxl basteln.

Hat jemand eine Lösung dafür gefunden?

38
Nelson Shaw

Mit der Version 1.5.7 von openpyxl habe ich die folgenden Stiloptionen für das Arbeitsblatt erfolgreich angewendet ...

from openpyxl.reader.Excel import load_workbook
from openpyxl.workbook import Workbook
from openpyxl.styles import Color, Fill
from openpyxl.cell import Cell

# Load the workbook...
book = load_workbook('foo.xlsx')

# define ws here, in this case I pick the first worksheet in the workbook...
#    NOTE: openpyxl has other ways to select a specific worksheet (i.e. by name
#    via book.get_sheet_by_name('someWorksheetName'))
ws = book.worksheets[0]

## ws is a openpypxl worksheet object
_cell = ws.cell('C1')

# Font properties
_cell.style.font.color.index = Color.GREEN
_cell.style.font.name = 'Arial'
_cell.style.font.size = 8
_cell.style.font.bold = True
_cell.style.alignment.wrap_text = True

# Cell background color
_cell.style.fill.fill_type = Fill.FILL_SOLID
_cell.style.fill.start_color.index = Color.DARKRED

# You should only modify column dimensions after you have written a cell in 
#     the column. Perfect world: write column dimensions once per column
# 
ws.column_dimensions["C"].width = 60.0

Zu Ihrer Information, Sie können die Namen der Farben in openpyxl/style.py... finden. Manchmal ändere ich zusätzliche Farben aus die X11-Farbnamen

class Color(HashableObject):
    """Named colors for use in styles."""
    BLACK = 'FF000000'
    WHITE = 'FFFFFFFF'
    RED = 'FFFF0000'
    DARKRED = 'FF800000'
    BLUE = 'FF0000FF'
    DARKBLUE = 'FF000080'
    GREEN = 'FF00FF00'
    DARKGREEN = 'FF008000'
    YELLOW = 'FFFFFF00'
    DARKYELLOW = 'FF808000'
77
Mike Pennington

Seit Openpyxl 2.0 wird das Setzen von Zellenstilen durch Erstellen neuer Stilobjekte und durch Zuweisen von Eigenschaften zu Zellen festgelegt.

Es gibt mehrere Stilobjekte: Font, PatternFill, Border und Alignment. Siehe doc .

Um eine Stileigenschaft einer Zelle zu ändern, müssen Sie zuerst das vorhandene Stilobjekt aus der Zelle kopieren und den Wert der Eigenschaft ändern oder Sie müssen ein neues Stilobjekt mit den gewünschten Einstellungen erstellen. Weisen Sie dann der Zelle das neue Stilobjekt zu.

Beispiel für das Festlegen der Schriftart für Zelle A1 in Fettdruck und Kursiv:

from openpyxl import Workbook
from openpyxl.styles import Font
# Create workbook
wb = Workbook()
# Select active sheet
ws = wb.active()
# Select cell A1
cell = ws['A1']
# Make the text of the cell bold and italic
cell.font = cell.font.copy(bold=True, italic=True)
11
Tomasz Nguyen

Seit openpyxl 2.0 sind Stile unveränderlich.

Wenn Sie ein cell haben, können Sie (z. B.) Fettdruck einstellen, indem Sie:

cell.style = cell.style.copy(font=cell.style.font.copy(bold=True))

Ja, das ist ärgerlich.

11
user3757614

Ab openpyxl-1.7.0 können Sie auch Folgendes tun:

cell.style.fill.start_color.index = "FF124191"

Ich habe eine Reihe von Hilfsfunktionen, die einen bestimmten Wert für cell festlegen - z.

2
Enda Farrell

Wie openpyxl doc sagte:

Dies ist ein Open-Source-Projekt, das von Freiwilligen in ihrer Freizeit gepflegt wird. Dies kann durchaus bedeuten, dass bestimmte Features oder Funktionen, die Sie möchten, fehlen.

Ich habe den Quellcode von openpyxl überprüft und festgestellt, dass:

Bis openpyxl 1.8.x können Stile geändert werden. Ihr Attribut kann direkt wie folgt zugewiesen werden:

from openpyxl.workbook import Workbook
from openpyxl.style import Color

wb = Workbook()
ws = wb.active
ws['A1'].style.font.color.index = Color.RED

Ab openpyxl 1.9 sind Stile jedoch unveränderlich.

Stile werden von Objekten gemeinsam genutzt und können nach ihrer Zuweisung nicht mehr geändert werden. Dies verhindert unerwünschte Nebenwirkungen wie das Ändern des Stils für viele Zellen anstelle von nur einer.

Um ein neues Stilobjekt zu erstellen, können Sie es direkt zuweisen oder eines aus dem Stil einer vorhandenen Zelle mit neuen Attributen kopieren. Beantworten Sie die Frage als Beispiel (verzeihen Sie mein chinesisches Englisch):

from openpyxl.styles import colors
from openpyxl.styles import Font, Color
from openpyxl import Workbook
wb = Workbook()
ws = wb.active

a1 = ws['A1']
d4 = ws['D4']

# create a new style with required attributes
ft_red = Font(color=colors.RED) 
a1.font = ft_red

# you can also do it with function copy
ft_red_bold = ft_red.copy(bold=True)

# you can copy from a cell's style with required attributes
ft_red_sigle_underline = a1.font.copy(underline="single")

d4.font = ft_red_bold

# apply style to column E
col_e = ws.column_dimensions['E']
col_e.font = ft_red_sigle_underline

Der Stil einer Zelle enthält die folgenden Attribute: Schriftart, Füllung, Rahmen, Ausrichtung, Schutz und Zahlenformat. Prüfen openpyxl.styles.

Sie sind ähnlich und sollten als Objekt erstellt werden, mit Ausnahme von number_format. Der Wert lautet string type.

Einige vordefinierte Zahlenformate sind verfügbar. Zahlenformate können auch als Zeichenfolgentyp definiert werden. Prüfen openpyxl.styles.numbers.

from openpyxl.styles import numbers

# use pre-defined values
ws.cell['T49'].number_format = numbers.FORMAT_GENERAL
ws.cell(row=2, column=4).number_format = numbers.FORMAT_DATE_XLSX15

# use strings
ws.cell['T57'].number_format = 'General'
ws.cell(row=3, column=5).number_format = 'd-mmm-yy'
ws.cell['E5'].number_format = '0.00'
ws.cell['E50'].number_format = '0.00%'
ws.cell['E100'].number_format = '_ * #,##0_ ;_ * -#,##0_ ;_ * "-"??_ ;_ @_ '
2

Für openpyxl Version 2.4.1 und höher verwenden Sie den folgenden Code, um die Schriftfarbe festzulegen:

from openpyxl.styles import Font
from openpyxl.styles.colors import Color

ws1['A1'].font = Font(color = "FF0000")

hex-Codes für verschiedene Farben finden Sie unter: http://dmcritchie.mvps.org/Excel/colors.htm

1
Parth Karia

Dies scheint eine Funktion zu sein, die sich einige Male geändert hat. Ich verwende openpyxl 2.5.0 und konnte die Durchstreichungsoption folgendermaßen einstellen:

new_font = copy(cell.font)
new_font.strike = True
cell.font = new_font

Anscheinend hatten frühere Versionen (1.9 bis 2.4?) Eine copy-Methode für die Schriftart, die nun veraltet ist und eine Warnung auslöst:

cell.font = cell.font.copy(strike=True)

Versionen bis 1.8 hatten veränderbare Schriftarten, so dass Sie dies einfach tun können:

cell.font.strike=True

Das wirft jetzt einen Fehler auf.

0
Don Kirkby