gibt es eine Möglichkeit die Kopierfunktion von "Excel" bzw. "Libre Office" mittels openpyxl nachzuahmen?
Ich möchte einen gewissen Bereich angeben (z.B. "A1:E5") und diesen samt "border", "alignment", "number_format", "value", "merged_cells", ... Eigenschaften an eine beliebige Stelle (eines anderen Worksheets) kopieren können, wobei die verwendeten Formeln automatisch an die neue Position angepasst werden sollen. Die neuen Formeln sollen dabei auf Zellen innerhalb des Ziel-Worksheets verweisen und nicht auf die alten Zellen in der Vorlage.
Mein Projekt:
Ich lege für jeden Monat ein Workbook an. In diesem Workbook befinden sich Ertragsüberwachungstabellen, welche alle Werktage aufführen.
Da die verwendeten Tabellen sich zwar von Monat zu Monat unterscheiden, aber innerhalb eines Workbooks alle den gleichen Aufbau besitzen, möchte ich eine Vorlage erzeugen und diese in die einzelnen Worksheets hinein kopieren.
Das Kopieren des gesamten Worksheets stellt dabei nicht wirklich eine Lösung dar, weil ich ebenfalls die Position der Tabelle im Ziel-Worksheet angeben möchte.
Mein derzeitiger Code (wobei die Formeln nicht aktualisiert werden):
Code: Alles auswählen
import copy
# Der Tuple "topLeftCell" stellt die angenommene neue Position im Ziel-Worksheet dar. Er ist nullbasiert. (z.B. (0,0) oder (7,3))
# "templateSheet" ist die fertige Vorlage aus welcher kopiert werden soll.
# "worksheet" ist das Ziel-Worksheet
# Erstelle die selben "merged_cells" wie in der Vorlage an neuer Position
for cell_range in templateSheet.merged_cells.ranges:
startCol, startRow, endCol, endRow = cell_range.bounds
worksheet.merge_cells(start_column=topLeftCell[0] + startCol,
start_row=topLeftCell[1] + startRow,
end_column=topLeftCell[0] + endCol,
end_row=topLeftCell[1] + endRow)
colNumber = topLeftCell[0] + 1 # es wird 1 auf addiert, da topLeftCell nullbasiert ist.
rowNumber = topLeftCell[1] + 1 # es wird 1 auf addiert, da topLeftcell nullbasiert ist.
# Kopiere die Eigenschaften der alten Zellen in das Ziel-Worksheet
for row in templateSheet[templateSheet.dimensions]:
tmpCol = colNumber # setzt die Spalte wieder zurück auf den Ursprungswert
for cell in row:
ws_cell = worksheet.cell(column=tmpCol, row=rowNumber)
ws_cell.alignment = copy.copy(cell.alignment)
ws_cell.border = copy.copy(cell.border)
ws_cell.font = copy.copy(cell.font)
ws_cell.number_format = copy.copy(cell.number_format)
ws_cell.value = cell.value
tmpCol += 1 # rücke eine Spalte weiter
rowNumber += 1 # springt in die nächste Zeile
Ich verwende openpyxl Version 2.5.1 (und Python 3.5.2).
Mit freundlichen Grüßen
AFoeee