Python - openpyxl Excel-Betriebsbeispiel und Übung

I. Einleitung

Nachdem die Daten mit dem Skript verarbeitet wurden, müssen sie in Excel konvertiert werden.Da die Probleme des manuellen Einfügens und der Zeilenumbrüche sehr unintelligent sind, wird stattdessen die openpyxl-Bibliothek verwendet, um die vom Skript erhaltenen Daten zu verarbeiten und die Annotation zu vervollständigen nebenbei stellen wir die gemeinsame syntax von openpyxl vor und werfen einen blick auf unsere rohdaten:

A	B	C	D
0.012 0.951 0.234 -0.137
0.038 0.999 -0.225 0.139

Unter ihnen sind A, B, C, D die Überschriften und die folgenden zwei Spalten stellen das Dezimalkommaverhältnis dar. Der Effekt, den wir erzielen möchten :

(1) Wandeln Sie Dezimalzahlen in Prozent um und behalten Sie 1 Dezimalstelle bei

(2) Prozentsätze größer als 0 sind rot markiert, und Zahlen kleiner als 0 sind grün markiert

(3) Zahlen werden in der Tabelle ausgerichtet

Machen wir uns mit den allgemeinen Operationen von openpyxl vertraut und realisieren die oben genannten Anforderungen~

Zweitens: allgemeine Operation von openpyxl

1. Erstellen Sie eine Arbeitsmappe

Die Workbook-Klasse ist die Basisklasse von openpyxl. Das Initialisieren dieser Klasse kann als Öffnen eines neuen Excel-Arbeitsbereichs verstanden werden, in dem create_sheet als neues Blatt angesehen werden kann. Das folgende Beispiel erstellt ein Blatt mit dem Namen Sheet1. Eine Arbeitsmappe kann mehrere Blätter initialisieren:

# 初始化
workbook = Workbook()

# 创建 sheet
sheet = workbook.create_sheet("Sheet")

2. Blatt Daten hinzufügen

A. Einzelpunktaddition

Sheet entspricht der Sheet-Klasse, in der jede Zelle in der Tabelle der Cell-Klasse entspricht.Sie ​​können den Wert der Zelle durch Sheet['position'] = xxx setzen und dann den Wert der entsprechenden Zelle durch Cell erhalten. Die Position muss durch Excel übergeben werden. Ähnliche Indizes werden gesetzt, wie 'A1', 'B10', 'AA5', und um Zellen zu erhalten, müssen Sie den Index (Zeile, Spalte) übergeben, es gibt einige Unterschiede hier.

 Wenn ich zum Beispiel die D7-Position auf 999 setzen möchte, kann ich sheet['D7'] = 999 tun.

sheet['D7'] = 999

B. Bulk hinzufügen

sheet = workbook.create_sheet("Sheet", 0)

sheet.append([1, 2, 3, 4])
sheet.append([2, 3, 4, 5])
sheet.append([3, 4, 5, 6])

Diese Methode fügt die Daten des Arrays zeilenweise hinzu:

 Es können auch Arrays ungleicher Länge verwendet werden:

sheet.append([1, 2, 3, 4])
sheet.append([2, 3, 4, 5, 6])
sheet.append([3, 4, 5, 6])

3. Blattdaten abrufen

Wie oben erwähnt, sind die Daten jeder Zelle Cell, die über die Methode sheet.cell(row, col) abgerufen werden müssen.Es sollte hier beachtet werden, dass die Zeilen- und Spaltenindizes von Excel alle bei 1 beginnen und von durchlaufen werden 0 führt zu einem Fehler. Folgendes erhält den Wert von D7:

cell = sheet.cell(7, 4)
print(cell.value)
999

4. Zeilen- und Spaltenkonvertierung

Das Koordinatensystem, das für den obigen Mehrwert verwendet wird, ist die Kombination aus Buchstaben und Zahlen, z. B. A-Spalte, 5-Zeilen, und das Koordinatenformat 10-Zeilen, 2-Spalte wird verwendet, um die Zelle Zelle zu erhalten, also die Zuordnung zwischen den beiden beinhaltet die Umwandlung von col Frage. Hier bietet die openpyxl-Bibliothek eine util-Funktion. Rufen Sie einfach auf, um die Index-String-Konvertierung zu erhalten:

