[PYTHON] Über Probleme und Lösungen von OpenPyXL (Version 3.0)

Einführung

Dieser Artikel ist für Version 3.0.2 oder früher. OpenPyXL wird von Tag zu Tag verbessert, und in Zukunft können möglicherweise die hier beschriebenen Probleme behoben werden.

Über das Problem von OpenPyXL (2.6, 3.0)

Mit OpenPyXL können Sie Excel-Tabellen mit nur Python-Code brutal aus einer brandneuen Arbeitsmappe erstellen. Durch das Erstellen von Grund auf wird das Lesen des Codes jedoch schwieriger und der Code und das Design werden getrennt. Es ist auch für die Wartung von Vorteil, daher halte ich es für eine Standardpraxis, eine Excel-Arbeitsmappe zu lesen, die zum Teil mit OpenPyXL erstellt wurde, und die erforderlichen Daten festzulegen.

OpenPyXL funktioniert jedoch ganz anders als Excel. Daher gibt es einige Dinge, die mit Excel VBA problemlos erledigt werden können, nicht jedoch mit OpenPyXL.

Mit Ausnahme der folgenden Bedingungen ist es häufig schwierig, die Verarbeitung mithilfe der Excel-Arbeitsmappe nur mit dem aktuellen OpenPyXL zu implementieren.

--Diese ohne Bilder oder Formen --Die, für die keine Kopie des Arbeitsblatts erforderlich ist

Warum ist die Verarbeitung mit OpenPyXL schwierig?

In OpenPyXL werden Bild- und Forminformationen beim Öffnen des Buches ignoriert. Wenn OpenPyXL Bilder und Formen verarbeiten soll, müssen Sie es nach dem Öffnen des Buches im OpenPyXL-Prozess festlegen.

--Was Sie benötigen, um das Arbeitsblatt zu kopieren

Die Funktion workbook.copy_worksheet (), die Arbeitsblätter kopiert, verhält sich anders als die von Excel (Worksheets.Copy) und enthält einige Informationen, die nicht kopiert werden, z. B. die bedingte Formatierung. Das Umschreiben des OpenPyXL-Quellcodes kann in gewissem Maße hilfreich sein, kopiert jedoch immer noch nicht so perfekt wie Excel.

OpenPyXL kann zusammengeführte Zellen selbst verarbeiten, es gibt jedoch viele Einschränkungen, z. B. das Zeichnen von Rahmen und das Festlegen von Formaten. (Es ist leicht, Probleme zu verursachen) Bei den von OpenPyXL betriebenen Teilen muss vermieden werden, dass zusammengeführte Zellen so weit wie möglich verwendet werden, indem das Design entworfen wird, oder es muss bestätigt werden, dass der Betrieb von OpenPyXL vor der Verwendung problemlos funktioniert.

worksheet.insert_rows () und worksheet.insert_col (), die Zeilen und Spalten einfügen, sind ** ziemlich ** Verhaltensweisen von Excel (row (). Insert, col (). Insert) Ist anders. Selbst wenn die obige Funktion ausgeführt wird, folgen die Attributinformationen (definierter Name, Format, bedingtes Format), die der Zelle, der zusammengeführten Zelle, den auf der Zelle platzierten Bildinformationen, der Funktionsformel usw. gegeben wurden, nicht der aktuellen Situation Die Version ist ** praktisch nutzlos **. Wenn Sie Zeilen und Spalten am Ende anstatt in der Mitte des Arbeitsblatts hinzufügen (überschreiben), sollte das Problem relativ gering sein.

Lösung für das Problem

OpenPyXL kann eine Excel-Arbeitsmappe (xlsm) mit VBA-Makros verarbeiten, indem dem offenen Argument "keep_vba = True" hinzugefügt wird. Daher ist es möglich, eine schwierige / unmögliche Verarbeitung mit OpenPyXL zu realisieren, indem Excel VBA-Makros eine mit OpenPyXL schwierige Verarbeitung durchführen lassen. (Leider ist dies nicht in einer Umgebung möglich, in der die Ausführung von Excel VBA-Makros aufgrund interner Umstände usw. nicht zulässig ist.)

Wir werden die von OpenPyXL und die Verarbeitung von Excel VBA-Makros durchgeführte Verarbeitung organisieren und die Codeverarbeitung und Einstellungen für Python bzw. Excel VBA durchführen. Sie können beispielsweise ein Arbeitsblatt kopieren und Spalten in der Mitte eines Arbeitsblatts mit dem Excel VBA-Makro hinzufügen / löschen.

