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?
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'
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)
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.
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.
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_ ;_ * "-"??_ ;_ @_ '
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
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.