from openpyxl.utils import get_column_letter, column_index_from_string

num = 10
# index 转换为 字符
index2string = get_column_letter(num)
# 字符转换为 index
string2index = column_index_from_string(index2string)

print(num, "->", index2string)
print(index2string, "->", string2index)
10 -> J
J -> 10

5. Greifen Sie auf mehrere Zeilen und mehrere Spalten zu

A. Slice-Zugriff

for i in sheet['A1':'A10']:
    cell = i
(<Cell 'Sheet1'.A1>,)
(<Cell 'Sheet1'.A2>,)
(<Cell 'Sheet1'.A3>,)
(<Cell 'Sheet1'.A4>,)
(<Cell 'Sheet1'.A5>,)
(<Cell 'Sheet1'.A6>,)
(<Cell 'Sheet1'.A7>,)
(<Cell 'Sheet1'.A8>,)
(<Cell 'Sheet1'.A9>,)
(<Cell 'Sheet1'.A10>,)

 Der obige Code greift auf die Zeilen 1-10 der Spalte A zu, die dem in der folgenden Abbildung gezeigten Bereich entsprechen:

  Ebenso können Sie Slices verwenden, um auf Daten in derselben Zeile zuzugreifen:

for i in sheet['A1':'D1']:
    cell = i
(<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>, <Cell 'Sheet1'.D1>)

B. Bereichsdurchquerung

Durchlaufen Sie den angegebenen Tabellenbereich und wählen Sie den Größenbereich von Zeile und Spalte aus, um die Elemente im entsprechenden Bereich zu durchlaufen:

for row in sheet.iter_rows(min_row=5, max_row=8, min_col=1, max_col=3):
    for cell in row:
        print(cell)
<Cell 'Sheet1'.A5>
<Cell 'Sheet1'.B5>
<Cell 'Sheet1'.C5>
<Cell 'Sheet1'.A6>
<Cell 'Sheet1'.B6>
<Cell 'Sheet1'.C6>
<Cell 'Sheet1'.A7>
<Cell 'Sheet1'.B7>
<Cell 'Sheet1'.C7>
<Cell 'Sheet1'.A8>
<Cell 'Sheet1'.B8>
<Cell 'Sheet1'.C8>

Der obige Code greift auf die Spalten 1-3 zu, die die Spalten AC und die Zeilen 5-8 sind, und die Elemente entsprechen den folgenden Feldern:

C. Globale Traversierung

Das Überqueren von Zeilen oder Spalten durchquert tatsächlich das gesamte Blatt.

# 从 row 的角度遍历 sheet
for rows in sheet.rows:
    for row in rows:
        print(row.value)

# 从 col 的角度遍历 sheet
for cols in sheet.columns:
    for col in cols:
        print(col.value)

6. Holen Sie sich die Anzahl der Zeilen und Spalten

# 获取行列数
rowNum = sheet.max_row
colNum = sheet.max_column
print("row: ", rowNum, "col: ", colNum)
row: 8 col: 4

7. Verwenden Sie Formeln

A. Single-Point-Use-Formel

Der folgende Befehl definiert den Wert an C15 als 5 + 5 = 10

sheet['C15'] = '=sum({}, {})'.format(5, 5)

B. Batch-Use-Formel

Erstellen Sie zuerst ein neues Tabellenblatt2, dann sind die Spaltennamen Name, Punktzahl und fügen Sie die entsprechenden Werte hinzu:

sheet2 = workbook.create_sheet("Sheet2", 0)
sheet2['A1'] = "Name"
sheet2['B1'] = "Score"
sheet2.append(['A', 1])
sheet2.append(['B', 2])
sheet2.append(['C', 3])
sheet2['C1'] = "Add_1"

 Die Formel wird unten angewendet, wobei die Daten in der Spalte Add_1 der Wert von B2-B4 + 1 sind:

for row in range(2, 5):
    colLetter = get_column_letter(3)
    sheet2[colLetter + str(row)] = '=sum({}, {})'.format(sheet2.cell(row, 2).value, 1)

8. Tabellen speichern, lesen, löschen

Wo file_path der Speicher der entsprechenden Tabelle ist, löschen Sie den Speicherort:

# 保存表
workbook.save(file_path)

# 删表
workbook.remove(file_path)

# 读取sheet
wb = openpyxl.load_workbook(file_path)
sheet = wb.get_sheet_by_name(sheet_name)

3. Betrieb im Openpyxl-Stil

1. Einleitung

Oben wurde beschrieben, wie Sie Daten zur Tabelle hinzufügen, die Daten in der Tabelle durchlaufen und verarbeiten und den Tabellenstil unten analysieren. Jetzt wissen wir, dass jede Zelle einer Zellklasse entspricht, nämlich aus openpyxl.cell import Cell :

 Zusätzlich zum Aufrufen der Methode .value zum Abrufen des entsprechenden Werts kann die Zelle auch das folgende Format ändern:

A. Schriftart - Schriftart bezogen

B. fill – füllfarbebezogen

C.alignment - Ausrichtung bezogen

D.border - grenzbezogen

E.comment - Kommentarbezogen

Das folgende Beispiel basiert auf dem Basisblatt, das im vorherigen Schritt durch Anhängen erhalten wurde:

2.Schriftart

Im Folgenden wird die Zelle in der Position B2 auf die fette rote Schriftart der 11. fetten Schriftart umgestellt:

cell = sheet.cell(column=2, row=2)

# 指定 font 字体名 name + 大小 size + 加粗 blod + 斜体 italic + 颜色 color
font = Font(name='黑体简', size=11, italic=False, color="FF0000", bold=True)
cell.font = font

Die Bedeutung der Parameter ist hier:

Name Schriftart
Größe Größe
kursiv kursiv
Blut deutlich
Farbe Farbe

Details zu Parametern wie Schriftstil können Sie auch direkt in Excel einsehen und die Wirkung vorab sehen:

3.fill füllen bezogen

fill ist hauptsächlich für die Füllfarbe der Zellen verantwortlich Die Zellen werden wie folgt mit Full Fill und Gradient Fill gefüllt:

Die Position A. (2-3) ist mit grauem PatternFill gefüllt

fgColor ist die Kodierung der entsprechenden Farbe

cell = sheet5.cell(row=2, column=3)
cell.fill = PatternFill("solid", fgColor="00778899")

B. (2-4) Position mit rotem und grünem Verlauf gefüllt

Eine Vielzahl von Farben kann auch in Stop hinzugefügt werden, wodurch mehrstufige Farbverläufe erzielt werden

cell2 = sheet5.cell(row=2, column=4)
cell2.fill = GradientFill(stop=("007CFC00", "00FF4500"))

4. Ausrichtung Ausrichtung bezogen

alignment = Alignment(horizontal="center", vertical="center", 
                      text_rotation=0, wrap_text=False)
cell = sheet.cell(row=2, column=3)
cell.alignment = alignment

Zentrieren Sie das Element an der Position (2,3), die Bedeutung des Parameters ist:

horizontal Horizontaler Ausrichtungsmodus
vertikal vertikaler Ausrichtungsmodus
text_rotation Drehwinkel
Zeilenumbruch Ob automatisch umgebrochen werden soll

5. grenze grenze bezogen

Fügen Sie Grenzen zu den (2,4) Positionselementen hinzu, mit grünen und schwarzen dünnen Linien nach oben und unten und roten und grünen Doppellinien links und rechts:

cell = sheet.cell(row=2, column=4)
cell.border = Border(left=Side(style='double', color="FF0000"),
                     right=Side(style='double', color="0000FF"),
                     top=Side(style='thin', color="00FF00"),
                     bottom=Side(style='thin'))

 Border enthält insgesamt links, rechts, oben, unten, also die Grenzlinien von vier Richtungen: oben, unten, links und rechts.