Erstellen Sie für die vom Excel VBA-Makro benötigten Daten ein vom Vorlagenarbeitsblatt getrenntes Datenarbeitsblatt und legen Sie die Daten mit OpenPyXL darin fest.

Wenn Sie Bilder verarbeiten müssen, die nur auf der OpenPyXL-Seite erstellt werden können, erstellen Sie auf die gleiche Weise ein Arbeitsblatt für Daten und platzieren Sie die Bilder mit OpenPyXL darauf. Wenn Sie keinen Identifikationsnamen für das von add_image () von OpenPyXL erstellte Bild festlegen können und mehrere Bilder übergeben müssen, können Sie die Bilder unterscheiden, da die Excel VBA-Makroseite die Bilder nicht unterscheiden kann. Es ist auch notwendig, so etwas zu entwickeln.

Beispielbeispiel

Ich denke, es ist schneller, das Beispiel zu sehen, als es auf lange Sicht zu erklären. Die Hauptverarbeitung von Python und Excel VBA umfasst ca. 100 Zeilen. Zum Ausführen des Beispiels benötigt Python das OpenPyXL-Paket sowie das Pillow-Paket zum Bearbeiten von Bildern. (Wenn ein Fehler auftritt, installieren Sie das Paket gegebenenfalls.)

Beispiel für einen Veröffentlichungsort

Es ist auf Github verfügbar (https://github.com/umazular/openpyxl).

Ich habe bei bestätigt. (Ich versuche nicht so sehr wie möglich von der Umgebung abhängig zu sein)

Das Beispiel wurde erstellt, indem die Ausgabe der Quittung vorgestellt wurde. Lesen Sie eine oder mehrere CSV-Empfangsdaten + Bilder und geben Sie das Ergebnis in Excel aus. Im Beispiel werden CSV-Dateien und Bilder für 2 Blätter im Voraus erstellt. Die Standard-CSV-Datei des Beispiels ist Shift-JIS. Ersetzen Sie sie daher entsprechend Ihrer Umgebung durch UTF-8.

Ich habe versucht, das Vorlagenberichtsblatt ("Quittung") festzulegen, das mit OpenPyXL schwierig erscheint.

Excel VBA kann durch Auswahl von "Entwicklung" -> "Visual Basic" aus dem Excel-Menü geöffnet werden. Wenn die Registerkarte "Entwicklung" nicht angezeigt wird, öffnen Sie den Excel-Optionsbildschirm mit Datei-> Optionen und aktivieren Sie "Entwicklung" auf der Hauptregisterkarte der Benutzereinstellungen in der Multifunktionsleiste, um sie anzuzeigen.

So führen Sie das Beispiel aus

Durch Ausführen des Python-Programms wird eine Excel-Arbeitsmappe (sampleoutput.xlsm) mit dem Datensatz generiert.

$ ls *.xlsm
sample.xlsm
$ python sample.py
$ ls *.xlsm
sample.xlsm  sampleoutput.xlsm
$

Wenn Sie die Excel-Arbeitsmappe für die Ausgabe in einer Umgebung öffnen, in der die Ausführung von Makros zulässig ist, wird die Makroverarbeitung für die Dateneinstellung nur zum ersten Mal ausgeführt und das Ergebnis erstellt.

Referenzmaterialien usw.

Recommended Posts

Über Probleme und Lösungen von OpenPyXL (Version 3.0)
Über Probleme und Lösungen von OpenPyXL (Version 3.0)
Das Problem der Lügner und der Ehrlichkeit
Das Problem der Lügner und der Ehrlichkeit
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
Informationen zur virtuellen Umgebung von Python Version 3.7
Vergleich von Lösungen bei Gewichtsanpassungsproblemen
Über _ und __
Über die linke und rechte Rechtfertigung von Kivy Label
Über das Verhalten von copy, deepcopy und numpy.copy
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Über flache und tiefe Kopien von Python / Ruby
"Lineare Regression" und "Probabilistische Version der linearen Regression" in Python "Bayes lineare Regression"
Über Importfehler von numpy und scipy in anaconda
Denken Sie an das Rack und WSGI der nächsten Generation
Persönliche Hinweise zur Integration von vscode und anaconda
[Python] Kapitel 01-02 Über Python (Ausführung und Installation der Entwicklungsumgebung)
Versionsverwaltung von Node, Ruby und Python mit anyenv