SIde ist das Attribut, das der Grenzlinie entspricht, und es gibt viele Stile. Wenn Sie den Stil und einen beliebigen Code eingeben, wird ein Fehler gemeldet, und der Ausnahmestapel zeigt die von der aktuellen Version unterstützten Stilattribute an. die je nach Bedarf ausgewählt werden können:

ValueError: Value must be one of {'dotted', 'dashed', 'mediumDashDotDot', 
'double', 'thick', 'dashDot', 'medium', 'slantDashDot', 'mediumDashDot', 'thin', 
'dashDotDot', 'hair', 'mediumDashed'}

6. Kommentare kommentieren

Kommentieren Sie das Positionselement (1,1), der erste Parameter ist der Anmerkungsinhalt und der zweite Parameter ist der entsprechende Autor:

# 注释
cell = sheet.cell(row=1, column=1)
comment = Comment("This is a comment!", "DDD")
cell.comment = comment

7.Höhe-Breite bezogen

sheet5.row_dimensions[1].height = 50
sheet5.column_dimensions['B'].width = 20

Passen Sie die Zeilenbreite und Spaltenhöhe der Zellen in Spalte 'B' und Zeile '1' an:

8. Zellen verbinden und trennen

A. Zellen verbinden

sheet.merge_cells("C1:D2")

Nehmen Sie C1 als die obere linke Ecke des Rahmens und D2 als die untere rechte Ecke des Rahmens, um Zellen zu verbinden, und die Daten werden als der Wert beibehalten, der C1 entspricht:

 B. Zellen trennen

sheet.unmerge_cells("C1:D2")

 Die Zellen werden nicht zusammengeführt, aber die Daten der verbleibenden Zellen werden nicht gefüllt

4. openpyxl üben

1. Fallanforderungen

Nach der obigen Erklärung und Analyse sind wir mit der grundlegenden Funktionsweise von openpyxl vertraut. Kommen wir auf das in der Einleitung erwähnte Problem zurück. Wir müssen die folgenden Daten eingeben:

A	B	C	D
0.012 0.951 0.234 -0.137
0.038 0.999 -0.225 0.139

wird übersetzt in:

 Hier ist eine kurze Analyse des Konvertierungsprozesses:

A. Arbeitsmappe und Arbeitsblatt initialisieren 

B. Fügen Sie das entsprechende Element an der entsprechenden Position der Sheet through-Zeile hinzu, Spalte

C. Wenn der Wert größer als 0 ist, wird die Farbe der entsprechenden Positionszelle in Rot geändert, und der Wert kleiner als 0 wird in Grün geändert

D. Alle Zellen sind zentriert

E. 1 Dezimalstelle beibehalten

2. Fallrealisierung

def colorFulData(_sheet, _head, _values):
    # 定义字体
    _font = None
    # 获取 values 的长款
    _colNum = len(_head)
    _rowNum = len(_values)
    # 定义对齐方式
    _alignment = Alignment(horizontal="center", vertical="center", text_rotation=0, wrap_text=False)
    for _col in range(1, _colNum + 1):
        # col 转换并添加元素到 Cell
        _sheet[get_column_letter(_col) + str(1)] = head[_col - 1]
        _cell = _sheet.cell(1, _col)
        _cell.alignment = _alignment
        for _row in range(1, _rowNum + 1):
            # 保留一位小数
            _sheet[get_column_letter(_col) + str(_row + 1)] = format(values[_row - 1][_col - 1], '.1%')
            _cell = _sheet.cell(_row + 1, _col)
            numValue = float(values[_row - 1][_col - 1])
            # 根据值改变字体颜色
            if numValue > float(0):
                _font = Font(name='黑体简', size=11, italic=False, color="00FF0000", bold=True)
            elif numValue < float(0):
                _font = Font(name='黑体简', size=11, italic=False, color="0000FF00", bold=True)
            _cell.font = _font
            _cell.alignment = _alignment


head = ["A", "B", "C", "D"]
values = [[0.012, 0.951, 0.234, -0.137], [0.038, 0.999, -0.225, 0.139]]
colorFulData(sheet, head, values)
workbook.save(file_path)

Sie müssen nur den Header und die entsprechenden Wertedaten übergeben. Hier gibt es keinen Try-Catch, daher sollte der Eingabewert in einer legalen Form sein, sonst wird ein Fehler gemeldet. Weitere Schriftstile, Zellenverschmelzung, Zellenfüllung usw. können ebenfalls hinzugefügt werden. In der entsprechenden Zelle oben ist das Folgende der Effekt, der durch die Implementierung der Grundform erzielt wird:

5. openpyxl-Erweiterung

Die Farbe der obigen Zellen oder die gefüllte Farbe verwenden alle den Farbcode. Im Folgenden sind einige häufig verwendete Farbcodes aufgeführt, die bei Bedarf auf Ihre eigenen Programme angewendet werden können:

    '00F0F8FF', '00FAEBD7', '0000FFFF', '007FFFD4', '00F0FFFF', '00F5F5DC', 
    '00FFE4C4', '00000000', '00FFEBCD', '000000FF', '008A2BE2', '00A52A2A', 
    '00DEB887', '005F9EA0', '007FFF00', '00D2691E', '00FF7F50', '006495ED',
    '00FFF8DC', '00DC143C', '0000FFFF', '0000008B', '00008B8B', '00B8860B', 
    '00A9A9A9', '00006400', '00BDB76B', '008B008B', '00556B2F', '00FF8C00',
    '009932CC', '008B0000', '00E9967A', '008FBC8F', '00483D8B', '002F4F4F',
    '0000CED1', '009400D3', '00FF1493', '0000BFFF', '00696969', '001E90FF', 
    '00B22222', '00FFFAF0', '00228B22', '00FF00FF', '00DCDCDC', '00F8F8FF', 
    '00FFD700', '00DAA520', '00808080', '00008000', '00ADFF2F', '00F0FFF0', 
    '00FF69B4', '00CD5C5C', '004B0082', '00FFFFF0', '00F0E68C', '00E6E6FA', 
    '00FFF0F5', '007CFC00', '00FFFACD', '00ADD8E6', '00F08080', '00E0FFFF', 
    '00FAFAD2', '0090EE90', '00D3D3D3', '00FFB6C1', '00FFA07A', '0020B2AA', 
    '0087CEFA', '00778899', '00B0C4DE', '00FFFFE0', '0000FF00', '0032CD32', 
    '00FAF0E6', '00FF00FF', '00800000','0066CDAA', '000000CD', '00BA55D3', 
    '009370DB', '003CB371', '007B68EE', '0000FA9A', '0048D1CC', '00C71585',
    '00191970', '00F5FFFA', '00FFE4E1', '00FFE4B5', '00FFDEAD', '00000080', 
    '00FDF5E6', '00808000', '006B8E23', '00FFA500', '00FF4500', '00DA70D6', 
    '00EEE8AA', '0098FB98', '00AFEEEE', '00DB7093', '00FFEFD5', '00FFDAB9',
    '00CD853F', '00FFC0CB', '00DDA0DD', '00B0E0E6', '00800080', '00FF0000', 
    '00BC8F8F', '004169E1', '008B4513', '00FA8072', '00FAA460', '002E8B57', 
    '00FFF5EE', '00A0522D', '00C0C0C0', '0087CEEB', '006A5ACD', '00708090',
    '00FFFAFA', '0000FF7F', '004682B4', '00D2B48C', '00008080', '00D8BFD8', 
    '00FF6347', '0040E0D0', '00EE82EE', '00F5DEB3', '00FFFFFF', '00F5F5F5', 
    '00FFFF00', '009ACD32'

Hier können Sie das Programm einfach ändern, um die echte Farbe zu erhalten, die dem obigen Code entspricht. Es stehen noch viele schöne Farben zur Auswahl: 

Supongo que te gusta

Origin blog.csdn.net/BIT_666/article/details/124329787
Recomendado
Clasificación